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など

0015: // 初期化処理 ================================================================
0016: define('INTERNAL_ENCODING', 'UTF-8');
0017: mb_internal_encoding(INTERNAL_ENCODING);
0018: mb_regex_encoding(INTERNAL_ENCODING);
0019: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
0020: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php06/php06-34-01.shtm');
0021: 
0022: //プログラム・タイトル
0023: define('TITLE', 'キーフレーズを取り出す');
0024: 
0025: //リファラチェック+リリースフラグの設定
0026: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
0027:     define('FLAG_RELEASE', FALSE);
0028:     define('REFER_ON', '');
0029:     ini_set('display_errors', 1);
0030:     ini_set('error_reporting', E_ALL);
0031: else {
0032:     //リリース・フラグ(公開時にはTRUEにすること)
0033:     define('FLAG_RELEASE', TRUE);
0034:     //リファラ・チェック(直リン防止用;空文字ならチェックしない)
0035:     define('REFER_ON', 'www.pahoo.org');
0036: }
0037: 
0038: //表示幅(ピクセル)
0039: define('WIDTH', 600);
0040: 
0041: //Yahoo! JAPAN Webサービス アプリケーションID【各自で設定】
0042: //取得方法:https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
0043: define('YAHOO_APPLICATION_ID', '*************************************');
0044: 
0045: //Yahoo!JAPAN キーフレーズ抽出(V2)【変更不可】
0046: define('YAHOO_KEYPHRASE_URL', 'https://jlp.yahooapis.jp/KeyphraseService/V2/extract');
0047: 
0048: //リンク先の検索対象ドメイン名
0049: define('SEARCH_DOMAIN', 'pahoo.org');
0050: 
0051: //サンプル・テキスト
0052: define('SAMPLE_TEXT', "1000年(長保2年)2月25日、藤原道長の長女、藤原彰子が第66代・一条天皇の中宮(皇后)となる。\n女房として、「源氏物語」の作者である紫式部や、歌人・和泉式部をしたがえ、朝廷に華麗な文芸サロンを形成した。\nまた、これより少し前、中宮定子の女房として、「枕草子」の作者とされる清少納言が仕えており、この頃、国文学が盛んになった。");

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

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

0195: /**
0196:  * 「Yahoo!JAPAN キーフレーズ抽出」を用いてキーフレーズを取り出す
0197:  * @param   string $sentence 解析するテキスト
0198:  * @param   array  $items    解析結果を格納する配列
0199:  * @return  bool TRUE:成功/FALSE:失敗
0200: */
0201: function getKeyphrase($sentence, &$items) {
0202:     $url = YAHOO_KEYPHRASE_URL;
0203:     $post = array(
0204:         'id'       => '1234-1',                           //ダミー
0205:         'jsonrpc'  => '2.0',                          //固定値
0206:         'method'   => 'jlp.keyphraseservice.extract', //固定値
0207:         'params'   => array(
0208:             'q' => (string)$sentence                   //対象テキスト
0209:         )
0210:     );
0211:     $json = json_encode($post);
0212: 
0213:     //WebAPIにパラメータをPOST渡しする
0214:     $stream = stream_context_create(array('http' => array(
0215:         'header'  => "Content-Type: application/json\r\n" .
0216:                     "User-Agent: Yahoo AppID: " . YAHOO_APPLICATION_ID . "\r\n",
0217:         'method'  => 'POST',
0218:         'content' => $json,
0219:     )));
0220: 
0221:     //WebAPIリクエスト
0222:     $res = @file_get_contents($urlFALSE$stream);
0223: 
0224:     if ($res == FALSE) {
0225:         $this->error  = TRUE;
0226:         $this->errmsg = 'WebAPI error: ' . $url;
0227:         return FALSE;
0228:     }
0229: 
0230:     //応答を配列へ代入
0231:     $results = json_decode($res);
0232:     if (! isset($results->result->phrases))        return FALSE;
0233:     $cnt = 0;
0234:     foreach ($results->result->phrases as $phrase) {
0235:         if (isset($phrase->score) && isset($phrase->text)) {
0236:             $items[(string)$phrase->text] = (int)$phrase->score;
0237:             $cnt++;
0238:         }
0239:     }
0240: 
0241:     return ($cnt > 0) ? TRUE : FALSE;
0242: }

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

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

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

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

0255: /**
0256:  * ワードクラウドを作成する
0257:  * @param   array  $items 情報を格納した配列
0258:  * @return  string ワードクラウド(HTML)
0259: */
0260: function makeWordCloud($items) {
0261:     $width  = WIDTH;
0262:     $outstr = '';
0263:     $n = 0;
0264: 
0265:     foreach ($items as $keyphrase=>$score) {
0266:         $n++;
0267:         $fsize = $score * 1.7 + 80;
0268:         $link = get_link($keyphrase);
0269:         if ($n > 1)     $outstr .= " \n";
0270: $outstr .=<<< EOT
0271: <span style="font-size:{$fsize}%; color:blue;">
0272: <a href={$link}>{$keyphrase}</a>
0273: </span>
0274: 
0275: EOT;
0276:     }
0277:     return $outstr;
0278: }

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

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

参考サイト

(この項おわり)
header