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

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

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

目次

実行例

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

サンプル・プログラム

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

準備:各種初期値

0037: //A3RT APIキー
0038: //https://a3rt.recruit.co.jp/product/TextSummarizationAPI/registered/ にて登録のこと.
0039: define('APIKEY_A3RT', '********************************');
0040: 
0041: //初期値
0042: //API呼び出しURL
0043: define('REQUEST_TEXT_SUMMARY', 'https://api.a3rt.recruit.co.jp/text_summarization/v1');
0044: //表示幅(ピクセル)
0045: define('WIDTH',  600);
0046: //入力テキスト
0047: 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渡し

0189: /**
0190:  * データをPOST渡し
0191:  * @param   string $urlリクエストURL
0192:  * @param   array  $data POST変数を格納した連想配列("変数名"=>"値") 
0193:  * @return  string取得したコンテンツ/FALSE取得エラー
0194: */
0195: function post($url$data) {
0196:     //cURL送信
0197:     $curl = curl_init();
0198:     curl_setopt($curlCURLOPT_URL , $url);
0199:     curl_setopt($curlCURLOPT_HEADER, 1) ; 
0200:     curl_setopt($curlCURLOPT_POSTTRUE);
0201:     curl_setopt($curlCURLOPT_RETURNTRANSFERTRUE);    //結果を文字列で
0202:     curl_setopt($curlCURLOPT_POSTFIELDShttp_build_query($data));
0203:     curl_setopt($curlCURLOPT_SSL_VERIFYPEERFALSE);
0204:     curl_setopt($curlCURLOPT_SSL_VERIFYHOSTFALSE);
0205:     curl_setopt($curlCURLOPT_RETURNTRANSFERTRUE);
0206:     curl_setopt($curlCURLOPT_TIMEOUT, 5);
0207:     $res1 = @curl_exec($curl);
0208:     $res2 = @curl_getinfo($curl);
0209:     curl_close($curl);
0210: 
0211:     //結果処理
0212:     if ($res1 != FALSE) {
0213:         $json = substr($res1$res2['header_size']);
0214:     } else {
0215:         $json = FALSE;
0216:     }
0217: 
0218:     return $json;
0219: }

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

解説:テキスト要約

0221: /**
0222:  * 「A3RT」を用いてテキストを要約する
0223:  * @param   string $sentence 要約するテキスト
0224:  * @param   string $errmsg   エラーメッセージ格納用
0225:  * @return  string 要約結果/FALSE:要約失敗
0226: */
0227: function text_summary($sentence, &$errmsg) {
0228:     //抽出文章数は入力文章数の3分の1
0229:     $count = mb_substr_count($sentence, '');
0230:     $count = round($count / 3);
0231:     if ($count < 1)     $count = 1;
0232: 
0233:     //WebAPIにパラメータをPOST渡しする
0234:     $url = REQUEST_TEXT_SUMMARY;
0235:     $post = array(
0236:         'apikey'        => APIKEY_A3RT,
0237:         'sentences'     => $sentence,
0238:         'linenumber'    => $count,
0239:         'separation'    => ''
0240:     );
0241: 
0242:     //要約
0243:     $res = $errmsg = '';
0244:     $json = @post($url$post);
0245:     $items = json_decode($json);
0246: 
0247:     //エラーチェック
0248:     if ($items == FALSE) {
0249:         $res = FALSE;
0250:         $errmsg = 'WebAPIが停止';
0251:     } else if (isset($items->status)) {
0252:         if (($items->status == 0) && (isset($items->summary[0]))) {
0253:             foreach ($items->summary as $ss) {
0254:                 $res .= (string)$ss . '';
0255:             }
0256:         } else {
0257:             $res = FALSE;
0258:             $errmsg = (string)$items->message;
0259:         }
0260:     }
0261: 
0262:     return $res;
0263: }

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

参考サイト

(この項おわり)
header