キーワード頻度と密度

先日の解析結果「$handler->tags[$i]['img']['alt']」や「$handler->datas」のテキストデータからキーワード(名詞)を抜き出して何回書かれているか、密度はどのぐらいかを調べます。


単語を取り出すには茶筌和布蕪を使いたいところですがYahoo! WEB Serviceテキスト解析APIがあるのでこれを使っちゃいましょう。
他のYahoo! WEB Serviceと同じく24時間で50,000リクエストが上限ですが、一度のリクエストの上限が100kbyteもありますし個人で使うには十分でしょう。

まず解析するテキストデータをwhileか何かを使って1つにまとめましょう、スペース1つ挟んで繋いだ方が無難だと思います。このときついでに>や&なども戻しておきましょう。

//リクエストURL
$service_url = "http://api.jlp.yahoo.co.jp/MAService/V1/parse";
$params = array(
    'appid'       => YOUR_APPLICATON_ID, //アプリケーションID
    'results'     => 'uniq',             //解析結果の種類uniqは出現頻度
    'response'    => 'surface',          //形態素情報surfaceは元の情報
    'filter'      => '9',                //フィルター名詞だけ欲しいので9
    //解析するテキストをUTF-8に変換
    'sentence'    => mb_convert_encoding($textdata, 'UTF-8', 'Shift_JIS'),
);

必要なクエリを配列に格納

$service_url .= '?' . http_build_query($params, '', '&');
$result = simplexml_load_file($service_url);
print_r($result);

URLとクエリを連結、返ってきたXMLをパースしてオブジェクトに代入


PHP4やallow_url_fopenがdisableの場合はPEAR::HTTP_RequestPEAR::XML_ParserSnoopyなどを使ってください。(12月6日のように手書きでもいいですが面倒です。)


Googleで実行した結果の一部です

SimpleXMLElement Object
(
    [uniq_result] => SimpleXMLElement Object
        (
            [total_count] => 106
            [filtered_count] => 44
            [word_list] => SimpleXMLElement Object
                (
                    [word] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [count] => 5
                                    [surface] => Google
                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [count] => 3
                                    [surface] => 検索
                                )

[filtered_count]がフィルターを通した結果の合計です、この場合は名詞が44個あります。
[surface]はキーワード(名詞)、[count]はキーワードがページに含まれている数です。
キーワード「Google」は5/44で「11.4%」となります。