名詞と動詞を切り出すのにはchasenを使っている。最初は外部コマンドで呼び出していたが、実行時間がかかるのでPythonのモジュールを作って組み込んだ。モジュールを作るといってもSWIGを使えば簡単で、
// swig -I/usr/include -python chasen.i // gcc -c chasen_wrap.c -I/usr/include/python2.4 -I. // g++ -shared chasen_wrap.o -lchasen -o _chasen.so %module chasen %{ #include "chasen.h" %} %rename(getopt) chasen_getopt_argv; %rename(parse) chasen_sparse_tostr; %ignore chasen_fparse; %ignore chasen_fparse_tostr; %ignore chasen_sparse; %include "chasen.h"
こんなもんだ。それから、普通にchasenをインストールした状態では英単語や数値を切り出せない。/usr/etc/chasenrcか~/.chasenrcに追加する。
(連結品詞 ((記号 アルファベット))) (連結品詞 ((名詞 数)))
あとは「単語」→「単語の含まれる文書数」の連想配列を作って一応pickle化して保存しておく。そんなにパワフルなマシンじゃなくて、だいたい1万文書につき40秒くらいかかってしまうので、毎回計算するわけにはいかない。あとは文書ごとに同じようにchasenで名詞と動詞を切り出して、それぞれの単語につき「単語が文書に出現する数*math.log(全文書数/単語の出現する文書数)」をスコアにして、トップ10を計算。一応キャッシュとして保存しておいて、ページのほうではキャッシュデータを元に表示。
全文書に関わる情報を毎回更新せずにやると、division by zeroが発生する。一応この場合はスコア0ということで表現している(本当は間違いで、かなり高いスコアがつくはず)。
たぶん、ちゃんとやればほぼ全部を動的にできると思うんだけどね。全文書に関わる情報をDBに保存しておいて、ページを更新するたびにその情報を更新しておく。あとは表示するときにその文書に関わる情報を見てTF-IDF法で計算したスコアを元にキーワードを求めればいい。そこまでがんばる義理まではないだろう。