yahoo web APIのルビ振り使ってみた

こんにちは、がじゅまるです

今日はyahoo web APIのルビ振りを使ってみたいと思います

developer.yahoo.co.jp

漢字かな交じり文に、ひらがなとローマ字のふりがな(ルビ)が返ってくるAPIです。

このAPIを使ってPythonで簡単なスクリプトを書いていきます。

Yahooのディベロッパーでアプリケーションを登録

Yahoo!JAPANのアプリケーションを登録します。登録にはYahooのIDが必要です。

アプリケーション登録画面ではWeb APIを利用する場所としてサーバーサイドとクライアントサイドが選べます。 f:id:gajumaru_eng:20201123120124p:plain 今回使うルビ振りはどちらでも使えるのでクライアントサイドを選びます。

アプリケーションの基本情報 などを入力していくと登録できます。今回は簡単なスクリプトを書くだけなので、特に基本情報の登録はデフォルトのままで大丈夫です

登録すると、アプリケーションの情報が見れるようになります。

そこにClient IDがあるのでそのIDを使ってスクリプトを書いていきます。

Pythonスクリプト実装

ルビ振りではふりがなを付ける対象のテキスト(sentence)と学年(grade)、 yahooのアプリケーション登録したClient ID(appid)がリクエストパラメータとしてあります。

gradeは小学校何年生までの漢字にルビをつけるかといったものとなっています。

def build_yahoo_furigana_data(sentence: str, grade: int = 1) -> Dict[str, str]:
    validate_grade(grade) # 対応しているgradeかどうかをチェック

    return {
        "appid": YAHOO_APP_ID, #ClientIDをここに
        "grade": grade,
        "sentence": sentence
    }

yahoo furigana serviceにPOSTする際の形式に合わせた関数。

それを使ってpythonのrequestsとxmltodictを使っていきます。 APIの返り値がxmlになっているのでそれをdictに変換するパッケージとしてxmltodictを使います。

https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html

def make_furigana(sentence: str, grade: int) -> str:
    target_url = "https://jlp.yahooapis.jp/FuriganaService/V1/furigana"
    data = build_yahoo_furigana_data(sentence, grade)

    response = requests.post(target_url, data=data)

    parsed_xml = xmltodict.parse(response.text)

    words = list(parsed_xml['ResultSet']['Result']['WordList'].values())[0]

    output_sentence = []
    for word in words:
        if word.get("Furigana", ""):
            output_sentence.append(word["Furigana"])
        else:
            output_sentence.append(word["Surface"])

    return "".join(output_sentence)

やっていることとしてはAPIのresponseに対してdictに変換します。

そこから必要なWordListの値をlistにして、ふりがなのwordをoutputに連結させていきます。

そのoutputのlistを文字列として連結させることで、ふりがなを振った文字列が完成します。

def main(args):
    # sentence = "今日は猛暑日だ"
    sentence = args.sentence
    grade = args.grade

    output = make_furigana(sentence, grade)

    print(f"input:   {sentence}")
    print(f"output:  {output}")


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--sentence', '-s', required=True)
    parser.add_argument('--grade', '-g', type=int, default=1)

    args = parser.parse_args()
    main(args)

後は、argparseを使って引数を渡せるようにすれば、完成です。 適当にnewsから取ってきた一文をふりがなに変換させてみます

結果

$ python furigana_service/furigana.py -s 米大統領選で当選を確実にした民主党のジョー・バイデン前副大統領
input:   米大統領選で当選を確実にした民主党のジョー・バイデン前副大統領
output:  べいだいとうりょうせんでとうせんをかくじつにしたみんしゅとうのジョー・バイデンぜんふくだいとうりょう