bsfilterをWindows上で使ってみる

bsfilterはベイジアン(bayesian)方式によるspamフィルターソフトウェアである。 メールの内容を調べて、 spamらしいからしくないかを判定する。 spamでないメールやspamであるメールを教えて学習させることにより、 判定率を上げることができる。

bsfilterはいろいろな使い方ができるが、 ここではローカル(Windows)側でpop proxyとして導入する方法の一例を記す。

構成

ローカルにpop proxyとして常駐させ、 メールヘッダにspam判定の結果を追加させる。 そしてメールリーダの振り分け機能で、 spamをゴミ溜めフォルダに放り込む。

関係ファイルは、 すべてc:¥bsfilterフォルダに置くものとする。

ダウンロード

bsfilterの公式サイト
bsfilterはruby言語で書かれているが、 Windows用にはバイナリが提供されているので、 別途ruby環境を用意する必要はない。 Windows用cui版(bsfilter.exe)とgui版(bsfilterw.exe)のバイナリをダウンロードし、 c:¥bsfilterに保存する。
動作確認バージョンは、release 1.0.3 (revision 1.62)。

データベースの準備

予めいくつか溜めておいたspamを使って、 判定用データベースにspamらしい単語を教えておく。

適当なディレクトリに1メール1ファイルの形でspamを置き、 そのディレクトリで、

c:\bsfilter\bsfilter.exe --homedir c:\bsfilter -su -v *

とするか、 mbox形式のファイル(例えばspam-mbox.txt)を指定して、

c:\bsfilter\bsfilter.exe --homedir c:\bsfilter --mbox -su -v spam-mbox.txt

とする。 --homedirオプションのパラメータが、 以下に出てくるものと同じにしておくことに注意。 homedirに指定したディレクトリとデータベースファイルは、 (無ければ)自動的に作られる。

但し、 この作業を省略しても、 下記「データベースのメンテナンス」を行ってやれば、 自然と判定確率が上がっていくので、 あまり神経質になる必要はない。

pop proxy用設定ファイル

c:¥bsfilter¥pop.confを以下の内容で作成。

homedir c:\bsfilter
pop
pop-proxy-set mail.server.domain:::10110      (サーバホスト名は例)
insert-flag
insert-probability
auto-update
tasktray

複数のメールサーバにアクセスを行いたい場合は、 pop-proxy-setオプションを追加すればよい。 その際、それぞれproxy-port番号(上では10110)を異なる値にする必要がある。

例:
pop-proxy-set mail.server.domain:::10110
pop-proxy-set another.server.domain:::20110

起動用ショートカット作成

bsfilterw.exeのショートカットを作り、 プロパティのリンク先の項を

c:\bsfilter\bsfilterw.exe --config-file c:\bsfilter\pop.conf

とする。 ショートカットの名前は適当に変更して良い(例: bsfilter-pop)。 動作確認後は、スタートアップに置いて常に常駐するようにする。

常駐させるbsfilterはコンソールへの出力が不要なので、 gui版のbsfilterw.exeの方を使っていることに注意。 常駐させたbsfilterを停止させるには、 タスクトレイアイコンのコンテクストメニューからexitを選択する。

メールリーダの設定

メールリーダの方では、 ローカルのbsfilterがメールサーバであるかのように、 サーバホスト名をlocalhostに、 サーバのポート番号を10110に設定する。

サーバから読み込んできたメールには、 bsfilterによってX-Spam-FlagヘッダとX-Spam-Probabilityヘッダが追加されている。 ヘッダに、

X-Spam-Flag: Yes

とあれば、spamだと判定されたものであるので、 ゴミ溜めフォルダに振り分ければよい。 判定ミスがあった場合には、 判定用データベースを修正するべきだが、 その処理のことを考えて直接ゴミ箱に捨てるのではなく、 専用の振り分けフォルダを用意する。

※ 既に送信者やMLなどの区別で振り分けを行っている場合は、 通常、X-Spam-Flagによる判定を振り分けルールの最後に持ってくる方が良い。 ただし、積極的に学習(下記参照)をさせていて、 判定結果を逐一チェックしたい場合には、 逆に振り分けルールの最初に置くのがコツ。

データベースのメンテナンス

auto-updateオプションが指定してあるので、 spam判定データベースはメールを読み込むごとに自動的に学習していく。 一度spamと判定されたメール(の中の単語)は、 データベースにspam確率が高いものとして登録されるので、 次回同じ単語を多く含むメールが来ると、 より高い確率でspamらしいと判断される。 逆も同じ。 従って、 判定ミスがあったときには早めにデータベースを修正してやらないと、 判定ミスがどんどん増えてしまう。。

修正処理は、 誤判定されたメールを一時ファイルに書き出し、 データベース修正用のbsfilter起動バッチファイルに与えて行う。

例えばメールリーダBecky!の場合、 指定したメール(複数可)をmbox形式でエクスポートすることができるので、 誤判定されたメールをc:¥bsfilter¥tempmbox.txtという名前で書き出すようにする。 その後、 下のいずれかのバッチコマンドをパラメータ無しで実行すればよい。

spamじゃないのにspamだと判定された場合の修正用バッチファイル
--- c:\bsfilter\bsfilter-clean-mbox.bat ---

c:\bsfilter\bsfilter.exe --homedir c:\bsfilter -cSu -v --mbox c:\bsfilter\tempmbox.txt
pause

spamなのにspamじゃないと判定された場合の修正用バッチファイル
--- c:\bsfilter\bsfilter-spam-mbox.bat ---

c:\bsfilter\bsfilter.exe --homedir c:\bsfilter -sCu -v --mbox c:\bsfilter\tempmbox.txt
pause

この例では、 実際の操作手順が短くなるように、 一時ファイルの名前を予め決めており、 いちいち消すことをしない。 またこのとき、 修正の結果が確認できるように、 -v (verbose)オプションが付けてあり、 コンソールを使うことになるので、 cui版のbsfilter.exeを使っていることに注意。

mbox形式でエクスポートすることができない場合、 修正用スクリプトから--mboxオプションを抜く。 1メール1ファイルの形式でエクスポートできるメールリーダならば、 決めたフォルダ(例えばtempmails)の中に書き出すようにして、 c:¥bsfilter¥tempmails¥* を対象にすればよい。 一度に複数のメールのエクスポートができない場合は、 ひとつひとつ保存して行う。


Presented by kanai _at_ nadmin.org
初版 Nov. 25, 2003
改訂 Feb. 17, 2004
改訂 Jun. 08, 2004
Home