PHPで形態素解析を行う

(1/1)
Yahoo!JAPAN の「日本語形態素解析 Web サービス」は、日本語文を形態素に分割し、品詞、読みがなの付与、統計情報を取得できる WebAPI である。
サーバサイドで利用できる形態素解析は、「PHP と KAKASI を使って単語に分解する」で紹介した「KAKASI」や、「ChaSen」、「MeCab」が有名であるが、サーバに負荷がかかる処理である。この「日本語形態素解析 Web サービス」は処理速度も速く、サーバの負荷分散という意味では有用な WebAPI だ。
Yahoo!JAPAN 日本語形態素解析Webサービス

サンプル・プログラム

「Yahoo!JAPAN 日本語形態素解析Webサービス」による形態素解析

日本語形態素解析 Web サービス」は、入力パラメータ(IN)として GET、POST の 2種類の方式を、出力結果(OUT)が XML で戻るという API である。
入力パラメータは翻訳したいテキストであるので、GET 渡しでは長くなりすぎてしまう。そこで、POST 渡しを使うことにする。

2008 年(平成 20 年)8 月 12 日、Yahoo!検索プロジェクトが Yahoo!デベロッパーネットワークで提供している WebAPI のドメインが、yahoo.co.jp から yahooapis.jp に変更されましたことに伴い、プログラムを修正した。⇒(Yahoo!検索、Yahoo!カテゴリの WebAPI ドメイン変更のお知らせ
マッシュアップを行う場合、このように突然、WebAPI が変更されることがあるので注意が必要だ。
WebAPIのURL
URL
http://jlp.yahooapis.jp/MAService/V1/parse

入力パラメータ
項目名 フィールド名 内  容
アプリケーションID appid string Yahoo! DEVELOPER NETWORKのアプリケーションID。無料で入手できる。
解析対象テキスト sentence string 解析する日本語テキスト。UTF-8エンコード。
解析結果の種類 results string "ma": 形態素解析の結果を ma_result に返す。
"uniq": 出現頻度情報を uniq_result に返す。
両方指定する場合は "ma,uniq"。
応答データ構造(xml) ResultSet ma_result total_count 形態素の総数 filtered_count フィルタにマッチした形態素数 word_list word surface 形態素の表記 reading 形態素の読みがな pos 形態素の品詞 baseform 形態素の基本形表記(活用のない形態素の場合は省略) uniq_result total_count 形態素の総数 filtered_count フィルタにマッチした形態素数 word_list word surface 形態素の表記 reading 形態素の読みがな pos 形態素の品詞 count 形態素の出現数

解説:準備

0026: //Yahoo! JAPAN Webサービス アプリケーションID
0027: //http://help.yahoo.co.jp/help/jp/developer/developer-06.html にて登録のこと.
0028: define('APPLICATION_ID', '*************************************');

Yahoo! ウェブ検索Web サービス」を利用するためには、アプリケーション ID を取得する必要がある。http://help.yahoo.co.jp/help/jp/developer/developer-06.html から無料で取得できる。
取得した ID は定数 $ApplicationID に格納すること。

サンプル・プログラムの解説:パラメータ渡し

0220: function getParse($sentence, &$items) {
0221:     //WebAPIにパラメータをPOST渡しする
0222:     $url = REQ_URL;
0223:     $sentence = urlencode($sentence);
0224:     $post = array(
0225:         'appid'       => APPLICATION_ID,
0226:         'results'     => 'ma,uniq',
0227:         'uniq_filter' => '9|10',
0228:         'sentence'    => $sentence
0229:     );
0230: 

WebAPI にパラメータを POST 渡しするため、ユーザー関数 http を用意している。
http関数については、「PHP で住所から緯度経度を求める」で紹介しているものとほぼ同じである。

サンプル・プログラムの解説:パラメータ受け

0092: /**
0093:  * 指定したパラメータを取り出す
0094:  * @param string $key  パラメータ名(省略不可)
0095:  * @param bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0096:  * @param mixed  $def  初期値(省略時:空文字)
0097:  * @return string パラメータ/NULL=パラメータ無し
0098: */
0099: function getParam($key$auto=TRUE$def='') {
0100:     if (isset($_GET[$key]))     $param = $_GET[$key];
0101:     else if (isset($_POST[$key]))   $param = $_POST[$key];
0102:     else                            $param = $def;
0103:     if ($auto)  $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
0104:     return $param;
0105: }

一方、このスクリプト自身もパラメータを受け取る必要があるので、ユーザー関数 getParam を定義し、GET/POST いずれの方法でもパラメータを受け取れるようにしている。

サンプル・プログラムの解説:解析と並べ替え

0270:         //出現頻度の結果
0271:         foreach ($ResultSet->uniq_result->word_list->word as $val) {
0272:             $surface = (string)$val->surface;
0273:             $items[$surface]['count']   = (int)$val->count;
0274:         }

解析を実行するのはユーザー関数 getParse である。
解析された単語は配列変数 $response に格納し、出現頻度の多い順に並べ替える。なお、配列変数 $response は多次元連想配列なので、並べ替えには関数  uasort  を利用した。

サンプル・プログラムの解説:型キャスト

0272:             $surface = (string)$val->surface;

SimpleXML 関数の要素は、見た目は文字列だが、内部的には object 型である。このため、string 型でなければならない連想配列の添字として代入することができない。そこで、型キャストを行う必要がある。

参考サイト

(この項おわり)
header