PHPで形態素解析を行う(gooラボ版)

(1/1)
PHPで形態素解析を行う」では、Yahoo!JAPANの「日本語形態素解析Webサービス」を利用したが、今回は、「gooラボ 形態素解析API」を利用した形態素解析を行ってみる。

サーバサイドで利用できる形態素解析は、「PHPとKAKASIを使って単語に分解する」で紹介した「KAKASI」や、「ChaSen」、「MeCab」が有名であるが、サーバに負荷がかかる処理である。この「日本語形態素解析Webサービス」は処理速度も速く、サーバの負荷分散という意味では有用なWebAPIだ。

(2021年9月23日)PHP8対応,リファラ・チェック改良,https対応

サンプル・プログラムの実行例

PHPで形態素解析を行う(gooラボ版)

目次

サンプル・プログラム

圧縮ファイルの内容
GooParse.phpサンプル・プログラム本体。

「gooラボ 形態素解析API」による形態素解析

gooラボ 形態素解析API」は、入力パラメータ(IN)として POST を、出力結果(OUT)が JSON で戻るというAPIである。
WebAPIのURL
URL
https://labs.goo.ne.jp/api/morph

入力パラメータ
フィールド名 要否 内  容
app_id 必須 gooラボのアプリケーションID。無料で入手できる。
sentence 必須 解析する日本語テキスト。読点までの1文。UTF-8エンコード。
request_id 任意 リクエストID。
省略時は”labs.goo.ne.jp[タブ文字]リクエスト受付時刻[タブ文字]連番”となる。
info_filter 任意 形態素情報フィルタ。form(表記)、pos(形態素)、read(読み)のうち、出力する情報を文字列で指定する。
複数指定する場合は、”|”で区切って複数記載する。
省略時は”form|pos|read”を指定したものとみなす。
>pos_filter 任意 形態素品詞フィルタ出力対象とする品詞を”|”で区切って指定する。
省略時は全形態素を出力する。
応答データ構造(json) request_id リクエストID info_filter 形態素情報フィルタ pos_filter 形態素品詞フィルタ word_list 形態素リスト

解説:準備

  38: //gooラボ アプリケーションID
  39: //https://labs.goo.ne.jp/apiregister/ にて登録のこと.
  40: define('GOOLABS_APPLICATION_ID', '******************************');

gooラボ 形態素解析API]」を利用するためには、アプリケーションIDを取得する必要がある。その入手方法は「gooラボ - WebAPIの登録方法」を参照されたい。
取得したIDは定数 GOOLABS_APPLICATION_ID に格納すること。

解説:パラメータ渡し

 163: /**
 164:  * POST渡しを行う
 165:  * @param   string $url リクエストURL
 166:  * @param   array  $data POST変数を格納した連想配列("変数名"=>"値") 
 167:  * @return  string 取得したコンテンツ/FALSE 取得エラー
 168: */
 169: function post($url, $data = array()) {
 170:     if (!ini_get('allow_url_fopen')) throw new Exception("Not Allowed URL Open!");
 171:     $stream = stream_context_create(array('http' => array(
 172:         'method' => 'POST',
 173:         'header' => 'Content-type: application/x-www-form-urlencoded',
 174:         'content'   => http_build_query($data),
 175:     )));
 176: 
 177:     return @file_get_contents($url, false, $stream);
 178: }

WebAPIにパラメータをPOST渡しするため、ユーザー関数 post を用意した。

解説:パラメータ受け

 138: /**
 139:  * 指定したパラメータを取り出す
 140:  * @param   string $key  パラメータ名(省略不可)
 141:  * @param   bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
 142:  * @param   mixed  $def  初期値(省略時:空文字)
 143:  * @return  string パラメータ/NULL=パラメータ無し
 144: */
 145: function getParam($key, $auto=TRUE, $def='') {
 146:     if (isset($_GET[$key]))         $param = $_GET[$key];
 147:     else if (isset($_POST[$key]))   $param = $_POST[$key];
 148:     else                            $param = $def;
 149:     if ($auto)  $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
 150:     return $param;
 151: }

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

解説:解析と並べ替え

 180: /**
 181:  * 「gooラボ 形態素解析API」を用いてテキストを解析する
 182:  * @param   string $sentence 解析するテキスト(1文;UTF-8)
 183:  * @param   array  $items    解析結果を格納する配列
 184:  * @return  array(形態素数, メッセージ, APIのURL)
 185: */
 186: function getParse($sentence, &$items) {
 187:     //WebAPIにパラメータをPOST渡しする
 188:     $url = GOOLABS_PARSE_URL;
 189:     $post = array(
 190:         'app_id'    => GOOLABS_APPLICATION_ID,
 191:         'sentence'  => $sentence
 192:     );
 193:     $cnt = 0;
 194:     $message = '';
 195: 
 196:     //バージョンチェック
 197:     if (isphp5over() == FALSE) {
 198:         $message = 'PHP4以下では動作しない';
 199:     } else {
 200:         //API呼び出し
 201:         $json = post($url, $post);
 202:         if ($json == FALSE) {
 203:             $message = 'WebAPIが停止';
 204:         } else {
 205:             $obj = json_decode($json);
 206:             foreach ($obj->word_list[0as $key=>$val) {
 207:                 $surface = $val[0];
 208:                 if (isset($items[$surface]['count'])) {
 209:                     $items[$surface]['count']++;
 210:                 } else {
 211:                     $items[$surface]['count']   = 1;
 212:                     $items[$surface]['pos']     = $val[1];
 213:                     $items[$surface]['reading'] = $val[2];
 214:                 }
 215:             }
 216:         }
 217:     }
 218: 
 219:     return array($cnt, $message, $url);
 220: }

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

参考サイト

(この項おわり)
header