ブログやニュースの本文を抽出する方法

前回の記事で書いたようにはてまブックマークで学んだことを書いていこうと思う。

実装

gooやYahoo!ではどんな風に実装されているんだろうと気になり、自分でもつくってみました。今回できたスクリプトでは28件中23件、8割の成功確率でした。NRIのレポートでも推定、とあるように人間が目で見て正解か確かめていくのはしんどいのでちょっとサンプル数は少なめ。

http://blog.zuzara.com/2006/06/06/84/

80%って書いてあるんだけど、僕が試してみたところ思ったより成功率が悪かった。んで、調べてて見つかったのが句読点とかをカウントしてそれが一番多いところを本文として抽出する方法。

これって日本語でしか使えないんだけど、考えてみると日本語を書いているサイトであれば、本文を書いているところが一番句読点とかが多いから結構優秀なアルゴリズムだと思った。なんで、記載してあるプログラムを句読点の数を数えて、一番多いところを出力するように書き換えてみた。

プログラム

ということで、書いたプログラムが以下。

<?php
/* 本文解析 */
function getBlogEntryBody($buf)
{
    $buf = substr($buf, strpos($buf, '</head>'));
    $res = '';
    $max = 0;
    $match = preg_split("'(<td[^>]*?>)|(</td>)|(<div[^>]*?>)|(</div>)'i", $buf, -1, PREG_SPLIT_NO_EMPTY);
    foreach ($match as $val) {
        $cnt = 0;
        $val = trim(strip_tags($val));

        $cnt = $cnt + substr_count($val, "");
        $cnt = $cnt + substr_count($val, "");
        $cnt = $cnt + substr_count($val, "");
        $cnt = $cnt + substr_count($val, "");

        if ($max < $cnt) {
            $max = $cnt;
            $res = $val;
        }
    }
    return $res;
}
$buf = mb_convert_encoding(file_get_contents($url), 'UTF-8', 'auto');
?>

感想

僕が試したところ日本語のサイトであればほぼ100%の確率で抽出できた。

分かりやすいアルゴリズムと基本と成るプログラムを書いていただいた、zuzara | いじる、つくる、感動すると、Ceekz Logs (Move to y.ceek.jp)の中の方。ありがとうございました。