2009年9月17日木曜日

[Rails][WebAPI] ActiveResourceでYahoo!API (1) [日本語形態素解析]

Yahoo! Web API の調査のため、ActiveResourceで使ってみた。

↓テキスト解析API 日本語形態素解析 サンプル
http://yahooapi-petit-sample.heroku.com/ma_service/words/analyze

API仕様の調査が目的なので、素直に、APIが提供している機能をWEBページから実行できるようにしただけのサンプル。

ActiveResourceでWeb APIにアクセスする方法は、こちらのサイト
ActiveResource の使い方(後編) : 一般の Web API にアクセスする
のコードを参考に・・・というより、コピペして使わせて頂いた。
いつもお世話になります。

APIにアクセスするActiveResourceクラスは以下。

app/model/ma_service/word.rb

class MaService::Word < ActiveResource::Base

class Format
def extension() '' end
def mime_type() 'application/xml' end
def encode(hash, options = {}) hash.to_xml(options) end
def decode(xml)
data = Hash.from_xml(xml)
if data['ResultSet']['ma_result']
data = Hash.from_xml(xml)['ResultSet']['ma_result']['word_list']['word']
elsif data['ResultSet']['uniq_result']
data = Hash.from_xml(xml)['ResultSet']['uniq_result']['word_list']['word']
end
data.is_a?(Hash) && data.keys.size == 1 ? data.values.first : data
end
end

self.site = 'http://jlp.yahooapis.jp'
self.format = Format.new

class << self
def collection_path(prefix_options = {}, query_options = nil)
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
"/MAService/V1/parse#{query_string(query_options)}"
end
end

end


ポイントになるのはもちろん、
  1. リクエストURIのビルド
  2. レスポンスのActiveResourceへのマップ(要はXML to Hash変換)

の2点。

1.については、WordクラスのコレクションURIがそのままAPIへのリクエストURIとなるようにcollection_pathをカスタマイズしている。

2.を実装するのが、Formatクラスのdecode(xml)メソッドになる。xmlパーサを書く必要はなく、Hash.from_xml(xml)メソッドへパース処理を委譲すればよい。レスポンスのword要素(繰り返し項目)がこのWordクラスに相当する。パース処理の後、階層を辿ってword要素(というよりHashなのでword'キー'?)を見つけ出す。

Yahoo! API はリクエスト受付けにGETとPOSTの両方を提供しているが、データ取得にPOSTを使用するのはRESTに反するため、このサンプルではGETリクエストのみを使用する(つまり、ActiveResource::find())。GETリクエストの場合、当然ながら解析対象テキストの長さはURIの最大長までという制限がつく。こればっかりは諦めるしかない。

Wordクラス(ActiveResource)は、コントローラ内でこう使う。:paramsにリクエストパラメータを与える。ActiveRecordeのfindメソッドに:conditionを与えるようなもの。
@result_set << MaService::Word.find(:all, :params=>req_params)

0 件のコメント:

コメントを投稿