トップ «前の日記(2003/12/20(土)) 最新 次の日記(2003/12/23(火))» 編集

しののんだいあり〜


2003/12/21(日) bkbsfilter (bsfilter on beckrb)

[Becky] bkbsfilter (bsfilter on beckrb)

(2004-3-3 更新)

Becky! Ver.2(以下、Becky!)でSPAMを自動的に振り分けするプラグインです。 Rubyで書かれていて、Becky!でRubyスクリプトを走らせるプラグインであるBeckrbの上で走ります。

※bsfilterはnabekenさんの著作物です。 http://bsfilter.org/ bkbsfilterは、このbsfilterを元にbeckrb向けに改造を施したものです。このアーカイブ中にあるbsfilter.rbは、本家 bsfilterとは違いコマンドラインからは使用できません。

ダウンロード

bkbsfilter20040303.zip(削除済み)

特徴

  • 本家bsfilter譲りの特徴
    • bsfilter release 1.0.0がベース
    • 日本語メールに対応(ISO-2022-JP, Shift-JIS, UTF-8)
    • 日本語メールとそれ以外の言語のメールは別々にデータベースを作成
    • Base64やquoted-printableのメールにも対応
    • bsfilter譲りの用語として、SPAMメールでない普通のメールをCLEANメールと呼びます。
  • Becky!のプラグインですので、Becky!とシームレスに連携できます。
  • SPAMと判定したメールに対して、ゴミ箱に振り分けサーバからそのメールを削除薄い赤(0x8080FF)のカラーラベルを付加既読にするという処理を一括して行います。SPAMらしいと判定したメールに対しては、赤(0x0000FF)のカラーラベルを付加という処理を行い、既存の振り分け設定に従います。その他のメール(CLEAN)に対しては何も行わず、既存の振り分け設定に従います。
  • 仮に誤判定されたメールに対しても、簡単に再学習させることができます。

beckrb のインストール(2004-3-6更新)

まず、Becky! を終了させてください。Tietewさんのページから各ファイルをダウンロード&インストールします。

  • beckrb本体(Beckrb 0.9.7)は、ftp://ftp.tietew.jp/pub/becky/beckrb/beckrb-0.9.7.zipを解凍して出てきたbeckrb.dllbeckrb.soの2つを、Becky!をインストールしたフォルダにあるPlugInsフォルダにコピーしてください。その他のファイルは特に必要ありません。
  • Rubyランタイム(Ruby 1.8.1 2004-02-18)はftp://ftp.tietew.jp/pub/becky/beckrb/ruby-1.8.1-20040218_vc71.zipからダウンロードしたものを、そのままBecky!をインストールしたフォルダに解凍してください。
  • VC++.NET 2003 Run-Time は、ftp://ftp.tietew.jp/pub/becky/beckrb/msvcr71.zipを解凍して出てくる2つのdllファイルをWindowsシステムフォルダにコピーしてください。
    • WinXP の場合は C:\Windows\system32
    • Win2k の場合は C:\Winnt\system32
    • Win9x/Me の場合は C:\Windows\system
C:\
  \Program Files
    \RIMArts
      \B2
        B2.exe
        B2.hlp
        msvcrt-ruby18.dll (*) ruby〜.zip
        etc.
        \lib              (*) ruby〜.zip
          \ruby           (*) ruby〜.zip
            \1.8          (*) ruby〜.zip
              ...         (*) ruby〜.zip
            \site_ruby    (*) ruby〜.zip
              ...         (*) ruby〜.zip
        \PlugIns
          beckrb.dll      (*) beckrb〜.zip
          beckrb.so       (*) beckrb〜.zip
  \Windows
    \system32
      msvcp71.dll         (*) msvcr71.zip
      msvcr71.dll         (*) msvcr71.zip

これでBecky!を起動すると、Beckrbプラグインを組み込むかどうかを確認するダイアログが出てくるので、OK を押してください。Becky! のメニューに「スクリプト」という項目が増えていればインストール成功です。

bkbsfilter のインストール

再び Becky! を終了させてください。bkbsfilterXXXXXXXX.zipを解凍して下記のフォルダに展開してください。もしデータフォルダに scripts というフォルダがなかったら作ってください。

<データフォルダ> ※例:C:\Becky!\ユーザー名\
  \xxxxxxxx.mb
  \AddrBook
  etc.
  \scripts
    \bsfilter              (*)
      bsfilter.rb          (*)
      spamcheck.rb         (*)
      addclean.rb          (*)
      addspam.rb           (*)
      addclean_subspam.rb  (*)
      addspam_subclean.rb  (*)
      showhistory.rb       (*)
      getstat.rb           (*)
    \startup               (*)
      bkbsfilter.rb        (*)

Becky! を起動し、正常に起動できればインストール成功です。

準備編

まずはbkbsfilterにSPAMを学習させます。Becky!を起動して、とりあえず定期チェックを停止してください(学習中に他のメールが紛れ込むのを防ぐためです)。

bkbsfilterはインストールした直後の状態ではほとんど役に立ちません。このプラグインで使われている「ベイジアンフィルタ」と呼ばれるSPAM判別アルゴリズム(参考1参考2)は、SPAMに特徴的に含まれる単語を学習して、それを元にSPAMとそうでないメールを判定します。従って、あらかじめある程度学習させなければなりません。

まず、どこかのフォルダにSPAMメールをまとめて、SPAMメールを未読状態にして(例えば Becky! のリストビュー上で Ctrl+A → Ctrl+Shift+B)から、スクリプト→実行で先ほど展開したaddspam.rbを実行させてください。ステータスバーに進捗状況が表示されるので、「success end...」と出るまで待ってください。

次にCLEANなメールを学習させます。再びどこかのフォルダにCLEANなメールをまとめてぶちこんで、CLEANなメールを未読状態にしてから、スクリプト→実行でaddclean.rbを実行させてください。再び「success end...」が出るまで待ちます。

学習させるメール数の目安としては、だいたいSPAMメールの5倍程度のCLEANメールを用意することでしょうか? CLEAN の学習が少ないと、CLEANなメールをSPAMとして判定される確率が増えてしまいます。私はSPAM 100通、CLEAN 500通(購読しているMLから数十通ずつピックアップして、あとは個人メールを100通程度)を学習させました。

あとは、beckrb の「スクリプトの割り当て」で以下のようにスクリプトを割り当ててください。

  • リストビュー
選択メールをCLEANに登録addclean_subspam.rb
選択メールをSPAMに登録addspam_subclean.rb
選択メールをSPAMチェックspamcheck.rb
このメールのSPAM判定結果を見るgetstat.rb
  • ツリービュー
未読メールをCLEANに登録addclean_subspam.rb
未読メールをSPAMに登録addspam_subclean.rb
フォルダ内メールをSPAMチェックspamcheck.rb

あとはBecky!を必ず再起動して、定期チェックをONにして、普通にBecky!を運用してください。

メンテナンス編

このプラグインを運用していると、稀にSPAMをCLEANと判定されたり、CLEANをSPAMと判定されることがあると思います。判定結果はその都度bkbsfilterに学習されていくので、誤判定があった場合は教えてやらなければなりません。前者はSPAMの学習が足りないとき、後者はCLEANの学習が足りないときに起こりがちです。前者はまだ手間が増えるだけで済みますが、後者は面倒なことになるかもしれませんのでCLEANの学習は怠らないようにしましょう。

  • SPAM を CLEAN と判定されたら
    • おそらくどこかのフォルダに未読状態で振り分けられていると思います。フォルダを右クリックして「未読メールをSPAMに登録」としてください。(スクリプト→実行で addspam_subclean.rb を実行させてもOKです) その際、他のCLEANなメールが未読状態になっていないようにしてください。
    • またはそのメールを選択状態にして、メールを右クリックしたメニューから「選択メールをSPAMに登録」としてもOKです。
  • CLEAN を SPAM と判定されたら
    • ゴミ箱に赤系のカラーラベルがついて振り分けられていると思います。そのメールを未読状態にしてから、フォルダを右クリックして「未読メールをCLEANに登録」としてください。またこうなってしまったメールは、サーバから削除されてしまっているかもしれませんので、他の端末で同じメールボックスを受信しているようなときは気をつけてください。
    • またはそのメールを選択状態にして、メールを右クリックしたメニューから「選択メールをCLEANに登録」としてもOKです。
  • このメールはSPAM?CLEAN?
    • フォルダを右クリックして「フォルダ内メールをSPAMチェック」としてください。そのフォルダ内メール全て(未読既読問わず)のSPAMチェックを行って、Rubyコンソールに結果を出力します。このとき、チェック結果はデータベースに更新されません。
true or false, probability, Subject

一番最初が true なら SPAMと判定、false なら cleanと判定しています。次の数字は判定値です。この数字が 0.95 以上の時"SPAM"、0.9以上0.95未満の時"SPAMらしい"、0.9未満の時"CLEAN"になります。

  • このメールのSPAM判定結果の詳細は?
    • メールを右クリックして「このメールのSPAM判定結果を見る」としてください。そうすると、どのように単語が切り分けられて、それぞれの単語がどのような判定結果になったのかを見ることができます。各単語に対して、次の数字はその単語の出現回数、最後の数字は判定値です。1.0に近づくほど、SPAMメールに現れやすい単語ということになります。また、getstat.rbの最初の方にあるmode = "text"というのをmode = "html"とすると、出力がHTML形式になって、ちょっと見やすくなるかもしれません。ここを変更したら、Becky!を再起動してください。
  • 1週間分の振り分け履歴を見る
    • スクリプト→実行で、showhistory.rbを実行してください。1週間分の振り分け履歴が表示されます。

このプラグインのコンセプト

私がこのプラグインを作ったコンセプトとして、「できるだけ簡単に使えるようにする」というのがありますので、基本的に設定項目は設けない方針です。そのため、bigramオンリー、sdbmオンリー、Gary Robinson-Fisher方式オンリー、データベースは bsfilter.rb があるフォルダに保存、など基本的にそれらを簡単に切り替えられるようには作っていません。

どうしても気に入らなければ、自分でソースを編集してください。(^^;

  • でもその割にはできあがってみたら、初心者にあまり使いやすいものでもないなぁ、と思っていました。「こうすればもっと使いやすくなるよ!」というのを誰か教えていただけると嬉しいです。m(_ _)m

著作権

このプラグインの母体である bsfilter は nabeken さんの著作物です。http://bsfilter.org/

このプラグイン自体の著作権は私(しののん)が保持していますが、GPL ライセンスの元、自由に改造・改変・再配布してくださって構いません。

本日のツッコミ(全3件) [ツッコミを入れる]
通りすがり (2004/4/19(月) 14:11)

とりあえず、サーバからメールを削除するかどうかはベッキーのアカウントの設定に沿うようにしたほうがいいんじゃないでしょうか。初心者的には「残す設定にしてあるのにどうして残らないの?」ということでパニックを起こしかねないんじゃないかと。

kt (2004/11/1(月) 10:33)

いきなりごみ箱に入れてしまうとわかりにくいかと思って、決めうちですが_spamというフォルダを作っておいて、そこに振り分けようと思って、とりあえず、bkbsfilter.rb の52行目付近の<br>acts.push(Becky::ACTION_MOVEFOLDER, "\\!Trash\\")<br>を<br>acts.push(Becky::ACTION_MOVEFOLDER, "\\\!!!!Inbox\\_spam\\")<br>と書き換えたのですが、syncidx メソッドの中でTrash を見ているのは書き換えないで良いのでしょうか?<br>関係ない処理には見えるので書き換えずにテストしたらうまく動いているようでしたが、ご教授いただければ幸いです。

しののん (2004/11/1(月) 15:19)

syncidxメソッドはコメントの通りに、カレントフォルダの.idxファイル(Becky!が各フォルダごとに自動生成しているメール一覧ファイル。bkbsfilterではこの.idxファイルを使ってメール一覧を得ている)を最新情報に更新するためのものです。従って、振り分け処理とは関係ないので気にしないでOKです。

[]