是非に及ばず

プログラミングに関する話題などを書いていきます(主にRailsやAndroidアプリ開発について)

Rubyで任意のテキストにふりがなを付ける(Yahooのテキスト解析/ルビ振りを利用する)

概要

ここでは、RubyYahooデベロッパーネットワーク/テキスト解析>ルビ振りAPIを利用して任意の文字列にふりがなを付ける方法を示す。
やる事は非常に単純で以下の3ステップだけなので、非常にお手軽である。

  1. APIにアクセスするためのリクエストURLを作成
  2. Net::HTTPを使ってURLにアクセスし、XMLを取得(UTF-8で返ってくる)
  3. NokogiriでXMLをパースし、ふりがなの部分を取得する

環境

Ruby 1.8.7
Nokogiri 1.4.4
CentOS 5.x
スクリプト、コンソールともにUTF-8を前提とする

準備

  • nokogiriが入っていなければ、gem install nokogiriでインストールする
$ sudo gem install nokogiri

そこから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 東京都千代田区日本橋
とうきょうとちよだくにほんばし