前回の続き。
というわけでDICTプロトコルは全く役に立たないことがわかったので、日本語対応のオンライン辞書を探してみます。
ググると一杯出てきますな。
とりあえず「辞書 API」で真っ先に出てきたイースト辞書Webサービスを試してみることにします。
http://www.btonic.com/ws/index.html
イースト辞書Webサービスはイースト株式会社が作成している辞書Webサービスのテストサイトという位置づけのようです。
http://www.est.co.jp/
とりあえず簡単なほうのRESTで。
http://www.btonic.com/ws/NetDicv09RestSpec.htm
見ての通りHTTPリクエストを投げるだけという簡単設定。
これに限らず専用のプロトコルを使用するよりHTTPのほうが遙かにメジャーで簡単なので、専用プロトコルは今後どんどん滅びていくものと思われます。
もちろんセキュリティが必要だったり高度に専門性が必要だったりといった特別なものは別ですが。
作成方針としては、まず検索メソッドで該当語句の含まれる記事の一覧を取得し、その中から該当の記事のIDを探し出し内容取得メソッドで内容を取得する、という順番になります。
dict_east.class.php
ソースは本文長すぎとか意味不明なことを言われたので ファイルにしてあります。
Dict_East_Search::currentはforeachで配列を返す部分を実装しています。
ItemIDのままだとオブジェクトを返してしまい、asXMLだと現在地点である<ItemID>等のタグまでくっついてきてしまうので(string)で無理矢理文字列にしています。
Dict_East::searchメソッドは単純にsimplexml_load_string()でパースしています。
こちらは返り値の各項は値なので単純にsimplexml_load_stringを適用して問題ありません。
ところがDict_East::requestメソッドは返り値が以下のようにHTMLタグ込みで返ってきます。
<Head> <div class="NetDicHead" xml:space="preserve" xmlns=""> <span class="NetDicHeadTitle">山口人生</span> </div> </Head> |
この場合、XMLパース関数はどれも癖があり、単純に<Head>タグ内の値だけを全取得したいだけという場合のパースが困難です。
simplexml_load_string()やxml_parse_into_struct()を使用するとHTMLタグ単位で全てオブジェクトや配列に分解されてしまい、えらいことになってしまいます。
DOMDocumentクラスのgetElementsByTagNameあたりを使用するとHTMLタグが全て削除されてしまいます。
XMLReaderは一行毎に読み込んでは処理するという形式のため実装が面倒になってやめました。
結局自力でのパースは諦め、simplexml_load_string()後にxpathでノードを指定してasXMLでXMLだということにして返すようにしました。
このときにまたネームスペースが存在する場合は単純指定では取得できないとか一悶着あったが、最終的にはどうにか成功しました。
使用する場合は簡単にこんなふうに使います。
dict_east.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//インスタンス
require_once('./dict_east.class.php');
$dicteast=new Dict_East();
$ret=array();
$dicteast_search_array=array();
//オプション設定
//$dicteast->setDictionary('EJdict');
//$dicteast->setSearchScope('ANYWHERE','EXACT');
//検索メソッド
$dicteast_search=$dicteast->search('愛');
$count=$dicteast_search->getCount();
foreach($dicteast_search as $val){
$dicteast_search_array[]=$val;
}
//取得メソッド
$ret=$dicteast->get($dicteast_search_array[0]['itemID']);
print("<pre>");var_dump($dicteast_search_array,$ret);die();
|
まあこんなかんじでネット辞書検索APIのクライアントを作成することが出来ました。
後は適当にフロントを実装すれば簡単に単語翻訳なんかを作成することができます。