PHPで日本文の“要約もどき”を行う

(1/1)
日本文の要約を自動的に行うことは、なかなか難しい。
今回は、Yahoo!JAPANの「https://developer.yahoo.co.jp/webapi/jlp/da/v2/parse.html:title=日本語係り受け解析]」を利用し、ベースとなる述語と、それを修飾する文節を取り出すことで、“要約もどき”を行ってみることにする。

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

目次

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

PHPで日本文の要約もどきを行う

サンプル・プログラム

圧縮ファイルの内容
pseudodigest.phpサンプル・プログラム本体。
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pseudodigest.php 更新履歴
バージョン 更新日 内容
2.1.0 2025/09/15 .pahooEnv導入
2.0 2022/01/29 日本語係り受け解析V2対応,PHP8対応,リファラ・チェック改良
1.1 2017/03/25 PHP7対応
1.0 2014/06/14 初版
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)の登録方法」をご覧いただきたい。

日本語係り受け解析

日本語係り受け解析」は、入力パラメータとしてJSON文字列をPOSTで、User-Agentに Yahoo! JAPAN Webサービス アプリケーションID を指定し、出力結果がJSONで戻るというWebAPIである。
WebAPIのURL
URL
https://jlp.yahooapis.jp/DAService/V2/parse

入力パラメータ
フィールド名 要否 内  容
id 必須 JSON-RPC 2.0のid。値は任意で、指定した値がレスポンスのidに返る。
jsonrpc 必須 "2.0" 固定。
method 必須 "jlp.daservice.parse" 固定。
params q 必須 解析対象のテキスト。解析可能な単位は1文のみ。
応答データ構造(json) id id jsonrpc 2.0 result chunks head 修飾する文節の番号。修飾先がなければ -1 id 文節の番号 tokens _0 形態素の表記 _1 形態素の読みがな _2 形態素の基本形表記 _3 形態素の品詞 _4 形態素の品詞細分類 _5 形態素の活用型 _6 形態素の活用形 chunks head 修飾する文節の番号。修飾先がなければ -1 id 文節の番号 tokens _0 形態素の表記 _1 形態素の読みがな _2 形態素の基本形表記 _3 形態素の品詞 _4 形態素の品詞細分類 _5 形態素の活用型 _6 形態素の活用形

準備:アプリケーションIDなど

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) ===============================================================

Yahoo!JAPANのWebAPI「日本語形態素解析」を利用するため、Yahoo! JAPAN Webサービス アプリケーションID を取得する必要がある。その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を参照されたい。
取得したIDは、ファイル [.pahooEnv] または本プログラムの定数 APPLICATION_ID に格納する。
その他、変更不可と記載のない定数は任意に変更して構わない。

解説:テキストの分解

pseudodigest.php

 235: /**
 236:  * 複数文要約インターフェース
 237:  * @param   string $sentence 要約するテキスト
 238:  * @return  string 要約もどき
 239: */
 240: function pseudodigest($sentence) {
 241:     $arr = mb_split("[。.]", $sentence);
 242:     $pseudodigest = '';
 243:     foreach ($arr as $str) {
 244:         if ($str == ''continue;
 245:         if (($res = pseudodigest_sub($str . '。')) == FALSE)    return FALSE;
 246:         $pseudodigest .$res;
 247:     }
 248: 
 249:     return $pseudodigest;
 250: }

日本語係り受け解析は、一度の呼び出しで1文しか解析できないため、入力されたテキストを句点で分解する。

解説:要約もどき

pseudodigest.php

 171: /**
 172:  * 「Yahoo!JAPAN 日本語係り受け解析」を用いて日本文を要約する
 173:  * @param   string $sentence 要約するテキスト(1文)
 174:  * @return  string 要約もどき/FALSE:WebAPIエラー
 175: */
 176: function pseudodigest_sub($sentence) {
 177: // WebAPIにパラメータをPOST渡しする
 178:     $url = REQUEST_KAKARIUKE_URL;
 179:     $post = array(
 180:         'id'       => '1234-1',                 // ダミー
 181:         'jsonrpc'  => '2.0',                    // 固定値
 182:         'method'   => 'jlp.daservice.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:     if ($res == FALSE)  return FALSE;
 200: 
 201:     // 応答を配列へ代入
 202:     $results = json_decode($res);
 203:     if (! isset($results->result->chunks))  return FALSE;
 204:     $cnt = 0;
 205:     foreach ($results->result->chunks as $chunk) {
 206:         $head = isset($chunk->head? (int)$chunk->head : (-1);
 207:         $id   = isset($chunk->id)   ? (int)$chunk->id   : (-1);
 208:         $phrase = '';
 209:         foreach ($chunk->tokens as $token) {
 210:             $phrase .= (string)$token[0];
 211:         }
 212:         $items[$id]['head']   = $head;
 213:         $items[$id]['phrase'] = $phrase;
 214:     }
 215: 
 216:     // 要約
 217:     $base = '';
 218:     foreach ($items as $id=>$item) {
 219:         if ($item['head'< 0) {
 220:             $base = $item['phrase'];
 221:             break;
 222:         }
 223:     }
 224:     $pseudodigest = '';
 225:     foreach ($items as $item) {
 226:         if ($item['head'] == $id) {
 227:             $pseudodigest = $pseudodigest . $item['phrase'];
 228:         }
 229:     }
 230:     $pseudodigest .$base;
 231: 
 232:     return $pseudodigest;
 233: }

要約を行うのはユーザー関数 pseudodigest_sub である。
前半で日本語係り受け解析を呼び出し、文節番号をキーに、修飾番号と表記を配列 $items に格納する。

後半が要約もどきの処理である。
修飾番号が無い(-1 が格納されている)文節がベースとなる述語である。これを探しだし、それを修飾している文節を並べる。

参考サイト

(この項おわり)
header