モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

SpamAssassinのルールをベイジアンフィルタで学習する

SpamAssassinのルールを、ベイジアンフィルタで学習させることで、最適なルールのポイント付けを行えるのではないか、というアイデアを以前書いていました。

モーグルとカバとパウダーの日記 - SpamAssassinのルールのポイント付けをベイジアンフィルタで自動学習するアイデア

試験運用するには、実は結構簡単にこの構成を作れそうで、SAのreportを必ず出す、にしておいて、学習してないサーバ版POPFileを動かしてやります。

これをやって試してみました。
ほんとは、自動学習までさせればよいのですが、学習自体はPOPFileのWebインターフェイスから行いました。
しかし、最初にほんの数回学習させただけで、あとは勝手に学習していってくれました。
つまり、SpamAssassinのスパムフラグを学習してしまえば、それでほぼ正しいわけで、そこさえ学習すればあとは勝手に賢くなってくれます。


学習が進むと、SpamAssassinよりも良い結果を出すようになりました。
SpamAssassin自体滅多に間違わないのですが、株の画像スパムなどでときどきすり抜けが起り、それがPOPFileの判定ではしっかりとスパムとして判定されました。
例えば、SpamAssassinベイジアンフィルタではBAYES_50と判定され、score=1.6とか(うちはrequired=12.0にしてある)でも、ちゃんとスパムとして判定されました。
判定理由を見ると、rcvd_in_njabl_dulとかrcvd_in_xblとかが高いポイントが付けられており、bayes_95の判定と同等くらいの重み付けとなっていました。
SpamAsaassinで抜けてしまうものは他のルールにマッチするものも少ないのですが(たぶんスパマーは事前にSpamAssassinで点数が低くなるようにチェックしているのだろう)、POPFileも通すと他に救済点も少ないため、トータルで計算してスパムと判断されるようです。
また、誤検出もSpamAssassinではメールマガジンの特別号(ほとんど広告)で起ったりしたのですが、POPFileの判定ではちゃんと学習してくれて、誤検出が起きませんでした。
また、POPFileを通すときに、POPFile側でも本文の普通の語句の学習をしますが、SpamAssassinのルール語句の学習のほうがウエイトが非常に大きくなるため、あまり影響していないように感じました。


というわけで、SpamAssassinのルールだけをベイジアンフィルタで学習させる、というのはだいぶ有効そうに見えます。
なので、SpamAssassinのみでこれが実現できるようにパッチ書いてみたいと思っています。
ルールのみの学習だと、それ用のベイジアンフィルタデータベースもとても小さいでしょうから、負荷もほとんど増やさずに改善が可能と思います。


(関連)

モーグルとカバとパウダーの日記 - SpamAssassinのルールのポイント付けをベイジアンフィルタで自動学習するアイデア