Yahoo!日本語形態素解析APIを使ってキーワードをぶっこぬき

指定したWebページのキーワードを抽出して言葉の意味と一緒に表示するサービスで、最近調子がいまいちっぽいBulkfeeds形態素解析APIの代わりにhttp://developer.yahoo.co.jp/jlp/を使ってみました。

APIとやりとりするとこのソース

Yahoo!の日本語形態素解析Webサービスを使ってTwitterで流行っているキーワードをクラウド化 - Do You PHP はてな
コピペ参考にさせていただこうと思ったのですがSimpleXMLが使えない(PHP4)ので前のコードをちょっと修正して動かしました。


pearのHTTP_Clientを使用しています。

require_once "HTTP/Client.php";
//$strには対象文字列

$yahoo_appid = "**********";
$yahoo_url = "http://api.jlp.yahoo.co.jp/MAService/V1/parse";
$yahoo_params = array("appid" => $yahoo_appid, "sentence" => $str, "results" => 'uniq', 'filter' => '9'); //'filter' => '9'で名詞のみ

//HTTPクライアント
$client =& new HTTP_Client();
$client->post($yahoo_url, $yahoo_params);
$result = $client->currentResponse();

$xml = $result['body'];
if (!$dom = domxml_open_mem($xml,DOMXML_LOAD_PARSING,$domerror)) {
    echo "XML parse error!!\n";
    foreach ($domerror as $errorline) {
        //エラー出力
        echo $errorline['errormessage']."<br />\n";
        echo " Node  : " . $errorline['nodename'] . "<br />\n";
        echo " Line  : " . $errorline['line'] . "<br />\n";
        echo " Column : " . $errorline['col'] . "<br />\n";
    }
    echo "Yahoo!形態素解析でerrorが発生しました\n";
}

$res = xml_to_result($xml);

function xml_to_result($dom) {
    preg_match_all("/<Result>(.*)<\/Result>/", $dom, $ret);
    $i = 0;
    // パーサ
    $parser = xml_parser_create();
    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
    xml_parse_into_struct($parser,$dom,$values,$idx);
    xml_parser_free($parser);

    // パースして得た連想配列をまわしてキーワードと出現回数をひろう
    $in_item = 0;
    $cache_item = 0;
    $i=0;
    $res = array();
      $res['totalResultsAvailable'] = $values[0]['attributes']['TOTALRESULTSAVAILABLE'];
      $res['totalResultsReturned'] = $values[0]['attributes']['TOTALRESULTSRETURNED'];
      $res['firstResultPosition'] = $values[0]['attributes']['FIRSTRESULTPOSITION'];

    foreach ($values as $value) {
        $tag  = $value["tag"];
        $type = $value["type"];
        $val = $value["value"];
        if($tag == "WORD" && $type == "open"){
            $in_item = 1;
        }elseif($tag == "CACHE" && $type == "open"){
            $cache_item = 1;
        }elseif($tag == "CACHE" && $type == "close"){
            $cache_item = 0;
        }elseif($tag == "WORD" && $type == "close"){
            $res[$i]['word'] = $surface;
            $res[$i]['count'] = $count;
            $i++;
            $in_item = 0;
        }
        if ($in_item && $cache_item == 0) {
            switch ($tag) {
                case "COUNT": //出現数
                    // 文字コード変換
                    //$val = mb_convert_encoding($val,"UTF-8","JIS,UTF-8,SJIS,EUC-JP"); 
                    $count = $val;
                    break;
                case "SURFACE": //キーワード
                    $surface = $val;
                    break;
            }
        }
    }

  return $res;
}

$resにキーワードと出現数が格納されます。


出現頻度までカウントしてくれるし、フィルタリングできるし、レスポンスも早い。



[infony]ついでに高速化

あやしげなところをちょこちょこ修正して前よりもだいぶ処理速度が速くなりました。


http://kaihatsu.chew.jp/infony/


よかったらご利用ください。