古い記事
ランダムジャンプ
新しい記事
形態素解析器と Yahoo! Web 検索 API と TF-IDF を使ってキーワード抽
出するという先日の検索会議でのデモ、KEYAPI[2005-09-30-3]
教科書に載っているような基本中の基本ですが、あらためてエッセンスを
簡単な例で解説したいと思います。


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

TF-IDF を計算するためには、
(1) キーワード抽出対象テキスト中の代表キーワード候補出現数 (TF)、
(2) 全てのドキュメント数 (N)、
(3) 代表キーワード候補が含まれるドキュメントの数 (DF)、
を得る必要があります。

まず、(1) の TF から。キーワード抽出対象テキストの例 (a.txt) です。
本棚が届きました。さっそく組み立て。しかし、一部の部品に不良品があ
り一段だけ固定できません。本棚への道は険しいです。今週中に部品交換
に行ってきます。
これを形態素解析し、名詞だけ取り出します。
この例では、形態素解析器として chasen を用いています。
% chasen a.txt|grep '名詞'|sort|uniq -c|sort -nr
   2 本棚       ホンダナ        本棚    名詞-一般
   2 部品       ブヒン  部品    名詞-一般
   1 不良       フリョウ        不良    名詞-形容動詞語幹
   1 品 ヒン    品      名詞-接尾-一般
   1 道 ミチ    道      名詞-一般
   1 中 チュウ  中      名詞-接尾-副詞可能
   1 組み立て   クミタテ        組み立て        名詞-一般
   1 今週       コンシュウ      今週    名詞-副詞可能
   1 交換       コウカン        交換    名詞-サ変接続
   1 固定       コテイ  固定    名詞-サ変接続
   1 一部       イチブ  一部    名詞-副詞可能
   1 一段       イチダン        一段    名詞-一般
それぞれの単語が代表キーワード候補で、その出現数(左端の数)が TF
です。例:本棚:2、部品:2、不良:1。

次に、(2) の「全ドキュメント数 N」です。対象となるドキュメント群は、
ここでは、Yahoo! で検索できるすべての Web ページとします。
Yahoo! でインデックスされているページは 192 億ページと言われている
ので、N = 19200000000 ですね。まあ、適当な値でOKです。
(ref. Yahoo!がYSTのインデックスを増強、192億ページに
  <http://www.sem-ch.jp/news/000587.html>)

そして、(3) の DF (代表キーワード候補が含まれるドキュメントの数)
です。対象ドキュメント群は Yahoo! で検索できる全 Web ページなので、
Yahoo! 検索でのヒットした数が DF となります。ヒット数は Yahoo! API
で得ることができます。ちょっとトリッキーですが、以下にサンプルとし
て Perl でのヒット数取得関数 (超ad hoc) を挙げておきます。
use LWP::Simple;
sub get_num { # 検索ヒット数獲得 by Yahoo! API
    my ($key) = @_; # UTF-8
    $key =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
    my $url = "http://api.search.yahoo.com/WebSearchService/V1/".
        "webSearch?appid=YahooDemo&query=$key&results=1";
    my $c;
    ($c = get($url)) or die "Can't get $url\n";
    my ($num) = ($c =~ /totalResultsAvailable="(\d+)"/);
    return $num;
}

これで TF-IDF の計算の準備ができました。
試しに「本棚」で計算してみましょう。
TF = 2, DF = 2771, N = 19200000000 なので、
TFIDF ≒ 31.5 となりました。
% perl -e 'print 2*log(19200000000/2771),"\n"'
31.5024251422343
(ref. 「本棚」の DF <http://api.search.yahoo.com/WebSearchService/
  V1/webSearch?appid=YahooDemo&query=%e6%9c%ac%e6%a3%9a&results=1
>)

この値をすべてのキーワード候補に対して計算し、一番値が大きいの
が代表キーワードになります。上位何位かをランキング表示したりすれば
キーワード抽出っぽくなります。

さあ、Let's キーワード抽出!


参考: miyagawa 氏の Bulkfeeds <http://bulkfeeds.net/> には
形態素解析と tf-idf を用いたキーワード抽出の仕掛けがあり、
API として公開されています。
Bulkfeeds: Developer's API - RSS Directory & Search
<http://bulkfeeds.net/app/developer.html#terms>
形態素解析 + 特徴語抽出
任意のテキストに対して形態素解析を行い、Bulkfeeds の
記事データベースの統計データをもとに特徴語を抽出します。