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

# 動機
前回は[docomoの形態素解析apiを使ってみる。](https://qiita.com/rubberduck/items/5c70bc8f25f3099fad79)
ルビ振り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 を引用)

## ソースコード
```python
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タグをつけるというものです。

## ソースコード

```python
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での出力
<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>をしました

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

# 参考文献
- [Markdownでルビをふる](https://step-learn.com/markdown/20141011-ruby.html)