ベイジアンフィルタ
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追記
ソースのリンクが切れていたので修正しました。