2005-01-18 [長年日記]

[Q3] スパムフィルタ (6)

スパムフィルタに関するundocumentedなことをいくつか。

アルゴリズムはPaul Graham方式です。閾値は0.95になっていますが、qmail.xmlのJunkFilter/ThresholdScoreで指定可能です。ただし、ほとんどの場合、スコアは0か1に限りなく近くなるので閾値を変える必要はあまりないと思います。

受信した時に自動的に学習するようになっています。qmail.xmlのJunkFilter/Flagsから0x01のビットを倒すと学習しなくなります。また、同様に0x02のビットを倒すとJunkフォルダにメッセージを移動した時やJunkフォルダからメッセージを移動した時に学習しなくなります。メニューなどには一切登録されていませんが、MessageAddClean, MessageAddJunk, MessageRemoveClean, MessageRemoveJunkというアクションがあり、名前のとおりの動作をします。既に存在するメッセージを学習させたい場合にはこれらのアクションを使用することができます。

学習したメッセージのID(Message-Idを使いますが、取得できない場合にはヘッダ全体のMD5ハッシュを使います)が保存されていて、同じメッセージを繰り返し学習しないようになっています。また、一度学習したメッセージと同じIDのメッセージは常に学習したとおりに判定されます。

学習したクリーンなメッセージが100通以下の場合には常にクリーンと見なされます。これは、クリーンなメッセージよりもスパムを多く学習した状態だと間違ってスパムと判定される可能性が非常に高いからです*1

何を学習して何を元に判定したかを知りたい場合には、qmail.xmlのGlobal/Logを4にしてください。ログに記録が残ります。ただし他のログも含めて大量に出力されます(たぶん)。

*1  100通でも少ないのですが、あまりにも多いとそれはそれで使いづらいので

[Q3] アクションを直接実行

Emacs系のM-xのようにアクション名を直接タイプして実行可能なインターフェイスがあると普段使わないアクションを実行するのに便利かも知れません。

ついでに手で入力したマクロをその場で評価するインターフェイスなんていうのもあるとテスト目的には良いかもしれませんね。

[SVN] Subversion 1.1.3

変更点は翻訳の更新くらいのようですがリリースされています。

本日のツッコミ(全5件) [ツッコミを入れる]
# trr (2005-01-19 09:44)

スパムフィルタ実装お疲れ様です。<br>スパムフィルタの検討を始めたらしい1/9あたりからスパムを貯めて230通学習させました。(token ファイルは 815KB)<br>まだ学習が足りないようなのでもう少しスパムを貯めることにします。(XP版の話です。)<br><br>ところで、Windows Mobile への実装って大変ですか?<br>それとも実装後のパフォーマンスが問題ですか?<br>要望としてあげようかどうか迷ってます。<br>要望で出すときは mailbox の下の junk ディレクトリの場所の指定を合わせ業で出そうと考えてます。

# snak (2005-01-19 23:43)

技術的には必要なのはqdbm <http://qdbm.sourceforge.net/>を移植するだけです。詳しく調べてはいませんが結構大変そうに見えます。<br><br>実装時の一番のネックはデータサイズとパフォーマンスです。そこそこまともに判定できるようになるころにはdbのサイズは最低でも5Mくらいになると思います。さらにこのファイルをSDカードのような外部媒体に置くとパフォーマンスが極端に悪くなるのではないかと思われます。<br><br>というわけで、結構大変そうなqdbmの移植をやった上でパフォーマンス的に使い物にならないと悲しいのであまりやる気がしません。

# trr (2005-01-20 00:58)

Windows Mobile のことは了解しました。<br>要望は出さないことにします。<br><br>さて、XPでのスパムフィルタの調子です。<br>先日学習が足りないと書きましたが、足りないのはクリーンの学習でした。<br>強制的にクリーンのメールの学習を1300通ほどさせるといい感じでスパムを判定してくれてます。<br>感謝ですm(_ _)m

# H.Aoyama (2005-01-20 04:39)

なるほど. trrさんのコメントを見て,Clean の学習もさせなくちゃ,と思いました(これって,一度入れてから他のフォルダに出す,でいいんですよね?).<br><br>えと,また質問なのですが(ここでやるのもナンですけどね(^^ゞ),Junk の学習は,複数アカウントがあった場合でもただ一つになるんですよね? mail 直下に junk フォルダが出来ていて,それぞれで SPAM 学習させたところそれほど件数が無くても token が 3MB を超えたので. で,この場合って,100通を下回ったアカウントの場合は振り分け処理はしてくれないのでしょうか? 全体で 100通を超えればよいでしょうかね. そういえば,IMAP と POP 混在の場合や,NEWS 混在の場合はどうでしょうか.

# snak (2005-01-20 04:54)

クリーンの学習はJunkに入れてから出すか、MessageAddCleanアクションを使ってください。<br><br>トークンのDBはすべてのアカウントで共通です。アカウントに関係なくクリーンなメッセージを100通以上学習させればどのアカウントでもフィルタは有効になります。プロトコルが異なっても同じです。


トップ «前の日記(2005-01-17) 最新 次の日記(2005-01-19)»