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

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

(2022年1月29日)日本語係り受け解析V2対応,PHP8対応,リファラ・チェック改良

目次

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

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

サンプル・プログラム

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

日本語係り受け解析

日本語係り受け解析」は、入力パラメータとして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など

  14: // 初期化処理 ================================================================
  15: define('INTERNAL_ENCODING', 'UTF-8');
  16: mb_internal_encoding(INTERNAL_ENCODING);
  17: mb_regex_encoding(INTERNAL_ENCODING);
  18: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
  19: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php06/php06-47-01.shtm');
  20: define('TITLE', '日本文の要約もどき');
  21: define('REQUEST_KAKARIUKE_URL', 'https://jlp.yahooapis.jp/DAService/V2/parse');
  22: 
  23: //リファラチェック+リリースフラグの設定
  24: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
  25:     define('FLAG_RELEASE', FALSE);
  26:     define('REFER_ON', '');
  27:     ini_set('display_errors', 1);
  28:     ini_set('error_reporting', E_ALL);
  29: else {
  30:     //リリース・フラグ(公開時にはTRUEにすること)
  31:     define('FLAG_RELEASE', TRUE);
  32:     //リファラ・チェック(直リン防止用;空文字ならチェックしない)
  33:     define('REFER_ON', 'www.pahoo.org');
  34: }
  35: 
  36: //表示幅(ピクセル)
  37: define('WIDTH', 600);
  38: 
  39: //Yahoo! JAPAN Webサービス アプリケーションID
  40: //取得方法 https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
  41: define('APPLICATION_ID', '**************************************');
  42: 
  43: //入力テキスト(初期値)
  44: define('SAMPLE_TEXT', '犬吠埼灯台は、1874年に英国人リチャード・ヘンリー・ブラントンの設計により建築された、れんが造りの灯台で、日本で24番目に点灯された。高さは31.57メートルあり、99段のらせん階段を昇った眺望は、太平洋の孤島に身をおいた錯覚を覚えるほど雄大である。');

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

解説:テキストの分解

 250: /**
 251:  * 複数文要約インターフェース
 252:  * @param   string $sentence 要約するテキスト
 253:  * @return  string 要約もどき
 254: */
 255: function pseudodigest($sentence) {
 256:     $arr = mb_split("[。.]", $sentence);
 257:     $pseudodigest = '';
 258:     foreach ($arr as $str) {
 259:         if ($str == ''continue;
 260:         if (($res = pseudodigest_sub($str . '。')) == FALSE)    return FALSE;
 261:         $pseudodigest .$res;
 262:     }
 263: 
 264:     return $pseudodigest;
 265: }

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

解説:要約もどき

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

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

参考サイト

(この項おわり)
header