- 更新日: 2014年5月28日
- Ruby
Yahooテキスト解析のルビ振りAPIをRubyから使う
日本語の文字列に Ruby で Ruby 振りしますよー・・・。利用したのは、Yahoo テキスト解析のルビ振りAPI。
テキスト解析:ルビ振りAPI – Yahoo!デベロッパーネットワーク
当初、KAKASI – 漢字→かな(ローマ字)変換プログラム というライブラリを使っていたのですが、Yahoo API も良さそうだったので併用することにして試してみました。
Yahooルビ振りAPIを使うRubyコード
XML 解析に Nokogiri ライブラリを使います。YAHOO_API_ID は取得したご自分のものに変更して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
require "open-uri" require "nokogiri" YAHOO_API_ID = "***" def put_ruby_on(word) return "" if word.size >= 1000 enc_word = URI.encode(word) url = "http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=#{YAHOO_API_ID}&sentence=#{enc_word}" doc = Nokogiri::HTML(open(url)) hiragana = doc.xpath('//word/furigana').map{|i| i.text}.join rescue nil roman = doc.xpath('//word/roman').map{|i| i.text}.join(' ') rescue nil return [ hiragana, roman ] end |
Yahooルビ振りAPIのXML仕様
Yahoo ルビ振り API はご親切に、形態素解析して分解した品詞ごとにふりがなデータを XML で返してくれます。なので、単純に日本語の文字列を投げれば、自動でふりがなが返ってくるわけではありません。
//word/furigana, //word/roman というノードに、各々分解された品詞に対応する、ひらがな・ローマ字のふりがなが含まれています。ローマ字でふりがなを付ける時は、形態素解析のおかげでスペースで分けられるので読みやすいです。
以上の点を考慮して書いたのが上記の Ruby コードです。ひらがなとローマ字のふりがなを配列のペアで返します。以下 pry での実験。
1 2 3 4 |
pry(main)> put_ruby_on("ひらがなとローマ字のふりがなを配列で返します") => ["ひらがなとろーまじのふりがなをはいれつでかえします", "hiragana to ro-mazi no hurigana wo hairetu de kaesi masu"] |
おお!良い感じに、ひらがなとローマ字で各々ふりがなが返ってきました。
1 2 3 4 |
pry(main)> put_ruby_on("今日は、とてもよい天気です。また明日!") => ["きょうはとてもよいてんきですまたあした", "kyou ha totemo yoi tenki desu mata asita"] |
句読点、エクスクラメーションなど記号では、//word/furigana, //word/roman は返ってきません。
1 2 3 4 |
pry(main)> put_ruby_on("Rubyかわいいよ") => ["かわいいよ", "kawaii yo"] |
アルファベットも、//word/furigana, //word/roman は返ってきません。
以上ですが、とりあえず日本語の文字列に、ひらがな・ローマ字でルビ振りするには十分ですね。
- – 参考リンク –
- Nokogiri
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!