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

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

(2025年9月6日).pahooEnv導入

目次

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

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

サンプル・プログラム

圧縮ファイルの内容
keyphrase.phpサンプル・プログラム本体。
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
keyphrase.php 更新履歴
バージョン 更新日 内容
2.1.0 2025/09/15 .pahooEnv導入
2.0 2021/10/02 キーフレーズ抽出(V2)に変更,PHP8対応,リファラチェック改良
1.1 2017/03/25 PHP7 対応
1.0 2014/08/02 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

キーフレーズ抽出

キーフレーズ抽出(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など

keyphrase.php

  53: // 各種定数(START) ===========================================================
  54: 
  55: // 表示幅(ピクセル)
  56: define('WIDTH', 600);
  57: 
  58: // Yahoo! JAPAN Webサービス アプリケーションID【各自で設定】
  59: // 取得方法:https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Yahoo
  60: if (isset($_ENV['PAHOO_YAHOO_APPLICATION_ID'])) {
  61:     define('YAHOO_APPLICATION_ID', $_ENV['PAHOO_YAHOO_APPLICATION_ID']);
  62: else {
  63:     define('YAHOO_APPLICATION_ID', '');
  64: }
  65: 
  66: // Yahoo!JAPAN キーフレーズ抽出(V2)【変更不可】
  67: define('YAHOO_KEYPHRASE_URL', 'https://jlp.yahooapis.jp/KeyphraseService/V2/extract');
  68: 
  69: // リンク先の検索対象ドメイン名
  70: define('SEARCH_DOMAIN', 'pahoo.org');
  71: 
  72: // サンプル・テキスト
  73: define('SAMPLE_TEXT', "1000年(長保2年)2月25日、藤原道長の長女、藤原彰子が第66代・一条天皇の中宮(皇后)となる。\n女房として、「源氏物語」の作者である紫式部や、歌人・和泉式部をしたがえ、朝廷に華麗な文芸サロンを形成した。\nまた、これより少し前、中宮定子の女房として、「枕草子」の作者とされる清少納言が仕えており、この頃、国文学が盛んになった。");
  74: 
  75: // 各種定数(END) ===============================================================

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

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

keyphrase.php

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

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

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

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

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

keyphrase.php

 236: /**
 237:  * ワードクラウドを作成する
 238:  * @param   array  $items 情報を格納した配列
 239:  * @return  string ワードクラウド(HTML)
 240: */
 241: function makeWordCloud($items) {
 242:     $width  = WIDTH;
 243:     $outstr = '';
 244:     $n = 0;
 245: 
 246:     foreach ($items as $keyphrase=>$score) {
 247:         $n++;
 248:         $fsize = $score * 1.7 + 80;
 249:         $link = get_link($keyphrase);
 250:         if ($n > 1)     $outstr ." \n";
 251: $outstr .=<<< EOT
 252: <span style="font-size:{$fsize}%; color:blue;">
 253: <a href={$link}>{$keyphrase}</a>
 254: </span>
 255: 
 256: EOT;
 257:     }
 258:     return $outstr;
 259: }

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

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

参考サイト

(この項おわり)
header