あまつぶ

10.25 【POPFileでメールを振り分け】

 スパムがあまりにも多くなってきたので、そろそろなにか対策を考えなくては。とはいっても、メールアドレスを変更するのは面倒だし、仮に変更したとしても、公開アドレスであれば再び名簿に載ってしまうのも時間の問題。Mailを使うという手もあるけど、なじんだPostinoをそのまま使いつつなんとかする方法を探りたい。
 そういえば、スパムフィルタって最近はどんな感じなんだろうと思い、あちこち探してみると、Paul Graham氏の、A Plan for Spam邦訳)というレポート(?)が目に留まった。スパムと普通のメールとで、それぞれ特徴的にあらわれる単語(トークン)を調べておき、受信したメールに、それらの言葉がどの程度含まれているかどうかによってスパムか普通のメールかを判別する、ということらしい。
 ここで出てくるベイズの定理というのは、こんな感じのもの。箱が2つ(AとB)あって、それぞれにいろいろな色のボールがはいっている。箱Aからボールを取り出した時に、そのボールの色が赤である確率がp、箱Bからボールを取り出した時に、そのボールの色が赤である確率がqとする。この時、どちらかの箱から取り出した赤いボールが、箱Aから取り出したものである確率は、p/(p+q)である、というのがベイズの定理である。これをスパムフィルタに当てはめると、スパムと普通のメールがあって、例えば、fasterという単語がそれらのメールに書かれている確率が、それぞれ0.028%、0.010%だったとする。この時、fasterという単語が使われているメールがスパムである確率は、0.028/(0.028+0.010)で、73.7%。これを他の単語についても同様に調べていくことによって、あるメールがスパムである確率が計算できる、ということになる。
 こんな単純な方法でスパムを分離できるのか……? という疑問も若干あるものの、確率を計算して統計的にスパムをフィルタリングしてしまう、というアイデアは非常におもしろい。なんでも、Netscapeのメールにこのフィルタが含まれているようだけど、メーラーを変えるつもりはないので、POPプロキシとして動作してくれるものがあれば理想的だ。日本語に対応していれば、なおよい。

 それからしばらくして、POPFileというメールフィルタを発見。日本語化もされていて、しかもPOPプロキシとして動作する。Perlで書かれているらしくてプラットフォームも選ばないし、これはぜひ試してみなくては(最初に試してみたときは、0.19.1というバージョンであったので、まずはそのバージョンでの話。0.20.0aへのバージョンアップについては、次回くらいの予定(今はすでに0.20.0aを使用中だけど)。動作環境は、Mac OS X 10.2.8+Developer Toolsで、gcc 3.3、Perl 5.6)。

 まず、0.19.1のマルチプラットフォーム版を本家のサイトからダウンロードする。次に、日本語に対応させるためのパッチをPOPFileの日本語化のサイトからダウンロードする(これを書いている時点で、パッチの最新バージョンは0.19.5であった)。
 POPFileのオリジナルと日本語化パッチを適当なフォルダに展開する(うちでは、~/work/にそれぞれを展開した)。そして、日本語化にあたって必要となる、KakasiやText::Kakasiなどをインストールする(インストール方法は日本語化の付属ドキュメントを参照)。うちの環境では、以前Namazuを入れた時にすでにKakasiをインストール済みだったので、特に作業の必要はなかった。ちなみに、以前Kakasiをmakeする時にエラーが出る、と書いたが、configureの際に「./configure --host=powerpc-apple-bsd」とすればエラーなく通るそうだ。MIME::Base64については、必要なのかどうかよくわからなかったが、とりあえずインストールしておいた。
 最後に日本語パッチのPOPFileフォルダの中身をオリジナルに上書きすれば完了だが、POPプロキシとして動作するポートと、設定変更や学習のためにブラウザからアクセスするポートを変更しておかないとそのままでは起動できなかった(管理者権限であれば起動できるけど)。このため、popfile.cfgファイルを編集して、html_portとpop3_portをそれぞれ18080と10110などにしておく。ここまできたら、「perl popfile.pl」で起動させる。Terminalに「POPFile Engine v0.19.1 running」と表示されたら成功だ。

 POPFileが動作したら、ブラウザで「http://localhost:設定したポート/」にアクセスすることによって設定の変更ができる。インタフェースが日本語になっていない場合は、まず、「Configuration」タブの言語設定で「Nihongo」を選ぶ。
 POPFileでフィルタリングをするためには、バケツと呼ばれるものを2つ以上作成しておく必要がある。最初は4つ設定されているようなので、必要に応じて増やしたり減らしたりすればいい。設定は、「バケツ」タブで行う。バケツの数が少ないほど、フィルタリングにかかる時間が短縮されるらしい。バケツ設定の「件名の変更」オプションがオンになっていると、そのバケツに振り分けられたメールのタイトルに[バケツ名]が追加される。ある程度学習させるまでは精度が低いので、オフにしておくのがおすすめ。
 メーリングリストなどにはいっている場合は、フィルタリングの速度を稼ぐため、マグネット設定をしておくと便利だ。設定は、「マグネット」タブで行う。メールのタイトルや送信者などを指定して、特定のバケツに振り分けることができる。ここで設定した条件に一致したメールは、単語のチェックをせずに振り分けされるので、高速化がはかられる、ということだ。

 次に、POPFileを経由してメールを受信するようにするため、メーラーの設定を変更する必要がある。どんなメーラーでも基本的には同じだと思うけど、Postinoの場合では、POPサーバ欄を、「127.0.0.1:設定したポート」にして、ログイン名欄を「もとのPOPサーバ:もとのログイン名」とする。要するに、POPサーバの設定をlocalhost(127.0.0.1)にして、ポートはpopfile.cfgで設定したポート、ログイン名(アカウント名)をもとのPOPサーバともとのログイン名とをコロン「:」でつないだものにする。送信などについては変更の必要なし。

 この状態でメールを受信すると、メールサーバ→POPFile→メーラーという流れでメールが届くようになる。POPFileを通る際に、メールの内容がチェックされて、バケツに振り分けられる。
 最初はどのメールがスパムでどのメールが普通のメールなのかをまったく知らないので、おそらく適当なフォルダに振り分けられている。いくつかメールを受信したら、ブラウザで設定画面を開き、「履歴」タブで最近受信したメールがどのように振り分けられたかを確認する。最初の100通くらいは、正しく振り分けられているかどうかに関わらず、正しい振り分け先を設定して再分類するようにする(再分類されたもの以外は単語を学習しないため)。
 メールは、サーバに残した状態で受信するだけでも履歴に残るため、ある程度メールがたまっていれば、サーバに残す設定にして受信して学習させ、もう一度受信するという手もある。うちでは、telnetでPOPFileにアクセスして、サーバにフォルダを切って残してあった普通のメールとスパムを空読みさせて学習させた(普通のメール45通、スパム30通くらい)。

 学習後、マグネットで振り分けられたメールを除いて受信したメールが176通、そのうち誤認識で正しく振り分けられなかったものが6通(うち3通は誤ってスパムと判定され、残り3通はスパムなのに普通のメールと判定された)で、認識率は96.6%(マグネットで振り分けたものをあわせると99.27%)。学習させればさせるほど精度があがっていくということなので、今後が楽しみだ。

 次回はPOPFile 0.20.0aの予定。

October 6, 2003 ↑ 2003 index → October 26, 2003