MENU

J2EE環境構築編

J2EE体験編

spamと闘う

メールをやりとりする場合にspamの問題を避けて通ることの難しい御時世になってしまいました。
spamのせいで重要なメールを読みそびれるようなことがあってはたまりません。

などと考える人は世界中にいるようで、対策ツールがあります。
それがBayesian filterと呼ばれるツールです。

基本的な考え方

メールの受信を拒否しようとする場合、特定のキーワードに合致するかどうか、という手法のみで判断すると、すぐにその裏をかいたものが登場します。
たとえば、小文字のl(エル)と数字の1を入れ換える、というような単純な変更でも、フィルターを潜り抜けてしまいます。
そのようなイタチごっこに見切りをつけ、統計的手法でspamの可能性を判断する、というものです。

Bayesian filterの中に、Bogofilterというものがありますが、この名前が性格を表していると思います。
つまり、完全ではない、ということです。
ここここあたりを読んでいただくと分かりますが、受信したいものと受信したくないものを完全に振り分けることは目的としていません。
100通受けとるspamのうち、98通位をフィルターできれば、1、2通位目にすることがあってもいいんじゃないの、という、ある種の割り切りを前提としています。
必要なメールを間違って捨ててしまう、という事態を避けるためには、その程度の漏れは甘受すべきなのでしょう。

もしも、受けとるspamが1日につき1通に満たないなら、この種のツールは不要でしょう。
逆に、毎日何通も受けとる、というような場合、この種のツールは大変有効に働くでしょう。

選択肢

フリーで入手可能で、Linuxでも利用できるものとして有名なものは

位でしょうか。

bsfilterのインストール

上記の3種類中、一番気に入ったのはbsfilterです。
理由は

  • 作者が最初から日本語を考慮して作成している
  • 軽く動作する

ことです。
他の2つについては、それぞれでお調べ下さい。
調べれば結構文書が豊富にあります。

インストール

rubyのインストール

bsfilterを利用するためには、rubyが必要です。
ソースを持ってきて、インストールしておきましょう。

tar zxf ruby-1.8.2.tar.gz
cd ruby-1.8.2
./configure --prefix=/usr
make 
make test
su
password:******
make install

MeCabのインストール

次に、形態素解析ツールMeCabをインストールします。
MeCabがなくても動くし、振りわけの精度が高まるわけでもないらしいのですが、せっかくなので(?)入れます。

必要なのは、MeCabのページから辿ることのできる、mecab-0.80.tar.gzとruby用バインディング、ipadic-2.6.1.tar.gzです。
バージョンに注意して下さい。
ipadic-2.6.3ではインストールできませんでした。

tar zxf mecab-0.80.tar.gz
cd mecab-0.80/dic
tar zxf ../../ipadic-2.6.1.tar.gz(ダウンロードした場所を指すようにする)
cd ../
./configure --prefix=/usr
make
su
password:******
make install

次に、ruby用のバインディングです。

tar zxf mecab-ruby-0.80.tar.gz
cd mecab-ruby-0.80
ruby extconf.rb
make
su
password:******
make install

bsfilterのインストール

ようやくbsfilterです。
といっても、bsfilter自体はスクリプトなので、PATHの通った場所にcpするだけです。
ただ、先ほども説明したように、MeCabを利用するので、一部書き換えます。

40行目辺りに

  Default_jtokenizer

という項目があるので、ここを

  Default_jtokenizer = "mecab"

とします。
ホームディレクトリの隠しファイルで設定できるのですが、面倒なのでスクリプト本体を書き換えました。

トレーニング

妙な見出しです。
しかし、Bayesian filterは、インストールしただけでは全く役に立ちません。
spamと非spamの特徴を、それぞれ学習していかなければならないのです。
ここが特徴で、多くのメールを学習させることで、振りわけの精度が高まるという特徴を持つのです。

といっても、spamなんか/dev/nullに直行だから、手元には残ってない、という人も多いでしょう。
また、実効性のある学習のためには、spamと非spamがそれぞれ1000通位は必要らしいので、これから1000通もspamを受けとらなければならないのか、と憂鬱になる人もいるでしょう。

そんな人のためにspamarcheveというサイトがあります。
世界中から日々spamが届けられ、アーカイブされています。
ここのFTPミラーから、10日分位を入手します。
1日分は200から2000通で、その中には日本語のものもそこそこ含まれているので、学習にはもってこいです。

展開したら、

for i in *.r2 ;do bsfilter -s --mbox --show-process $i;done

で、spamを学習します。
--show-processは精神衛生のために付けます。
学習には結構時間がかかるので、ひょっとして暴走してるんじゃ、なんていう無駄な心配をしなくてもすむように、進行具合を表示させます。

次に、cleanを学習します。フィルターによってはhamと呼んでいるものもあります。
要するに、受信したいメールのことです。
ほとんどの人の手元には、既に相当数のメールが保存されていると思います。
それらを

for i in Mail/inbox/* ;do bsfilter -c $i;done

として学習させます。
mboxの場合は--mboxを付けるのを忘れずに。
他に振り分けているディレクトリがあれば、それぞれ実行して学習させます。

.procmailrcに追加

さて、別頁で説明したように、私の方針はfetchmail+procmailで受信することです。
bsfilterはprocmailから利用できるので、そのように設定します。

といっても、

bsfilter --help

を実行した時に表示されるレシピを記載するだけです。

:0 fw
| bsfilter -a --pipe --insert-flag --insert-probability

以上の内容をprocmailrcの冒頭または任意の場所に挿入します。
この場合、スパム可能性とbsfilterの判断を示すヘッダがメールに挿入されるだけです。

フィルタの能力を信用するなら

:0 HB
* ? bsfilter -a
/dev/null

などという設定もできます。
これの意味が分からない人は

:0 HB
* ? bsfilter -a
spam/.

位にしておきましょう。
また、-aは一通判断する毎にデータベースをアップデートするので、環境によっては時間がかかります。
お好みで除去して下さい。
その場合、定期的に

bsfilter -u

を実行する必要があります。
cron辺りに頼んで、定期的に実行させるなり、手動で実行するなりしてください。

判断に誤りがあったら

spamなのにcleanと判断された場合

bsfilter -S -c hoge

とします。
逆に、cleanなのにspamと判断された場合

bsfilter -C -s hoge

とします。
お好みで

bsfilter -u

も実行しておきましょう。