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>
ベイズ理論( こちらのページで詳しい解説をされています )を理解しづらいと感じたお馬鹿な私が、もっとシンプル な考え方でも効果が見込めるのでは?と思い、自分なりの仮説に基 づいてフィルタを実装してみたら、結構いけてしまったという代物。
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と判断します。
$ sf_init.sh -h Usage : sf_init.sh Initialize database.spamの判断に利用するデータベースを初期化します。 システムを利用する一番最初に一度だけ実行します。
$ 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 -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 -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以上となります。
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通ずつ順番に処理されるためロードアベレージが極端に増加する事 を避けることができます。
:0 HB * ? sf_check.sh -b /home/ほげ/Mail/spam/.sf_check.shによりspam(-b)である事を検査し、真であれば/home/ほげ/Mail/spam/に メールを格納します。