・4月の頭から spam を貯めてたところ、そろそろ 6000 通くらい貯ったので、メールを読み書きしている Plamo-3.1 ベースのマシンに bogofilter を導入してみた。

bogofilter 自体は http://bogofilter.sourceforge.net/ あたりからダウンロード。 bogofilter が GSL(GNU Science Library)を必要とするようなので、GNU のサイトから gsl-1.4.tar.gz をダウンロードして configure & install.

さて、bogofilter を、、と思って configure すると、Berkeley DB のヘッダとライブラリのバージョンが違う、旨のエラーに。あれれ、、と思って /usr/include を見ると、db.h はシンボリックリンクで db3/db.h を指しているのに、/usr/lib/libdb.so は libdb-4.0.so を指している模様。なぜこうなったんだろう、と首をひねりつつ、d1/bsd_db4.tgz のヘッダー部分を取り出して /usr/include/db.h を置き換え。そう言えば、Plamo-3.x だと、berkeley-db3 がa1/complibs.tgz に入ってたから、それがシンボリックリンクを作ってしまうと後からインストールしたパッケージがおかしくなる気がする。

db.h を置き換えると configure も通ったので bogofilter をビルドしてインストール。 bogofilter はベイズ理論に基づいて spam と非 spam(ham と言うらしい)を区別するから、ある程度まとまった量の spam メールが必要になるので spam を捨てずに貯めてたんだよなぁ。。

さっそく ~/Mail/Spam に行って、bogofilter のデータベースに spam に使われている単語を登録。ただ、bogofilter は単語の区切りに空白を必要とするようなので日本語の spam はそのままでは扱えないため、一度 kakasi を通して単語を切り出す処理が必要になるらしい。そのため、一つシェルスクリプトを作ってみた。

#!/bin/sh
nkf -m -e $* | kakasi -w | bogofilter -sv

上記フィルタを実行可能にしておいて、~/Mail/Spam で

find . -exec ~/bogofilter-spam.sh {} \; 

を実行すると bogofilter が ~/.bogofilter/wordlist.db を作り、そこに spam に使われている単語を登録した模様。

この状態で使えるのかな、と思ってたんだけど、実際に spam や ham を bogofilter -Iv で判定させてみると、どれも spamicity=0.52 になって区別が付かない模様。あれれ、、と思って spam でないメールを同じようなフィルター経由でデータベースに登録してやったら、無事 spam なメールと spam でないメールの bogocity に差がついて、spam と ham が区別できるようになりました。

kojima@celeron[~/Mail]% bogofilter -vI newspam/30
X-Bogosity: Yes, tests=bogofilter, spamicity=1.000000, version=0.17.5
kojima@celeron[~/Mail]% bogofilter -vI inbox/30097
X-Bogosity: No, tests=bogofilter, spamicity=0.500736, version=0.17.5

当然と言えば当然なんだけど、spam に出てくる単語だけではなく、ham に出てくる単語もデータベースに記録して、新しく届いたメールの単語が spam に使われているものか ham に使われているものかをチェックして spamicity を計算するみたい > bogofilter

この後、fetchmail + procmail が bogofilter を起動するように設定する作業が必要だったんだけど、テキストの量がかなり多くなったので、続きは明日にでも :-)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41