PHPで形態素解析を行う

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

(2025年9月6日).pahooEnv導入

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

Yahoo!JAPAN 日本語形態素解析

目次

サンプル・プログラム

圧縮ファイルの内容
YahooParse.phpサンプル・プログラム本体。
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
YahooParse.php 更新履歴
バージョン 更新日 内容
2.4.0 2025/09/06 .pahooEnv導入
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 大幅改訂
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:各種定数など

YahooParse.php

  54: // 各種定数(START) ===========================================================
  55: 
  56: // 表示幅(ピクセル)
  57: define('WIDTH', 600);
  58: 
  59: // Yahoo! JAPAN Webサービス アプリケーションID【各自で設定】
  60: // 取得方法:https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
  61: if (isset($_ENV['PAHOO_YAHOO_APPLICATION_ID'])) {
  62:     define('YAHOO_APPLICATION_ID', $_ENV['PAHOO_YAHOO_APPLICATION_ID']);
  63: else {
  64:     define('YAHOO_APPLICATION_ID', '');
  65: }
  66: 
  67: // リクエストURL【変更不可】
  68: define('YAHOO_MAService_URL', 'https://jlp.yahooapis.jp/MAService/V2/parse');
  69: 
  70: // 解析テキスト(初期値)
  71: define('DEF_SOUR', "Yahoo!JAPANの「日本語形態素解析」は、日本語文を形態素に分割し、品詞、読みがななどの情報を取得できるWebAPIである。\nサーバサイドで利用できる形態素解析は、「PHPとKAKASIを使って単語に分解する」で紹介した「KAKASI」や、「ChaSen」、「MeCab」が有名であるが、サーバに負荷がかかる処理である。この「日本語形態素解析」は処理速度も速く、サーバの負荷分散という意味では有用なWebAPIだ。");
  72: 
  73: // 各種定数(END) ===============================================================

各種パラメータは定数を define している。とくに変更不可の記載のないものは、自由に変更してかまわない。

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

「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 形態素の活用形

解説:準備

YahooParse.php

  56: // 表示幅(ピクセル)
  57: define('WIDTH', 600);
  58: 
  59: // Yahoo! JAPAN Webサービス アプリケーションID【各自で設定】
  60: // 取得方法:https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
  61: if (isset($_ENV['PAHOO_YAHOO_APPLICATION_ID'])) {
  62:     define('YAHOO_APPLICATION_ID', $_ENV['PAHOO_YAHOO_APPLICATION_ID']);
  63: else {
  64:     define('YAHOO_APPLICATION_ID', '');
  65: }
  66: 
  67: // リクエストURL【変更不可】
  68: define('YAHOO_MAService_URL', 'https://jlp.yahooapis.jp/MAService/V2/parse');
  69: 
  70: // 解析テキスト(初期値)
  71: define('DEF_SOUR', "Yahoo!JAPANの「日本語形態素解析」は、日本語文を形態素に分割し、品詞、読みがななどの情報を取得できるWebAPIである。\nサーバサイドで利用できる形態素解析は、「PHPとKAKASIを使って単語に分解する」で紹介した「KAKASI」や、「ChaSen」、「MeCab」が有名であるが、サーバに負荷がかかる処理である。この「日本語形態素解析」は処理速度も速く、サーバの負荷分散という意味では有用なWebAPIだ。");

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

解説:日本語形態素解析

YahooParse.php

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

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

参考サイト

(この項おわり)
header