bogofilter のチューニング -- DBの構築と判定基準
(MacOSX & Cygwin on Windows)

  1. まえがき
  2. 日本語処理
  3. procmail との連携
  4. Wanderlust での運用
  5. DB の構築
  6. 判定基準の設定
  7. Links

5. DB の構築

5.1. HAM(non spam) 登録用のメール群(仮)作製

先ず、スパムでない色んなフォルダーから、ざっと1000通ほど、集めてフォルダーを作りました。これを、+ham.temp とします。

で、次のようにすれば、最初の wordlist.db が作られます。

bash$ cd ~/Mail/ham.temp
bash$ ls | sed 's/.*/echo & \; cat & \| bogofilter-nihongo.rb -n --unicode=no -k 10 -v/g' | sh

次に、spam を登録します。

5.2. spam の登録

5.2.1. 登録方針

私の所には、今、3万通以上の SPAM のストックが有りますが、これを全部登録すると、DBが大きくなりすぎて、重くなり、実用性にかけるようになります。そこで、次のようにしてみる事にしました。
  1. 先ず、スパム判定基準 ??? を決める
  2. spam 判定を実施する。
  3. spam だったら、捨てる
  4. spam で無いと判定されたら、wordlist.db に、spam として登録し、特定のフォルダに保存する。(+bogospam??? とでもする)
  5. これを、ストックしてある spam メール全てに繰り返す。

こうする事により、最初は全てのメールが、non spam と判定されるため、SPAM 登録しなければなりませんが、徐々に、その割合が減っていく事が期待されます。

5.2.2. スパム登録用の、procmail レシピ

上の作業を実施する為に、次のようなレシピを作って、~/.procmail/.procmail-spam として保存しました。

## bogofilter の、spamicity 出力を、SPAMICITY に入力して、後で活用する。
SPAMICITY=`~/bin/bogofilter-nihongo.rb -TT --unicode=no -k 10`

## spam の判定基準を設定
SPAM=   (1\\.|0\\.9)

## spamfilter
:0 HB
* ! $SPAMICITY ?? $SPAM
{
    :0 c
    | ~/bin/bogofilter-nihongo.rb -s -v --unicode=no -k 10

    :0
    bogospam090/.
}

:0
/dev/null

5.2.3. 登録作業

私の、スパムメールは、+spam に保存してあるので、次のようにします。

bash$ cd ~/Mail/spam
bash$ ls | sed 's/.*/echo & \; cat & \| procmail -m ~\/.procmail\/.procmail-spam/g' | sh

これで、必要なメールが登録され、使った、spam mail は、+bogospam090 に集められる事になります。

更に、一度この作業をしておくと、

事になります。


6. 判定基準の設定

6.1. bogofilter のデフォルト値

bash$ bogofilter -Q
# bogofilter version 1.0.2

robx        = 0.520000  # (5.20e-01)
robs        = 0.017800  # (1.78e-02)
min_dev     = 0.375000  # (3.75e-01)
ham_cutoff  = 0.450000  # (4.50e-01)
spam_cutoff = 0.990000  # (9.90e-01)
ns_esf      = 1.000000  # (1.00e+00)
sp_esf      = 1.000000  # (1.00e+00)

block-on-subnets  = No
encoding          = raw
charset-default   = iso-8859-1
replace-nonascii-characters = No
stats-in-header   = Yes
thresh-update     = 0.000000
timestamp         = Yes

spam-header-name  = X-Bogosity
spam-subject-tag  = ''
unsure-subject-tag = ''
header-format     = %h: %c, tests=bogofilter, spamicity=%p, version=%v
terse-format      = %1.1c %f
log-header-format = %h: %c, spamicity=%p, version=%v
log-update-format = register-%r, %w words, %m messages
spamicity-tags    = Spam, Ham, Unsure
spamicity-formats = %0.6f, %0.6f, %0.6f

となっていて、spam_cutoff = 0.990000 となっていて、厳しすぎそうです。

6.2. SPAM 判定値比較

6.2.1. wordlist.db への登録数の差

前章で、紹介した、 procmail レシピを使って、cutoff を、幾つか振ってみて、登録数の差を見てみました。

この例では、cutoff を、

で調べてます。

これを見ると、

が、判りました。

6.2.2. wordlist.db への登録割合の差

見方を変えて、1000件中何件登録されたか割合の推移を見てみました。

100件/1日以上の SPAM が来る、私としては、bogofilter をすり抜けて来て、マニュアルで判断させられるのは、5%以下で有って欲しい。

cutoff を下げると、正しいメールを、SPAM と誤判定する確率が増えます。が、私のところに来ているメールをざっと見る限り、0.9 を超えるのはなさそうです。取り敢えず、cutoff = 0.9 で、運用してみる事にしました。

これは、個々の環境に依る思いますので、トライされる事をお勧めします。

ここで紹介した方法は、最適 cutoff を調べる一手法としては、使えそうです。


7. Links