sf-0.6 -- spam filter for UNIX-like systems

参照回数[counter] (since 2006.10.10)

Google

ENGLISH?

Copyright (C) 2006 Masahiko Ito

These programs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

These programs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with these programs; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Mail suggestions and bug reports for these programs to
"Masahiko Ito" <m-ito@myh.no-ip.org>

History

What's this ?

クライアント側でのspam対策用スクリプト群です。

ベイズ理論( こちらのページで詳しい解説をされています )を理解しづらいと感じたお馬鹿な私が、もっとシンプル な考え方でも効果が見込めるのでは?と思い、自分なりの仮説に基 づいてフィルタを実装してみたら、結構いけてしまったという代物。

Download

Contribution

Preinstall

sf-0.6はスクリプトプログラム(群)ですので、内部で様々なソフトウェアを 利用しています。特に以下のソフトウェアはデフォルトでインストールされ てない可能性がありますので、事前にインストールされているか確認してく ださい。

Install

Algorithm

非spam学習テーブル(以下whiteテーブル)は非spamメール中の「単語」と「出現回数」を保持し、 spam学習テーブル(以下blackテーブル)はspamメール中の「単語」と「出現回数」を保持します。
create table t_white (
  term    text primary key,
  count   integer
);
create table t_black (
  term    text primary key,
  count   integer
);
あるメールに関して検査を行う場合、まずそのメール本文を「単語(tango1〜n)」に分解し、 それぞれの「出現回数(count1〜n)」をカウントします。

「単語(tango1)」を検索キーにしてwhiteテーブルを検索し

              「whiteテーブル中の出現回数」x「出現回数(count1)」
white_score = --------------------------------------------------
                 「whiteテーブル中の全単語の出現回数の総和」
を求めます。

「単語(tango1)」を検索キーにしてblackテーブルを検索し

              「blackテーブル中の出現回数」x「出現回数(count1)」
black_score = --------------------------------------------------
                 「blackテーブル中の全単語の出現回数の総和」
を求めます。

white_scoreとblack_scoreから「単語(tango1)」に対する「スコア」を求めます。

                white_score 
スコア = ------------------------- - 0.5
         white_score + black_score 
「スコア」は-0.5〜+0.5の値を取り、マイナス値はspam傾向が高く、プラス値は非spam傾向が 高い単語であることを意味します。

以下、同様に残りの「単語」についても「スコア」を求め、「単語(tango1〜n)」の全「スコア」を合計 し、最終的に、この合計値がマイナス値ならばspamと判断します。

How to use

sf_init.sh

$ sf_init.sh -h
Usage : sf_init.sh
Initialize database.
spamの判断に利用するデータベースを初期化します。 システムを利用する一番最初に一度だけ実行します。

sf_add.sh

$ sf_add.sh -h
Usage : sf_add.sh [-w|--white|-b|--black] [-v|--vacuum] [file ...]
Add data to database.
  -w, --white  add data to white database.
  -b, --black  add data to black database.
  -v, --vacuum vacuum after add.
データベースの学習(追加)を行います。日々やって来るspamのうち、正しくspamと 判断出来なかった物を-bオプションで学習させます。また、非spamのうち、誤って spamと判断された物を-wオプションで学習させます。システムの利用前に、spam、非spam をそれぞれ100メール程度学習させておけば、90%以上(?)の精度で振り分け出来ます。

sf_del.sh

$ sf_del.sh -h
Usage : sf_del.sh [-w|--white|-b|--black] [-v|--vacuum] [file ...]
Del data from database.
  -w, --white  del data from white database.
  -b, --black  del data from black database.
  -v, --vacuum vacuum after del.
データベースの学習(削除)を行います。学習ミスを取り消す場合に利用します。

sf_check.sh

$ sf_check.sh -h
Usage : sf_check.sh [-w|--white|-b|--black] [file ...]
Check file.
  -w, --white  check white?
  -b, --black  check black?
return 0 when check is true.
return 1 when check is false.
入力ファイル(またはstdin)の内容を検査し、検査スコア(実数値)をstdoutに出力後、検査結果が真なら0、偽なら1を返します。 検査スコアは、spamの場合マイナス値となり、spamでない場合は0.0以上の値となります。無学習の場合の検査スコアは常に 0.0以上となります。

fetchmail, procmailとの連携

実際のspam振り分けに関してはfetchmail, procmailとの連携が良いと思います。

.fetchmailrc

poll pop.anywhere.org
proto pop3
user POP_ACCOUNT_NAME
password POP_PASSWORD
is LOCAL_USERNAME
no keep
flush
no fetchall
mda "/usr/bin/procmail -f %F"
最後の「mda "/usr/bin/procmail -f %F"」が指定されていないと、fetchmailは受け取ったメッ セージをlocalのsendmailに投げます。sendmailはマルチに処理を受け付けますので、一度 に大量のメールをpopサーバから受けると、ロードアベレージが急激に増加してしまいます。 「mda "/usr/bin/procmail -f %F"」が指定されているとfetchmailはlocalへの配送のためにprocmail を直接呼び出すので、1通ずつ順番に処理されるためロードアベレージが極端に増加する事 を避けることができます。

.procmailrc

:0 HB
* ? sf_check.sh -b
/home/ほげ/Mail/spam/.
sf_check.shによりspam(-b)である事を検査し、真であれば/home/ほげ/Mail/spam/に メールを格納します。

BUGS


m-ito@myh.no-ip.org

[更新]