dh memoranda

徒然なるままに日暮らしブログに向かいて...

Bogofilter - スパムとのたたかい

最近、仕事柄海外の方とのメールの遣り取りが増えてから、以前は気にならなかったスパムが気になるようになってきました。以前は英語のメールをバッサリとスパムと一緒に捨てていたのですが、そうもいかなくなりまして...。そうこうしているうちに、日本語のスパム、スパムもどき(メールマガジンの宣伝っぽいのとか)も増えてきました。いまは一日80通から100通くらい来ています。ウェブページでアドレスを載せていたり、まあいろいろしていますので...。

A Plan for Spam を読んでから、スパムと闘うことに楽しさを見出してしまいそうで、そんなわけで、スパムとの闘いを続けて、いろいろ試した bogofilter におちついています。これを使って、いまのところ満足しています。

最初は procmail でレシピを作っていたんですが、すぐに面倒になりました。spamassassin も試しましたが、誤認識が恐くてやめました。tdma も試したのですが、確認メールを送りつけると理解できなかったり怒っちゃったりしそうな人とのやりとりもあるだろうし、また手動でホワイトリストを維持する気力も体力もないことから、思い止まりました。次に MacOSX の Mail.app のスパムフィルタで学習させていたのですが、大切なメールを度々スパムにされてしまいました。Mozilla 1.3 のは結構よかったのですが、メーラ自体が安定していないのか、度々動かなくなりました。imap だと、スパムかどうかの判断のためにいちいち全てのメールをサーバからもってこないといけないので、動作もちょっと遅いですし、そもそもメーラを限定する使い方は、imap と馴染まないように思えてきました。

いろいろ試してきて、わたしが求めているスパムフィルタは、他の人とちょっと違っているような気もしてきました。自宅でいくつかのドメインとそのメールサーバを運用しているのでアドレスを詐称して送られたスパムの戻りなどもあり、それはスパムフィルタされないように、とかいろいろ注文が多くなってしまいます。

スパムとスパム以外の区別の方法はいろいろありますが、わたしが注目したのはベイズ理論に基づいたスパムフィルタです。「ベイジリアンフィルタ」ていうといいのかな。ベイズ理論については、以前 Hotwired で見て、ちょこちょこ調べていたのですが「A Plan of Spam」(日本語訳) を読んでから、自分で試したくなってしまいました。この文章にあるように、過去のメールから類推してスパムかどうかを判断します。結局、スパムかどうかは本人の主観に基づいた判断になっているような気がするので、スパムフィルタにはちょうどいいのではないかと思い、このベイズ理論を採用したフィルタをいろいろ見ていました。当初はスパムかどうかの判断はメールを見た時点で行うのがよいだろうと思い、メーラに組み込まれた Mozilla にはかなり期待したのですが、普段使い慣れた環境、Emacs + wanderlust があることと、特定のメーラだけがスパムフィルタ機能を持っているとクライアント依存性が高くなってしまい、折角の imap の利点が活かせないと思えてきて、結局あきらめました。

サーバベースのベイズフィルターを探したところ、いくつか見つかったのですが、一番簡単そうに思えた bogofilter をとりあえず使ってみることにしました。bogofilter は mbox 形式のファイルを使って簡単に spam / non-spam の登録ができ、procmail とも簡単に使えそうだったからです。本当は ruby で作っている Bsproc とか、A Plan for Spam の訳者の「自分でやってみた」みたいに自分でごりごり調整したりとかやってみたいのですが、余裕も腕もありません。

ちなみに日本語への対応ですが、手抜きですが次のようにやっています。

bogofilter では単語の切りわけを英語と同様にスペースで行っているようです。そこで、kakasi のわかち書き機能を使って日本語も単語ごとにスペースで区切ってからフィルタに送るようにしました。具体的には


% nkf -m -e spam | kakasi -w | bogofilter -s
% nkf -m -e good | kakasi -w | bogofilter -n

といった感じです。この数ヶ月間のスパムメール 5000通と、スパムでないメール 5000通ほどを登録して、procmail へも組み込みました。レシピには次のように書いています。


:0 HB
* ? nkf -m -e | kakasi -w | bogofilter -l
| dmail +bogofilter

dmail を使っているのは、uw-imapd を利用しているからです。本当はヘッダにスパム情報を入れてニンマリ眺めたいのですが、わかち書きしたあとに bogofilter に流しているので、それはできません。bogofilter の精度が上ってきたら、「-u」をつけて、自動的に学習させてもいいです。だれか bogofilter に kakasi を組み込んでくれないかな。

わたしのいい加減な日本語対応による認識の弱さは母数の大きさで確保します。こんなときに、数年前からコツコツ貯めたメールのアーカイブが役に立ちます。メーリングリストからメールマガジン、エラーメールや cron からの手紙まで、どんどんいれて学習させてしまっています。

かれこれ 2週間ほど bogofilter を運用していますが、だいたい一日1通か2通ほど、スパムを通常のメールとして通してしまいます。逆に必要なメールをスパムとしてしまうことは、この2週間で 8通。微妙なのは、メーリングリストで配信されたスパムです。個人的には欠番があるといやなので、スパムでない、と思っています。残りはだいたい英語のメールマガジンですが、一通、引用だけのメールもひっかかってしまいました。多くのメールを登録して、もうすこし使っていると良くなるかと期待しています。

スパムを大体除去できてよかったのは、PDA などでメールを読んだり、転送するときに不要なメールが来ないことです。また、スパムがない状態だと、メールの振り分けも簡単になりますし。

スパムメール、必要なメールを過去、大量に貯め込んでいる人にしか使えないかもしれませんが、そういう奇特なタイプの人にはおすすめできそうな気がしています。