PHPでキーフレーズを取り出す

(1/1)
PHPでワードクラウドをつくる」では形態素解析を用いてワードクラウドをつくったが、今回はYahoo!デベロッパーネットワークの「キーフレーズ抽出(V2)」を用い、キーフレーズからワードクラウドをつくるプログラムをPHPで作ってみることにする。

(2021年10月2日)現行WebAPIが2022年1月末に終了することからキーフレーズ抽出(V2)に変更,PHP8対応,その他。

目次

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

PHPでキーフレーズを取り出す

サンプル・プログラム

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

キーフレーズ抽出

キーフレーズ抽出(V2)」は、入力パラメータとしてJSON文字列をPOSTで、User-Agentに Yahoo! JAPAN Webサービス アプリケーションID を指定し、出力結果がJSONで戻るというWebAPIである。
WebAPIのURL
URL
https://jlp.yahooapis.jp/KeyphraseService/V2/extract

入力パラメータ
フィールド名 要否 内  容
id 必須 JSON-RPC 2.0のid。値は任意で、指定した値がレスポンスのidに返る。
jsonrpc 必須 "2.0" 固定。
method 必須 "jlp.keyphraseservice.extract" 固定。
params q 必須 解析対象のテキスト。UTF-8エンコード。
応答データ構造(json) id id jsonrpc 2.0 result phrases score キーフレーズの重要度(整数) text キーフレーズ(文字列) phrases score キーフレーズの重要度(整数) text キーフレーズ(文字列)

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

  15: // 初期化処理 ================================================================
  16: define('INTERNAL_ENCODING', 'UTF-8');
  17: mb_internal_encoding(INTERNAL_ENCODING);
  18: mb_regex_encoding(INTERNAL_ENCODING);
  19: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
  20: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php06/php06-34-01.shtm');
  21: 
  22: //プログラム・タイトル
  23: define('TITLE', 'キーフレーズを取り出す');
  24: 
  25: //リファラチェック+リリースフラグの設定
  26: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
  27:     define('FLAG_RELEASE', FALSE);
  28:     define('REFER_ON', '');
  29:     ini_set('display_errors', 1);
  30:     ini_set('error_reporting', E_ALL);
  31: else {
  32:     //リリース・フラグ(公開時にはTRUEにすること)
  33:     define('FLAG_RELEASE', TRUE);
  34:     //リファラ・チェック(直リン防止用;空文字ならチェックしない)
  35:     define('REFER_ON', 'www.pahoo.org');
  36: }
  37: 
  38: //表示幅(ピクセル)
  39: define('WIDTH', 600);
  40: 
  41: //Yahoo! JAPAN Webサービス アプリケーションID【各自で設定】
  42: //取得方法:https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
  43: define('YAHOO_APPLICATION_ID', '*************************************');
  44: 
  45: //Yahoo!JAPAN キーフレーズ抽出(V2)【変更不可】
  46: define('YAHOO_KEYPHRASE_URL', 'https://jlp.yahooapis.jp/KeyphraseService/V2/extract');
  47: 
  48: //リンク先の検索対象ドメイン名
  49: define('SEARCH_DOMAIN', 'pahoo.org');
  50: 
  51: //サンプル・テキスト
  52: define('SAMPLE_TEXT', "1000年(長保2年)2月25日、藤原道長の長女、藤原彰子が第66代・一条天皇の中宮(皇后)となる。\n女房として、「源氏物語」の作者である紫式部や、歌人・和泉式部をしたがえ、朝廷に華麗な文芸サロンを形成した。\nまた、これより少し前、中宮定子の女房として、「枕草子」の作者とされる清少納言が仕えており、この頃、国文学が盛んになった。");

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

解説:キーフレーズを取り出す

 195: /**
 196:  * 「Yahoo!JAPAN キーフレーズ抽出」を用いてキーフレーズを取り出す
 197:  * @param   string $sentence 解析するテキスト
 198:  * @param   array  $items    解析結果を格納する配列
 199:  * @return  bool TRUE:成功/FALSE:失敗
 200: */
 201: function getKeyphrase($sentence, &$items) {
 202:     $url = YAHOO_KEYPHRASE_URL;
 203:     $post = array(
 204:         'id'       => '1234-1',                         //ダミー
 205:         'jsonrpc'  => '2.0',                            //固定値
 206:         'method'   => 'jlp.keyphraseservice.extract',   //固定値
 207:         'params'   => array(
 208:             'q' => (string)$sentence                    //対象テキスト
 209:         )
 210:     );
 211:     $json = json_encode($post);
 212: 
 213:     //WebAPIにパラメータをPOST渡しする
 214:     $stream = stream_context_create(array('http' => array(
 215:         'header'  => "Content-Type: application/json\r\n" .
 216:                     "User-Agent: Yahoo AppID: " . YAHOO_APPLICATION_ID . "\r\n",
 217:         'method'  => 'POST',
 218:         'content' => $json,
 219:     )));
 220: 
 221:     //WebAPIリクエスト
 222:     $res = @file_get_contents($url, FALSE, $stream);
 223: 
 224:     if ($res == FALSE) {
 225:         $this->error  = TRUE;
 226:         $this->errmsg = 'WebAPI error: ' . $url;
 227:         return FALSE;
 228:     }
 229: 
 230:     //応答を配列へ代入
 231:     $results = json_decode($res);
 232:     if (! isset($results->result->phrases))     return FALSE;
 233:     $cnt = 0;
 234:     foreach ($results->result->phrases as $phrase) {
 235:         if (isset($phrase->score&& isset($phrase->text)) {
 236:             $items[(string)$phrase->text] = (int)$phrase->score;
 237:             $cnt++;
 238:         }
 239:     }
 240: 
 241:     return ($cnt > 0? TRUE : FALSE;
 242: }

WebAPIを呼び出して結果を受け取るのはユーザー関数 getKeyphrase である。結果は配列変数 $items に格納する。

WebAPIに渡すパラメータは  json_encode  関数によってJSON文字列にエンコードする。
User-Agentとして Yahoo! JAPAN Webサービス アプリケーションID を渡すために、 stream_context_create  関数を使ってストリームコンテキストを用意し、 file_get_contents  関数を使って応答JSON文を取得する。

応答JSON文は  json_decode  関数を使って連想配列にデコードし、配列 $items へ格納していく。

解説:ワードクラウドの作成

 255: /**
 256:  * ワードクラウドを作成する
 257:  * @param   array  $items 情報を格納した配列
 258:  * @return  string ワードクラウド(HTML)
 259: */
 260: function makeWordCloud($items) {
 261:     $width  = WIDTH;
 262:     $outstr = '';
 263:     $n = 0;
 264: 
 265:     foreach ($items as $keyphrase=>$score) {
 266:         $n++;
 267:         $fsize = $score * 1.7 + 80;
 268:         $link = get_link($keyphrase);
 269:         if ($n > 1)     $outstr ." \n";
 270: $outstr .=<<< EOT
 271: <span style="font-size:{$fsize}%; color:blue;">
 272: <a href={$link}>{$keyphrase}</a>
 273: </span>
 274: 
 275: EOT;
 276:     }
 277:     return $outstr;
 278: }

ワードクラウドを作成する処理は、「PHPでワードクラウドをつくる」で使った表示ルーチン"getWordCloud" とほぼ同じである。

「キーフレーズの重要度」が100以下の数値であるので、フォントの大きさの計算式を変更している。

参考サイト

(この項おわり)
header