Rubyで任意のテキストにふりがなを付ける(Yahooのテキスト解析/ルビ振りを利用する)
概要
ここでは、RubyとYahooデベロッパーネットワーク/テキスト解析>ルビ振りAPIを利用して任意の文字列にふりがなを付ける方法を示す。
やる事は非常に単純で以下の3ステップだけなので、非常にお手軽である。
環境
Ruby 1.8.7
Nokogiri 1.4.4
CentOS 5.x
スクリプト、コンソールともにUTF-8を前提とする
準備
- nokogiriが入っていなければ、gem install nokogiriでインストールする
$ sudo gem install nokogiri
- Yahooデベロッパーネットワーク/テキスト解析>ルビ振りAPIのページにアプリケーションIDの登録のリンクがあるので、
そこからYahooアカウントでログインして登録し、アプリケーションIDを取得する。
なお、今回のサンプルは自分のIDをそのまま載せているので、Yahooに登録しなくても動作させる事が出来る
サンプル
yahoo_api.rb
require 'jcode' require 'rubygems' require 'nokogiri' require 'net/http' require 'cgi' module YahooApi APP_ID = "6acb699c6333bdb1fd5e189899359935" # アプリケーションID # テキスト解析/ルビ振りAPI # http://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html class Furigana BASE_URL = "http://jlp.yahooapis.jp/FuriganaService/V1/furigana" # 指定したテキストのふりがなを返す # # YahooApi::Furigana.new.parse("東京") # => "とうきょう" def parse(text, opts={}) url = get_request_url(text, opts) response = nil 3.times { response = get_response(url) if response.kind_of?(Net::HTTPOK) break end sleep 0.5 } return nil unless response doc = Nokogiri::XML.parse(response.body, nil, "UTF-8") return doc.search("Furigana").text end def get_request_url(text, opts={}) params = { "appid" => APP_ID, "sentence" => text, "grade" => opts[:grade] } tmp = [] params.keys.sort.each do |key| next if params[key].nil? tmp << "#{key}=#{CGI.escape(params[key])}" end query = tmp.join('&') return "#{BASE_URL}?#{query}" end def get_response(request_url) begin headers = { 'User-Agent' => 'Ruby/WebClient' } uri = URI.parse(request_url) client = Net::HTTP.new(uri.host, uri.port) client.open_timeout = 1 client.read_timeout = 2 client.start{|http| response = http.get(uri.request_uri, headers) return response } rescue Exception => e end return nil end end # end of Furigana end
furigana.rb
#!/opt/ruby/bin/ruby -Ku require 'yahoo_api' if ARGV.size == 0 puts "Usage: #{$0} {text}" exit 1 end puts YahooApi::Furigana.new.parse(ARGV[0])
実行方法
$ chmod +x furigana.rb $ ./furigana.rb 東京都千代田区日本橋 とうきょうとちよだくにほんばし