Torisugariの日記: ベイズ分類
mozIStorage***を使って、ベイズ判定を書き起こしてみました。
汎用ベイズ判定のソース(Gary Robinson 前期型)
もちろん、データベースは学習データの記録に使っています。
あ、汎用というのはスパム/ハム選別以外にも使うことを想定しているからで、たとえば、「このサイトはアレゲ指数0.89だから、かなりアレゲだな」などという使い方ができます。あらかじめ、アレゲなサイトとそうでないサイトを学習させてやるのが大変かもしれませんけど。
使ってみた感想は、精度は予想よりかなりいいです。スパムフィルタリングのように真剣な用途だと、false-negativeを気にして片面95パーセントなど、カリカリのチューニングが要求されますが、遊びで使う分には、学習数がそれほどなくても、かなり直感と合う数字を返してくれています。後述のように、Thundebirdのよりもアルゴリズムでは劣っているのですが。
ただ、ちょっと遅いです。一回につき、大体0.3秒~0.4秒くらいかかっているので、”やや難”ですね。学習時に確率の計算までやってデータベースに書き込んでおけば、判定スピードは上がりそうですけど、当然学習のスピードは落ちるので、あまり気が乗りません。まあ、判定は結果がすぐに要求されますが、学習はサボりながらバックグラウンドでやってもばれないと思うので、検討の余地はあります。ただ、Thunderbirdのソースを見ると、そういうテクニックを使わず、ほぼ同じ手順を踏んでいるので、これはやはり、SQLでデータを取って来る時に発生している浪費なんでしょうね。単に、私のデータベースアクセスが下手なだけなら良いのですが(良くないけど)。
以下、Thunderbirdのメモ。
ベイズ理論を元にしたスパムフィルタは大きく分けて「Paul Graham方式」、「Gary Robinson方式(2002年、2004年)」の2種類あります。Thunderbirdに搭載されているのは、この分類でいくと、「Gary Robinson (2004年)方式」の方で、不完全ガンマ関数でカイ二乗の逆関数を計算しています。といっても、私はGary Robinsonが書いた記事を読むまでは、Thunderbirdの実装を見てもローカル変数の意味が分かっていませんでした。読んですぐ分かったわけでもないですけど…。
Thunderbirdで面白いのは、”極端な150トークン”を選んで判定を行っていることです。「Paul Graham式」では”極端な15トークン”しか使わないので、その辺の影響もあると思います。この150トークンを良く考えれば、すり抜けスパムを書けそうな気がしなくもないですね。有効トークンには字数制限もありますし…。
ベイズ分類 More ログイン