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 形態素リスト

解説:準備

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

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

解説:パラメータ渡し

0163: /**
0164:  * POST渡しを行う
0165:  * @param   string $urlリクエストURL
0166:  * @param   array  $data POST変数を格納した連想配列("変数名"=>"値") 
0167:  * @return  string取得したコンテンツ/FALSE取得エラー
0168: */
0169: function post($url$data = array()) {
0170:     if (!ini_get('allow_url_fopen')) throw new Exception("Not Allowed URL Open!");
0171:     $stream = stream_context_create(array('http' => array(
0172:         'method' => 'POST',
0173:         'header' => 'Content-type: application/x-www-form-urlencoded',
0174:         'content'   => http_build_query($data),
0175:     )));
0176: 
0177:     return @file_get_contents($urlfalse$stream);
0178: }

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

解説:パラメータ受け

0138: /**
0139:  * 指定したパラメータを取り出す
0140:  * @param   string $key  パラメータ名(省略不可)
0141:  * @param   bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0142:  * @param   mixed  $def  初期値(省略時:空文字)
0143:  * @return  stringパラメータ/NULL=パラメータ無し
0144: */
0145: function getParam($key$auto=TRUE$def='') {
0146:     if (isset($_GET[$key]))         $param = $_GET[$key];
0147:     else if (isset($_POST[$key]))   $param = $_POST[$key];
0148:     else                            $param = $def;
0149:     if ($auto)  $param = mb_convert_encoding($paramINTERNAL_ENCODING, 'auto');
0150:     return $param;
0151: }

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

解説:解析と並べ替え

0180: /**
0181:  * 「gooラボ 形態素解析API」を用いてテキストを解析する
0182:  * @param   string $sentence 解析するテキスト(1文;UTF-8)
0183:  * @param   array  $items    解析結果を格納する配列
0184:  * @return  array(形態素数, メッセージ, APIのURL)
0185: */
0186: function getParse($sentence, &$items) {
0187:     //WebAPIにパラメータをPOST渡しする
0188:     $url = GOOLABS_PARSE_URL;
0189:     $post = array(
0190:         'app_id'    => GOOLABS_APPLICATION_ID,
0191:         'sentence'  => $sentence
0192:     );
0193:     $cnt = 0;
0194:     $message = '';
0195: 
0196:     //バージョンチェック
0197:     if (isphp5over() == FALSE) {
0198:         $message = 'PHP4以下では動作しない';
0199:     } else {
0200:         //API呼び出し
0201:         $json = post($url$post);
0202:         if ($json == FALSE) {
0203:             $message = 'WebAPIが停止';
0204:         } else {
0205:             $obj = json_decode($json);
0206:             foreach ($obj->word_list[0] as $key=>$val) {
0207:                 $surface = $val[0];
0208:                 if (isset($items[$surface]['count'])) {
0209:                     $items[$surface]['count']++;
0210:                 } else {
0211:                     $items[$surface]['count']   = 1;
0212:                     $items[$surface]['pos']     = $val[1];
0213:                     $items[$surface]['reading'] = $val[2];
0214:                 }
0215:             }
0216:         }
0217:     }
0218: 
0219:     return array($cnt$message$url);
0220: }

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

参考サイト

(この項おわり)
header