BLOGTIMES
2007/07/01

Yahoo!APIで特徴語抽出を作る

  YahooAPI  nlp 
このエントリーをはてなブックマークに追加

NP_MetaTagsではmetaタグのkeywordsを記事の本文から特徴後を抽出して自動的に生成する機能があり、これはBulkfeedsの特徴語抽出APIを使わせてもらっていました。ところが、このところBulkfeedsが落ちたままなので別の方法で特徴語抽出ができる方法がないか探してみました。

[を] 形態素解析と検索APIとTF-IDFでキーワード抽出

目的:キーワード抽出対象テキストから、そのテキストを代表する キーワードを抽出します。TF-IDF という指標を用います。(この値が大きいほどその単語が代表キーワードっぽいということでよろしく。)

たつをさんの上記のページを見る限りでは精度はともかく簡単なものであればすぐにできそうです。当時はYahooに形態素解析APIがなかったので、ローカルで茶筅なり、MeCabを使う必要がありましたが、今は全てYahoo!APIだけで全て完結できますね。

TF-IDFとは

ここではTF-IDFという方法を使っています。前述のたつをさんのページによるとBulkfeedsもこれを使っていたようなのでちょうどいいですね。このTF-IDFは確か学部のときに何かの本か論文で読んだ記憶があるのですが、それ以来NLPには手を出していなかったのですっかり忘れてしまっていました。

wi,j = tfi,j * log( N / dfi )
 ・wi,j: 特徴語としての重み
 ・i: 対象キーワード
 ・j: キーワード抽出対象テキスト
 ・tfi,j: キーワード抽出対象テキスト中の対象キーワード出現数
 ・dfi: 対象キーワード候補が含まれるドキュメントの数
 ・N: 全てのドキュメント数

前述のたつをさんのページのミソはNをYahoo!の総インデックス数、dfiをYahoo!での検索ヒット数に置き換えることでYahoo全体を大きな文書DBとみなし、そうすることでウェブ全体を母集団としたときの特徴語検索ができるようにしているというところでしょうか。これは面白いですね。

このロジックのキモは全てのドキュメントを何に設定するかによって特徴語が変わってくるということなので、例えば母集団を自分の書いたブログだけに絞れば、自分が良く書いている単語については特徴語として抽出されないようにもなったりするわけです。趣味でやる分にはいいのですが、この辺りがNLPの面白さでもあり、闇でもあるわけです。

早速作ってみた

今回は日本語形態素解析Webサービスで文章から名詞のみを抽出し、出現頻度情報(上記のtfi,j)を求めます。その後、ウェブ検索Webサービスを使って、各キーワードごとに検索をかけて、Yahoo!でのインデックス数(上記のdfi)を求めます。最後にYahoo!の総インデックス数(上記のN)は良くわからないのですが、上記のたつをさんの記事だと192億だったので、少しは増えているだろうということで250億と仮定して計算してみました。

ということで、さっそくNP_MetaTagsに上記のアルゴリズムを組み込んでみました。ちょっと生成のためにAPIにアクセスする回数の多さが気になりますが、うまく動きました。クレジット表記とかいろいろ面倒なところはありますが、近々新バージョンをリリースしようと思います。

実際のサンプルは

NP_MetaTags v1.6のを参照してください。NP_MetaTags::_getKeywords()の部分が実際に処理している部分になります。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2082
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    kyms [Hatena] (2007/07/05 16:26) <%HatenaAuth()%>

    きっと無茶な提案だと思いますが、言うだけ言ってみます。笑

    類語生成もできれば便利と思いました。はてなの連想語APIあたりが使えるといいですが。たとえば「ホームページ」であれば「Webページ」「ウェブページ」「HP」などのキーワードを自動的に抽出。という感じです。

    kyms [Hatena] (2007/07/05 16:40) <%HatenaAuth()%>

    http://zapanet.info/webappl...
    サンプルアプリがあったので試してみましたが、はてなのAPIはちょっと違う感じ。。

    hsur (2007/07/05 21:25) <%HatenaAuth()%>

    関連検索ワード(http://developer.yahoo.co.j...)なんかを使うというのもありますが、類義語とはちょっと違いますよね。

    ただ、類義語の使い道についてはあまりよい使い道を思いつかないので今のところは実験用途以外に実装する予定は無いです。。。。

    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン