[PR] 本ブログの商品紹介リンクには広告が含まれています
さて、驚異のスパム分別精度99.98%を誇る、新型ベイジアン=マルコフモデル搭載(笑)スパムフィルター
The CRM114 Discriminatorを日本語環境で使う実験です。
実験に入る前に、このCRM114の名前の由来について。
The CRM114 Discriminator(CRM114弁別器)は、キューブリックの映画「博士の異常な愛情」に出てくる小道具の名前です。
「博士の異常な愛情」正しくは「博士の異常な愛情 または私は如何にして心配するのを止めて水爆を愛するようになったか(原題:Dr. Strangelove: or How I Learned to Stop Worrying and Love the Bomb)」は米ソ冷戦時代の核抑止政策をテーマにしたブラックコメディで、ピンクパンサーやチャンスなどでおなじみのピーター・セラーズの1人3役やパットン大戦車軍団のジョージ・C・スコットなどの名演が光る、20世紀を代表する(と私が思っている)名作中の名作です。
この映画の中に出てくるCRM114は、米軍の基地とソ連に向けて飛ぶ戦略爆撃機の間の通信を司る機械です。通信を振り分けて、正しい“コード”がついた正当な通信しか受け付けないというしくみになっているという設定で、ストーリーの後半で重要な役割を持ちます。興味がある方は
DVDをどうぞ。
で、その名前をいただくスパムフィルターCRM114を日本語化してみようと思い立ったいきさつは
先日書いたとおり。今日はその実践編です。
CRM114をはじめとするベイジアンフィルターは、メールの中の単語の出現頻度を元にスパムかそうでないかの判断をします。そのためにプログラムがメールの文章を単語に切り分けるようにしてやらないといけません。
英語などでは単語の間にスペースがあるので、そういう言語圏で作られたこの手のプログラムはたいていスペースを目印に単語を切り分けて作業するという作り方になっています。ところが日本語などアジアの言葉は“分かち書き”しないのが普通なので、そういうプログラムを使うときはちょっと手を入れて、分析処理の前に分かち書き処理をするように改良しないと思ったような結果が得られません(余談ですが、実はドイツ語も似たような問題があるそうです。そういえばドイツ語は単語が分離したりくっついたりしますね)。
というわけで、今回試したQuick Hackは、実はメール解析エンジンにメールの文面を渡す前に、“ありもの”のツールで分かち書きをする処理を入れるだけ、というものです。
ありがたいことに、CRM114は汎用のフィルター作成専用言語+その言語を使って書いたスパムフィルターのスクリプトという構造になっていますので、こういう改造が簡単なのです。
分かち書きには、全文検索エンジンのnamazuなどでも使われているkakasiというツールを使います。また、メールで使われているテキストの文字コードをEUC-JPに統一して変換するために、これまた長年使われているnkfというツールを使います。
まず、
CRM114のサイトから、最新のプログラムをダウンロードしてきて、サーバー上にインストールします。インストールの詳しい手順の
英語のドキュメントも参照しながら作業してください。ざっとこんな手順です。
■CRM114本体をMakeする
- CRM114のソースを展開する
- 中にCRM114が使っている正規表現処理エンジンTREのソースが入っているので、まずそのディレクトリでconfigure(configureスクリプトに実行権限がついていないので注意)してmakeしてmake install
- つぎにCRM114のディレクトリに戻ってMakefileを適宜書き換え(/usr/以下にインストールするようになっているので、お好みで/usr/local/に。特にFreeBSDなどBSD系では、ライブラリパスやインクルードパスの追加が必要。また、-lintlがccコマンドの行の最後に来るように($LIBS)の場所などを変えないとエラーが出るかも)てからmakeしてmake install
でインストールできます。
必要に応じてlibintl、libtext、libiconvなどのライブラリも揃えてください。
■自分のホームディレクトリにファイルを準備
スパムフィルタを使うために、自分のディレクトリにスパムフィルタプログラムそのものであるスクリプトファイル、「辞書」ファイル、設定ファイルなどを揃えます。
- ソースファイルのディレクトリから、mailfilter.crm(スクリプト本体)、mailfilter.cf(スクリプトの設定ファイル)、*.mfpファイルをコピー
- 同じディレクトリで
/usr/bin/cssutil -r -b spam.css
/usr/bin/cssutil -r -b nonspam.css
を実行。スパムメールの中の単語を入れる辞書ファイル spam.css と、通常メールの辞書ファイル nonspam.css ができる - もしCRM114本体のインストール先を/usr/local/などに変えていたら、mailfilter.crmの1行目のプログラムのパスも合わせて書き換える。また、FreeBSDを使っている場合は同じく1行目の括弧から後ろを全部削除
さて、これでインストールはできました。procmailで、受信したメールをすべてmailfilter.crmを通すようにすれば、少なくとも英語スパムフィルターとしては動作するわけです。
あとは、日本語対応させるためにスクリプトをちょっと書き換えるだけです。
というところで夜も遅くなったので、続きはまた明日。
nkfと、できれば
kakasiがサーバーに入っていないようでしたら用意しておいてください。