Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

動機

前回は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での出力

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

まとめ

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

参考文献

rubberduck
自然言語処理したり、機械学習したり、APIを叩いたりしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away