【PHP】phpQuery+マルコフ連鎖で特定のWebページを要約する

Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInEmail this to someone

以前、自然対話のアウトプット方法として「マルコフ連鎖による応答語生成」というものをやりました。

今回はその応用例として、「誰かがURLを投稿したら、そのページの内容を要約して話してくれるボット機能」を実装してみます。

グループトークとかでURL共有されることがたまにありますが、タップする前にその内容を少し教えてもらえると、タップする意欲も高まるかなと。

要約の精度はとりあえずおいといて、今回やることは下記の通り。言語はPHP。

  1. 投稿内容に「http://」「https://」が含まれていたら、URL部分を抜き出す。
  2. 抜き出したURLにアクセスし、ソースコードをクローリング&スクレイピング。
  3. スクレイピングした文章を、マルコフ連鎖によって要約。

1.  投稿内容からURLを抜き出す

preg_match_all関数でできます。

preg_match_all(‘/https?:\/\/[a-zA-Z0-9\-\.\/\?\@&=:~#]+/’, $subject, $matches)

$subjectは、元となる投稿テキストで、String型。$matchesは、抽出したURLを格納する変数で、array型になります。一旦、$matchesにURLを入れたあと、任意のURLを別途String型の変数に代入します。

  
preg_match_all('/https?:\/\/[a-zA-Z0-9\-\.\/\?\@&=:~#]+/', $text, $matchs);
$URL = $matchs[0];  

とりあえず1個めだけ。

2. URLをphpQueryでクローリング&スクレイピング

Webページのソースコードをクローリングしつつ、指定した情報をスクレイピングするには、Googleさんの「phpQuery」が便利なのでこれを使います。

Google Code Archive – phpQuery

PHPのライブラリファイルをインクルードして、実行するだけでクローリングしてくれます。

require_once("phpQuery-onefile.php");
<span class="crayon-v">$HTMLData</span> <span class="crayon-o">=</span> <span class="crayon-e">file_get_contents</span><span class="crayon-sy">(</span><span class="crayon-s">$URL</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>

クローリングしたデータをオブジェクトとして扱う宣言をした後、jQueryでタグ指定する感じで、その中の情報をスクレイピングできます。とりあえずPタグの内容を取得して$HTMLTextに挿入しまくる。

<span class="crayon-v">$phpQueryObj</span> <span class="crayon-o">=</span> <span class="crayon-e">phpQuery::</span><span class="crayon-e">newDocument</span><span class="crayon-sy">(</span><span class="crayon-v">$HTMLData</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
foreach($phpQueryObj['p'] as $i => $val) {
$HTMLP = pq($val)->text();
$HTMLText = $HTMLText . $HTMLP;
}

$phpQueryObj[‘p’]のところを、’p:eq(0)’などのようにjQuery的に指定することができるようです。便利ですね。

3. 抽出したテキストをマルコフ連鎖で要約する

下記記事を参照ください。

これで完成。

冒頭のとおり、精度については今回はスルー。できれば単語の頻度や特徴量何かを計算しておいて、重要な語句で要約するとかやりたいです。ということで、Word2VecやDoc2Vec、TF-IDFあたりにつなげる予定。がんばろう。

Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInEmail this to someone