形態素解析と検索APIとTF-IDFでキーワード抽出
2005-10-12-1
[Programming][Algorithm]
形態素解析器と 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 を用いています。
です。例:本棚: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) を挙げておきます。
これで TF-IDF の計算の準備ができました。
試しに「本棚」で計算してみましょう。
TF = 2, DF = 2771, N = 19200000000 なので、
TFIDF ≒ 31.5 となりました。
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>
出するという先日の検索会議でのデモ、KEYAPI[2005-09-30-3]。
教科書に載っているような基本中の基本ですが、あらためてエッセンスを
簡単な例で解説したいと思います。
目的:キーワード抽出対象テキストから、そのテキストを代表する
キーワードを抽出します。TF-IDF という指標を用います。(この値が大
きいほどその単語が代表キーワードっぽいということでよろしく。)
TF-IDF を計算するためには、
(1) キーワード抽出対象テキスト中の代表キーワード候補出現数 (TF)、
(2) 全てのドキュメント数 (N)、
(3) 代表キーワード候補が含まれるドキュメントの数 (DF)、
を得る必要があります。
まず、(1) の TF から。キーワード抽出対象テキストの例 (a.txt) です。
本棚が届きました。さっそく組み立て。しかし、一部の部品に不良品があこれを形態素解析し、名詞だけ取り出します。
り一段だけ固定できません。本棚への道は険しいです。今週中に部品交換
に行ってきます。
この例では、形態素解析器として chasen を用いています。
それぞれの単語が代表キーワード候補で、その出現数(左端の数)が TF% chasen a.txt|grep '名詞'|sort|uniq -c|sort -nr 2 本棚 ホンダナ 本棚 名詞-一般 2 部品 ブヒン 部品 名詞-一般 1 不良 フリョウ 不良 名詞-形容動詞語幹 1 品 ヒン 品 名詞-接尾-一般 1 道 ミチ 道 名詞-一般 1 中 チュウ 中 名詞-接尾-副詞可能 1 組み立て クミタテ 組み立て 名詞-一般 1 今週 コンシュウ 今週 名詞-副詞可能 1 交換 コウカン 交換 名詞-サ変接続 1 固定 コテイ 固定 名詞-サ変接続 1 一部 イチブ 一部 名詞-副詞可能 1 一段 イチダン 一段 名詞-一般
です。例:本棚: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 となりました。
(ref. 「本棚」の DF <http://api.search.yahoo.com/WebSearchService/% perl -e 'print 2*log(19200000000/2771),"\n"' 31.5024251422343
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 の
記事データベースの統計データをもとに特徴語を抽出します。