読者です 読者をやめる 読者になる 読者になる

Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

ベイジアンフィルタ

MeCab形態素解析ネタの続きで、Pythonで簡易ベイジアンフィルタ作ってみました。

ベイジアンフィルタって何ぞや?という方に簡単に説明すると、テキスト分類プログラムのことです。よくある利用方法として、あるメールが、スパムメールかそうでないのかの判別に使われたりします。

ソースはコレです。ここのサイトの説明を参考にしました。アルゴリズムPaul Graham方式を使っています。以前のコレはctypesを使ってMeCabを呼び出していたけど、今回はPython Bindingを使って書きました。

さて、、、ベイジアンフィルタを試すには、フィルタに学習させる為のデータが必要です。しかし、ふつーにスパムメールたくさん、ノンスパムメールたくさん用意して実験してもいまいち面白くない。

そこで、次のような実験方法を考えました。

Aさん、Bさんの書いた文章をフィルタ学習用データとして用意する。そして、学習用データに含まれない文章をフィルタにかけ、Aさん or Bさんのどちらが書いた文章かを判別する

という方法です。

実験その1

というわけで、41個の椎名林檎の歌詞テキストと、55個の矢井田瞳の歌詞テキストを用意しました。
以下、簡単の為に、椎名林檎 = nonspam、矢井田瞳 = spamとします。

では、椎名林檎の「丸の内サディスティック」、矢井田瞳の「B'coz I Love You」をそれぞれフィルタにかけ、spamか否かを判別してみます。学習用データに、これら2曲は含めてありません。

「丸の内サディスティック」 を nonspam、「B'coz I Love You」を spam と判別してくれるのを期待してるわけですが、、、

結果:丸の内サディスティック

単語 SPAM確率
あたし 0.01
無い 0.0289389067524
0.0650154798762
0.122093023256
って 0.844329896907
たい 0.822977725674
0.245
欲しい 0.753670473083
居る 0.294392523364
0.689938398357
ない 0.654434737617
なっ 0.357446808511
0.593539703903
0.560346202936
0.558325329608

spam probability:0.000167671848076

上の数値は特徴的な単語上位15個のスパム確率です。総合スパム確率は0.01%。ちゃんと判別してるぽい。。

結果:B'coz I Love You

単語 SPAM確率
いつ 0.99
言っ 0.99
B 0.01
0.987670449906
love 0.926016658501
まで 0.918466522678
など 0.0944527736132
you 0.878519710378
' 0.862226277372
貴方 0.182015167931
I 0.804404145078
見え 0.769465648855
0.726404216768
0.7239488117
生き 0.714555765595

spam probability:0.999999996442

おお、99.99%スパムだ!!賢い!
って当たり前なのか。や、でも賢いなあ。

    • -

2007.01.08追記
ソースのリンクが切れていたので修正しました。