読者です 読者をやめる 読者になる 読者になる

子供の夏休みの宿題を手伝うお父さんお母さんのためのGemを作った

全国のお父さん、お母さんエンジニアの皆様お待たせしました。

事の始まり

なんか弊社CTOが困っていた

事情はよくわからないが、恐らく子供の宿題を手伝うやなんやかやで、子供が書いたっぽい文章にしたいがために感じ漢字をよろしくしたいのであろう。 我々はエンジニアだ。無いのであれば作ればいいのである(キリッ

というわけで作った

github.com

特定の学年の小学生が習っていない漢字をひらがなに変換するGem、名づけて「Furiganize」。オプションに学年を指定することができる。要YahooAppId。
なお僕に子供はいないのでドッグフーディングはしておらず使い勝手のほどは知らない。

使い方

$ gem install furiganize を実行後、

$ furiganize -a [YOUR_YAHOO_APP_ID] -g 3 '小学三年生が書いたこの文章は魑魅魍魎' # => 小学三年生が書いたこのぶんしょうはちみもうりょう

とするだけで子供が習っていない漢字をひらがなに変換してくれる。学年は -g に指定すべし。
無駄にSTDINからも読めるようにしておいた。

$ echo '小学三年生が書いたこの文章は魑魅魍魎' | furiganize -a [YOUR_YAHOO_APP_ID] -g 3 # => 小学三年生が書いたこのぶんしょうはちみもうりょう

技術解説

解説といってもなんのことはなく、Yahooのルビ振りAPIを叩いているだけである。

developer.yahoo.co.jp

当初は学年ごとに習う漢字の辞書とMeCabなどの形態素解析を組み合わせて作ろうとしたが、調べている内にドンピシャなサービスがあったので楽した。
リンク先のサンプルレスポンスの通り、習っていない漢字には Furigana 、習っている漢字には Surface のみが返ってくるのでそれらを連結しただけである。
レスポンスはXML形式なので nokoigiri を使った。具体的な箇所のみを抜き出せば

doc = Nokogiri::XML(open("http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=#{@app_id}&grade=#{@grade}&sentence=#{URI.encode(@sentence)}"))
doc.css("Word").map {|w| w.at_css("Furigana") || w.at_css("Surface") }.map(&:text).join

としているだけ。