PHPでテキストの要約を行う

(1/1)
リクルートが提供する無償のWebAPI「Text Summarization API - A3RT」を利用し、PHPを使ってテキストの要約を行うプログラムを作ってみる。

(2022年2月12日)リクエストURL変更,抽出文章数を設定,PHP8対応,リファラ・チェック改良

目次

実行例

PHPでテキストの要約を行う

サンプル・プログラム

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

準備:各種初期値

textsummary.php

  37: //A3RT APIキー
  38: //https://a3rt.recruit.co.jp/product/TextSummarizationAPI/registered/ にて登録のこと.
  39: define('APIKEY_A3RT', '********************************');
  40: 
  41: //初期値
  42: //API呼び出しURL
  43: define('REQUEST_TEXT_SUMMARY', 'https://api.a3rt.recruit.co.jp/text_summarization/v1');
  44: //表示幅(ピクセル)
  45: define('WIDTH',  600);
  46: //入力テキスト
  47: define('SAMPLE_TEXT','テヘラン南のクムで、シーア派12イマーム派の家に生まれたハサン・サッバーフは、数学・天文学・宗教学を修め、1072年、イスマーイール派の信徒となった。1078年、ファーティマ朝の宮廷に入り、研究活動を行った。その後、イランで布教活動を行い、1090年には、イラン高原のアラムート城砦を攻略して活動拠点とした。ハサンは山の長老と呼ばれることになる。1094年、ファーティマ朝第8代カリフ、アル=ムスタンスィル・ビッラーの死後、カリフの後継者問題で廃嫡となったニザールを支持し、ニザール派としてアラムートに独立政権を打ち立てた。城塞を攻略したり要人を暗殺することでセルジューク朝に対抗し、のちに暗殺教団(アサシン)と呼ばれるようになる。');

Text Summarization API - A3RT」を利用するには、事前に APIキー を入手する必要がある。API発行から、メールアドレスを登録するだけで APIキー が入手できる。
取得した APIキー は、定数 APIKEY_A3RT に格納する。

その他の定数は自由に変更可能である。

A3RT:Text Summarization API

Text Summarization API - A3RT」は、入力パラメータ(IN)としてデータをPOSTで渡し、出力結果(OUT)が JSONで戻るというAPIである。
WebAPIのURL
URL
https://api.a3rt.recruit.co.jp/text_summarization/v1

入力パラメータ
フィールド名 要否 内  容
apikey 必須 APIキー
入手手順は前述の通り。無料。
sentences 必須 要約する文章
UTF-8エンコード
linenumber 任意 抽出文章数
1以上の整数で、入力した文章数より少ない数。
デフォルトは1
separation 任意 文章の切れ目文字
UTF-8エンコード
デフォルトは”。”
※要約できる1文の最大文字数は200文字、かつ最大文章数は10。
応答データ構造(json) status 処理ステータス message メッセージ message 要約結果を格納した配列

解説:データをPOST渡し

textsummary.php

 189: /**
 190:  * データをPOST渡し
 191:  * @param   string $url リクエストURL
 192:  * @param   array  $data POST変数を格納した連想配列("変数名"=>"値") 
 193:  * @return  string 取得したコンテンツ/FALSE 取得エラー
 194: */
 195: function post($url, $data) {
 196:     //cURL送信
 197:     $curl = curl_init();
 198:     curl_setopt($curl, CURLOPT_URL , $url);
 199:     curl_setopt($curl, CURLOPT_HEADER, 1) ; 
 200:     curl_setopt($curl, CURLOPT_POST, TRUE);
 201:     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);   //結果を文字列で
 202:     curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
 203:     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 204:     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 205:     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
 206:     curl_setopt($curl, CURLOPT_TIMEOUT, 5);
 207:     $res1 = @curl_exec($curl);
 208:     $res2 = @curl_getinfo($curl);
 209:     curl_close($curl);
 210: 
 211:     //結果処理
 212:     if ($res1 !FALSE) {
 213:         $json = substr($res1, $res2['header_size']);
 214:     } else {
 215:         $json = FALSE;
 216:     }
 217: 
 218:     return $json;
 219: }

WebAPIへデータをPOST渡すために、ユーザー関数 post を用意した。
cURL関数群と、 http_build_query  を利用することで実現している。
WebAPIからの応答結果を、JSONテキストでリターンする。

解説:テキスト要約

textsummary.php

 221: /**
 222:  * 「A3RT」を用いてテキストを要約する
 223:  * @param   string $sentence 要約するテキスト
 224:  * @param   string $errmsg   エラーメッセージ格納用
 225:  * @return  string 要約結果/FALSE:要約失敗
 226: */
 227: function text_summary($sentence, &$errmsg) {
 228:     //抽出文章数は入力文章数の3分の1
 229:     $count = mb_substr_count($sentence, '。');
 230:     $count = round($count / 3);
 231:     if ($count < 1)      $count = 1;
 232: 
 233:     //WebAPIにパラメータをPOST渡しする
 234:     $url = REQUEST_TEXT_SUMMARY;
 235:     $post = array(
 236:         'apikey'        => APIKEY_A3RT,
 237:         'sentences'     => $sentence,
 238:         'linenumber'    => $count,
 239:         'separation'    => '。'
 240:     );
 241: 
 242:     //要約
 243:     $res = $errmsg = '';
 244:     $json = @post($url, $post);
 245:     $items = json_decode($json);
 246: 
 247:     //エラーチェック
 248:     if ($items == FALSE) {
 249:         $res = FALSE;
 250:         $errmsg = 'WebAPIが停止';
 251:     } else if (isset($items->status)) {
 252:         if (($items->status == 0&& (isset($items->summary[0]))) {
 253:             foreach ($items->summary as $ss) {
 254:                 $res .= (string)$ss . '。';
 255:             }
 256:         } else {
 257:             $res = FALSE;
 258:             $errmsg = (string)$items->message;
 259:         }
 260:     }
 261: 
 262:     return $res;
 263: }

ユーザー関数 text_summary はWebAPIを呼び出し、テキストを要約する。
抽出文章数は、入力文章数の3分の1になるようにした。

参考サイト

(この項おわり)
header