search
LoginSignup
77
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

yahooのルビ振りAPIは思っていたより面白い

動機

前回はdocomoの形態素解析apiを使ってみる。
ルビ振りAPIのパラメータを見てみたら面白い項目があったので試してみたいと思います。

yahooのルビ振りAPI

入力されたテキストに対してルビをつけて返してくれます。

パラメータについて

今回少し変わってると感じたのは、gradeパラメータです。
小学校何年生までの漢字にルビをつけるか、という粒度で設定ができます。
もし、gradeで3を設定すると、1~2年生で習う漢字にふりがなをつけず、
それ以上の難しさの漢字にのみルビをつけてくれます。

1: 小学1年生向け。漢字(注2)にふりがなを付けます。
2: 小学2年生向け。1年生で習う漢字にはふりがなを付けません。
3: 小学3年生向け。1~2年生で習う漢字にはふりがを付けません。
4: 小学4年生向け。1~3年生で習う漢字にはふりがなを付けません。
5: 小学5年生向け。1~4年生で習う漢字にはふりがなを付けません。
6: 小学6年生向け。1~5年生で習う漢字にはふりがなを付けません。
7: 中学生以上向け。小学校で習う漢字にはふりがなを付けません。
8: 一般向け。常用漢字にはふりがなを付けません。
(https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html を引用)

ソースコード

import requests
import xml.etree.ElementTree as ET

target_url = "https://jlp.yahooapis.jp/FuriganaService/V1/furigana"
api_key= "ID"

sentence = "今日は学校で国語の勉強をしました"

data = {
    "appid":api_key,
    "grade":"1",
    "sentence":sentence
}

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

root = ET.fromstring(response.text)

for line in root:
    for word_list in line[0]:
        if len(word_list) == 1:
            print(word_list[0].text, end="")
        else:
            print(word_list[1].text, end="")

結果

grade=1でのルビ振りAPIの結果

入力文 私は、山田太郎です。今日は学校で図画工作の授業で、初めての写生をしました
出力文 わたしは、やまだたろうです。きょうはがっこうでずがこうさくのじゅぎょうで、はじめてのしゃせいをしました

grade=3でのルビ振りAPIの結果

入力文 私は、山田太郎です。今日は学校で図画工作の授業で、初めての写生をしました
出力文 わたしは、山田たろうです。きょうは学校で図画工作のじゅぎょうで、はじめてのしゃせいをしました

grade=8でのルビ振りAPIの結果

入力文 私は、山田太郎です。今日は学校で図画工作の授業で、初めての写生をしました
出力文 わたしは、山田太郎です。きょうは学校で図画工作の授業で、初めての写生をしました

おまけ

ルビを実際につけたくなったのでやってみます。
きれいなやり方はわからなかったので力業💪でやりました。
ルビが返ってきてるものは、rubyタグをつけるというものです。

ソースコード

import requests
import xml.etree.ElementTree as ET

target_url = "https://jlp.yahooapis.jp/FuriganaService/V1/furigana"
api_key= "ID"

sentence = "今日は学校で国語の勉強をしました"

data = {
    "appid":api_key,
    "grade":"1",
    "sentence":sentence
}

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

root = ET.fromstring(response.text)

ruby_dict = {}
text = []
for line in root:
    for word_list in line[0]:
        if len(word_list) == 1:
            text.append(word_list[0].text)
        else:
            text.append(word_list[0].text)
            ruby_dict[word_list[0].text] = word_list[1].text

for word in text:
    if word in list(ruby_dict.keys()):
        print("<ruby>{}<rp>".format(word), end="")
        print("(</rp><rt>{}</rt><rp>)</rp></ruby>".format(ruby_dict[word]), end="")        
    else:
        print(word, end="")

出力

<ruby>私<rp>(</rp><rt>わたし</rt><rp>)</rp></ruby>は、山田<ruby>太郎<rp>(</rp><rt>たろう</rt><rp>)</rp></ruby>です。<ruby>今日<rp>(</rp><rt>きょう</rt><rp>)</rp></ruby>は学校で図画工作の<ruby>授業<rp>(</rp><rt>じゅぎょう</rt><rp>)</rp></ruby>で、<ruby>初めて<rp>(</rp><rt>はじめて</rt><rp>)</rp></ruby>の<ruby>写生<rp>(</rp><rt>しゃせい</rt><rp>)</rp></ruby>をしました

htmlでの出力

わたしは、山田太郎たろうです。今日きょうは学校で図画工作の授業じゅぎょうで、初めてはじめて写生しゃせいをしました

まとめ

漢字の難易度ごとに分けてルビをつけれるのは面白いですね。
最初はカラオケの歌詞みたいにルビをつけるのを想像しましたが、授業でのプリントとかに、適切なルビ振りがすぐにできるのかもしれません。
ホームページでのルビの対応も簡単ですね。

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
77
Help us understand the problem. What are the problem?