« SoftEther の実験用サーバ募集 | メイン | 情シスの飲み会に行ってきた »

2004年12月11日

bsfilter を試してみた

ここ最近 Development が寂しいわけですが、何もしていないわけじゃありませんよ。ちょっと前に bsfilter を試してみたのでその結果を。

bsfilter は Ruby で書かれたスパムフィルタの一種です。何で bsfilter を使ってみたかというと、機能が他のフィルタに比べてシンプルであったし、ソースを読むのに苦にならないから(Ruby でかかれているから)。

さて、これをスパムフィルタとして使うだけでは、ここに書く意味も無いので新聞社の判別に使うことにした。今回は、なんとなくしっかりした文章を書いているイメージがある、日経新聞かどうかを判定するフィルタを作成した。

日経新聞 = Spam
その他の新聞 = Clean

として、日経新聞率(スパム率)を計算することにした。使い方は、公式サイトを見ていただくとして、記事の本文を1記事1ファイルとして学習させて行った。その後、どれくらいの確率で正確に分類できるかを計算した。通常 Spam であるかどうかは、スパム率が 95% でスパムと判定するのだけど、今回は、日経新聞率(スパム率)が 50% より大きければ日経新聞と判断し、50% 未満であればそれ以外。と判断することにした。

設定は、全てデフォルトで行った。サンプル記事(学習させる記事)は、11月分の日経記事全件と日経記事以外の記事を適当に1万件週出して行った。1万件にしたのは、別に根拠は無くって、きりがいいから。

その学習データを基に、12月分の記事を使って確かめたところ、

日経新聞を日経新聞として判定する確率 = 70%
日経新聞以外を日経新聞以外として判定する確率 = 80%

という結果を得た。判定のラインは、上記に書いたとおり。細かい数字は忘れてしまったので、概算で申し訳ないが。分散を調べればよかったと少々後悔しています。

なかなかよい結果を得ることが出来て面白い。単語(token)の分割に bigram を使ったのがよい結果を後押ししたと思っています。仮に kakasi を使った場合は、もっと精度が下がります。というのは、新聞社の判断は、単語の出現率ではなく、単語の使用の方法を見なければならないから。実際、先輩が試してみてあまりよい結果が出なかったみたい。

Ruby で書かれているので、自分に必要な機能だけを切り出した Perl 版も作ってみたいと思う。時間が無くって、年明けになりそうだけど。その際は、単語の切り出しに N-Gram も使えるようにしたいと思っています。

【関連情報】
・bsfilter / bayesian spam filter / ベイジアン スパム フィルタ
 http://bsfilter.org/
・朝日新聞チェッカー
 http://ikejisoft.com/games/asahi.rb

2004年12月11日 13:06 | Technology

トラックバック

コメント

うーむ、不思議だ

投稿者 yukoba : 2004年12月12日 17:37

>> yukoba さん
急いで確かめたので、間違いがあるかも。

投稿者 ceekz : 2004年12月12日 18:11