10. バグ 11. 更新履歴 12. 情報源 / リンク
rubyインタープリタをインストールし、アーカイブの中のbsfilter/bsfilterをPATHが通っている適当なディレクトリに置く。 OS、ディストリビューションによっては、ports、ebuild等のパッケージが用意されている場合もある。
あらかじめtokenごとのspam確率を求めておき、メールの中にspam確率の高いtokenが多く含まれていたら、そのメールがspamであると判定する。

実際に使用を開始する前に、spam確率を求めるという準備が必要である。 判定済のメール内のtoken出現回数を求め、spam / (clean + spam)により確率を求める。 --add-clean, --add-spam, --updateというコマンドで準備を行う。

実際に判定する前に、データベースを準備する必要がある。
1. cleanなメール中の単語を数える。
% bsfilter --add-clean ~/Mail/inbox/*2. spam中の単語を数える。
% bsfilter --add-spam ~/Mail/spam/*3. 単語ごとにclean/spamな確率を求める。
% bsfilter --update以上で、準備終了。
コマンドライン引数で判定対象のメールを指定する例。0から1の範囲で、spam確率が表示される。
% bsfilter ~/Mail/inbox/1 combined probability /home/nabeken/Mail/inbox/1 1 0.012701
標準入力から判定対象のメールを入力する例。spamの場合、exit statusが0になる。
~% bsfilter < ~/Mail/inbox/1 ; echo $status 1 ~% bsfilter < ~/Mail/spam/1 ; echo $status 0~/.procmailrcから呼ぶときのサンプルレシピその1。 exit statusを利用して、spamをspamフォルダに移動する。
:0 HB: * ? bsfilter -a spam/.~/.procmailrc</code>から呼ぶときのサンプルレシピその2。spamに X-Spam-Flag:、X-Spam-Probability:ヘッダを追加し、 X-Spam-Probabilityの示す確率に従い、blackフォルダ、grayフォルダに移動する。
:0 fw | /home/nabeken/bin/bsfilter --pipe --insert-flag --insert-probability :0 * ^X-Spam-Probability: *(1|0\.[89]) black/. :0 * ^X-Spam-Probability: *0\.[67] gray/.
以下の2通りの形式がある。
maintenance modeとfiltering modeがある。
標準入力からメールを与え、spamかどうか判定させるには、filtering modeで1の形式を使用する。 spamの場合は、exit statusが0になる。 ~/.procmailrcから呼び出す場合は、通常、この形式になる。
コマンドライン引数でメールのファイルネームを与え、spamかどうか判定させる際には、filtering modeで2の形式を使用する。 複数のメールを同時に判定することが出来る。結果は標準出力に表示される。
複数のコマンドを同時に指定できる。
## example of bsfilter.conf jtokenizer MeCab spam-cutoff 0.6
<p>IMAPでサーバと通信し、サーバに保存しているメールを学習、判定することができる。 判定結果に従い、ヘッダを挿入すること、指定したフォルダにメールを移動するすることが可能である。 </p>

cram-md5(AUTHENTICATE CRAM-MD5命令)、 login(AUTHENTICATE LOGIN命令)、 loginc(LOGIN命令)、 auto(cram-md5、login、logincの順で適当な方法を選択)が指定可能。デフォルトはauto。
</dl>
<p>--pipeは無効である。</p>
<p>bsfilter.confの例</p>
imap-server imap.example.com imap-auth login imap-user hanako imap-password open_sesame<p>inboxの中のX-Spam-Flagがついていないメールを判定し、判定結果をヘッダに入れ、spamの場合はinbox.spamに移動する例</p>
% bsfilter --imap --imap-fetch-unflagged --insert-flag --insert-probability --imap-folder-spam inbox.spam inbox
<p>POP proxyとして動作し、MUAがサーバからPOPで受信する経路の途中で、メールを判定しヘッダを挿入することが可能である。--auto-updateによる自動学習は行えるが、--add-clean、--add-spamによる学習は行えない。 </p> <p>pop.example.comのポート110でPOPサーバが動いているとする。</p>

<p> bsfilterがPOP proxyとして動作する。サーバとbsfilter間、bsfilterとMUA間はPOPを使用する。bsfilter内部で、メールを判定しヘッダを挿入する。この場合は、以下のようオプションを設定する(--pop-portのデフォルトは110、--pop-poryx-portのデフォルトは10110なので、省略可能)。 </p>
% bsfilter --pop --auto-update --insert-flag --insert-probability --pop-server pop.example.com --pop-port 110 --pop-proxy-port 10110

<p> pops.exmaple.comがPOP over SSLを使用している場合は、サーバとbsfilter間はPOP over SSL、bsfilterとMUA間はPOPを使用する。 </p>
% bsfilter --ssl --pop --auto-update --insert-flag --insert-probability --pop-server pops.example.com --pop-port 995 --pop-proxy-port 10110

デフォルトは0.0.0.0で全てのインターフェイスから受け取る。
POP proxyのルールを記述する。複数記述できる。--pop-server, --pop-port, --pop-proxy-port, --pop-userオプションの代りに使用する。 ルールのフォーマットは"pop-server:pop-port:proxy-interface:proxy-port[:pop-user]"
</dl>
0を指定すると、全てのファイルを判定、学習の対象にする。デフォルトは50000(50Kbytes)。
</dl>
<p>--pipe、及び、--add-clean等、学習に関するコマンド、オプションは無効である。</p>
<p>ruby標準ライブラリのnet/imap.rbの問題。ruby-1.8.3以降なら問題ないはず</p>
<p>メールボックスの名前が間違っていると思われる。ruby-1.8のimap.rbで以下のようにして調べるとよい。</p>
% ruby /usr/local/lib/ruby/1.8/net/imap.rb --user=taro --auth=login imap.example.com password: ****** taro@imap.example.com> list INBOX.junk INBOX
<p>mswin32版、cygwin版等、既にRubyがインストール済みの場合は、bsfilterのソースを普通に実行すればよい。</p>
<p>通常は0。--pipeオプションなしで判定対象メールを標準入力から与えた場合のみ、判定結果をexit statusから得ることが出来る。 その場合、spamは0、cleanは1というexit statusになる。</p>
<p>sdbmを使用可能にする。例えばdebianの場合は、libsdbm-rubyをインストールする。</p>
<p>bsfilter with mewを参照。</p>
<p>やまだあきらさんがwl-bsfilter.elを公開中。 \ay diary、 Re: Mark & Action (Re: 2種類の削除コマンド)から。</p>
<p>メールが日本語か否かをad hocに判断し、日本語らしき場合はnkf.soでEUC に変換している。Subjectや本文でISO-2022-JPと名乗りつつ、実際のコードは shift jisというケースも、nkfが救ってくれている模様。iconvが使えれば、unicodeもサポート。 </p> <p>各種データベースは、日本語用とその他用に分けてある。</p> <p>デフォルトでは連続する漢字2文字(bigram)、カタカナをtokenとして扱っている。 MeCab(和布蕪)による形態素解析を行うには、MeCabとrubyバインディングをインストールし、 --jtokenizer MeCabを指定すればよい。ChaSen, KAKASIについても同様。</p>
<p>誤判定されたメールが~/Mail/spam/123であるなら、</p>
% bsfilter --sub-spam --add-clean --update ~/Mail/spam/123<p>とする。~/Mail/spam/123をspam token databaseから削除し、 clean token databaseに追加し、確率データベースを更新する。</p>
<p>TLEC presents spamassassin を fetchmail から利用する方法 で紹介されている、 Linux-usersメイリングリストのspamをかき集めたものを利用するのが便利。</p>
<p>FreeBSD ports-jp MLの以下のアーカイブはspamのみ。</p> <ul>
</ul>
<p>Paul Graham方式と、Gary Robinson、Gary Robinson-Fisher方式との間で切り替えるには、 -uでspam確率データベースを更新するところからやり直す。spam確率データベースを更新するとき(maintenance mode)と、 メールをspamか判定させるとき(filtering mode)とで、同じ方式を-mオプションで指定する必要がある。</p> <p>Gary Robinson方式と、Gary Robinson-Fisher方式の間で切り替えるときには、-uは不要である。</p> <p>-c、-sでtokenを数えるところは方式に依存していないので、どの場合もやり直す必要はない。</p>
<p>tokenごとのspam確率を求める方法、それを使用してメールのspam確率を求める方法、両方とも異なる。</p> <p>Paul Graham方式でのtokenごとのspam確率をpg(w)とする。pg(w)を求める際の特徴を挙げる。</p> <ul>
</ul> <p>Gary Robinson方式でのtokenごとのspam確率をf(w)とする。以下のように求める。</p> <ul>
f(w) = ((s * robx) + (n * p(w))) / (robs + n)
とする。過去に出会ったことのないtokenのf(w)も、この式でカバーされる。 </ul> <p>Paul Graham方式では、特徴的な(0.5より遠い)pg(w)を持つ15のtokenを使用してcombining probabilityを求め、 それをメールのspam確率としている。</p> <p>Gary Robinson方式では、以下で求めたSをメールのspam確率とする(bsfilterが表示するのはS2)。</p>
P = 1 - ((1 - f(w1)) * (1 - f(w2)) * ... * (1 - f(wn))) ^ (1 / n) Q = 1 - (f(w1) * f(w2) * ... * f(wn)) ^ (1 / n) S = (P - Q) / (P + Q) S2 = (1 + S) / 2
<p>f(w)を求めるところまでは同じ。それ以降、Robinson-Fisher方式では以下のように計算する。</p>
P = ((1 - f(w1)) * (1 - f(w2)) * ... * (1 - f(wn))) ^ (1 / n) Q = (f(w1) * f(w2) * ... * f(wn)) ^ (1 / n) P' = 1 - chi-square(-2 * log(P), 2 * n) Q' = 1 - chi-square(-2 * log(Q), 2 * n) S = (1 + P' - Q') / 2
<p> コマンドライン引数で、mbox形式のファイルを指定することも可能であるが、 Content-lengthヘッダを見る機能がない。そのため、Solarisのように 本文中の"From"がエスケープされないシステムでは、本文中の"From"を UnixFromと見誤ることが考えられる。 bsfilterが表示するメールの番号と、MUAでの番号が食い違う障害が発生すると思われる。 </p> <p>コードが汚い。</p> <p>bsfilterという名前が安直。</p>
<p>筆者の日記の bsfilterカテゴリで代用。</p>
<ul>
</ul>
</ul>
</ul>
</ul>
</ul> }}}
| bsfilter () | 2023-12-26 15:51 |