PHPで形態素解析を行う

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

(2023年3月18日)日本語形態素解析v2に対応

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

Yahoo!JAPAN 日本語形態素解析

目次

サンプル・プログラム

圧縮ファイルの内容
YahooParse.phpサンプル・プログラム本体。
YahooParse.php 更新履歴
バージョン 更新日 内容
2.3.0 2023/03/18 日本語形態素解析v2に対応
2.2 2021/10/02 PHP8対応,リファラ・チェック改良,https対応
2.1 2017/04/30 PHP7対応
2.0 2014/07/26 大幅改訂
1.2 2011/01/01 Yahoo!カテゴリのWebAPIドメイン変更に対応

「Yahoo!JAPAN 日本語形態素解析」による形態素解析

日本語形態素解析」は、入力パラメータをPOSTで渡し、応答がJSON形式で戻るというAPIである。
WebAPIのURL
URL
https://jlp.yahooapis.jp/MAService/V2/parse

入力パラメータ
フィールド名 要否 内  容
id 必須 JSON-RPC 2.0のid。値は任意で、指定した値がレスポンスのidに返る。
jsonrpc 必須 "2.0" 固定。
method 必須 "jlp.maservice.parse" 固定。
params q 必須 解析対象のテキスト。UTF-8エンコード。
応答データ構造(json) id id jsonrpc 2.0 result tokens _0 形態素の表記 _1 形態素の読みがな _2 形態素の基本形表記 _3 形態素の品詞 _4 形態素の品詞細分類 _5 形態素の活用型 _6 形態素の活用形 tokens _0 形態素の表記 _1 形態素の読みがな _2 形態素の基本形表記 _3 形態素の品詞 _4 形態素の品詞細分類 _5 形態素の活用型 _6 形態素の活用形

解説:準備

  37: //表示幅(ピクセル)
  38: define('WIDTH', 600);
  39: 
  40: //Yahoo! JAPAN Webサービス アプリケーションID【各自で設定】
  41: //取得方法:https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
  42: define('YAHOO_APPLICATION_ID', '************************************');
  43: 
  44: //リクエストURL【変更不可】
  45: define('YAHOO_MAService_URL', 'https://jlp.yahooapis.jp/MAService/V2/parse');
  46: 
  47: //解析テキスト(初期値)
  48: define('DEF_SOUR', "Yahoo!JAPANの「日本語形態素解析」は、日本語文を形態素に分割し、品詞、読みがななどの情報を取得できるWebAPIである。\nサーバサイドで利用できる形態素解析は、「PHPとKAKASIを使って単語に分解する」で紹介した「KAKASI」や、「ChaSen」、「MeCab」が有名であるが、サーバに負荷がかかる処理である。この「日本語形態素解析」は処理速度も速く、サーバの負荷分散という意味では有用なWebAPIだ。");

日本語形態素解析」を利用するためには、Yahoo! JAPAN Webサービス アプリケーションID を取得する必要がある。その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を参照されたい。
取得したIDは定数 YAHOO_APPLICATION_ID に格納する。

解説:日本語形態素解析

 165: /**
 166:  * 「Yahoo 日本語形態素解析」を用いてテキストを解析する.
 167:  * @param   string $sentence 解析するテキスト
 168:  * @param   array  $items    解析結果を格納する配列
 169:  * @return  
 170: */
 171: function getParse($sentence, &$items) {
 172:     //WebAPIにパラメータをPOST渡しする
 173:     $url = YAHOO_MAService_URL;
 174:     $post = array(
 175:         'id'       => '1234-1',                     //ダミー
 176:         'jsonrpc'  => '2.0',                        //固定値
 177:         'method'   => 'jlp.maservice.parse',        //固定値
 178:         'params'   => array(
 179:             'q' => (string)$sentence                //対象テキスト
 180:         )
 181:     );
 182:     $json = json_encode($post);
 183: 
 184:     //WebAPIにパラメータをPOST渡しする
 185:     $stream = stream_context_create(array('http' => array(
 186:         'header'  => "Content-Type: application/json\r\n" .
 187:                     "User-Agent: Yahoo AppID: " . YAHOO_APPLICATION_ID . "\r\n",
 188:         'method'  => 'POST',
 189:         'content' => $json,
 190:     )));
 191: 
 192:     //WebAPIリクエスト
 193:     $res = file_get_contents($url, FALSE, $stream);
 194: 
 195:     if ($res == FALSE) {
 196:         $this->error  = TRUE;
 197:         $this->errmsg = 'WebAPI error: ' . $url;
 198:         return FALSE;
 199:     }
 200: 
 201:     //応答を配列へ代入する.
 202:     $results = json_decode($res);
 203:     //エラー処理
 204:     if (isset($results->error)) {
 205:         $this->error  = TRUE;
 206:         $this->errmsg = 'WebAPI error: ' . $results->error->message;
 207:     }
 208: 
 209:     //応答データを処理する.
 210:     foreach ($results->result->tokens as $token) {
 211:         $key = (string)$token[0];                           //形態素
 212:         //初めて登場する形態素を登録する.
 213:         if (! isset($items[$key])) {
 214:             $items[$key]['reading'] = (string)$token[1];    //読みがな
 215:             $items[$key]['pos']     = (string)$token[3];    //品詞
 216:             $items[$key]['count']   = 1;                    //出現回数
 217:         //2回目以降は出現回数をインクリメントする.
 218:         } else {
 219:             $items[$key]['count']++;
 220:         }
 221:     }
 222: 
 223:     return TRUE;
 224: }

解析を実行するのはユーザー関数 getParse である。
組み込み関数  stream_context_create  を用いてパラメータをPOST渡しし、 file_get_contents  でリクエストし、レスポンスを  json_decode  でデコードする。
解析された単語は配列変数 $items に格納する。このとき、同じ形態素は出現回数をカウントし、要素 'count' に格納する。

参考サイト

(この項おわり)
header