SpamAssassin 3.2用日本語テストルール作成スクリプト
SpamAssassin 3.2用日本語テストルール作成スクリプトなんてものを作って公開しています。
http://spamassassin.jp/download/experimental/taki/
これは何?
これは,SpamAssassin用の日本語spamメールを検出するためのテストルールを自動作成するスクリプトです。spamコレクションとhamコレクションを投入して,テストルールを作成します。
次のように実行します。
$ ./sa-tokenizer.pl -r ~/Mail/spam > spam.txt The number of messages : 39525 The number of uniq messages: 28863 $ ./sa-tokenizer.pl -r ~/Mail/ham > ham.txt The number of messages : 4956 The number of uniq messages: 4778 $ ./sa-ja-testmaker.pl -s spam.txt -h ham.txt > body-ja.cf The spam words: The number of Japanese words : 1412565 The number of uniq words : 83553 The ham words: The number of Japanese words : 1841092 The number of uniq words : 197798 The number of removed words : 80325 The number of remaining uniq words: 3228 The number of made tests : 200
こうすると次のようなテストルールが生成されます。
# BODY_JA_JOSEI: 女性 spam=8311/1325054, ham=154/1841092, ratio=0.00543 body BODY_JA_JOSEI /女性/ describe BODY_JA_JOSEI JOSEI score BODY_JA_JOSEI 0.6 # BODY_JA_HAISHINKYOHI: 配信拒否 spam=5040/1325054, ham=0/1841092, ratio=0.0038 body BODY_JA_HAISHINKYOHI /配信拒否/ describe BODY_JA_HAISHINKYOHI HAISHINKYOHI score BODY_JA_HAISHINKYOHI 0.6 # BODY_JA_TOKO: 投稿 spam=5112/1325054, ham=37/1841092, ratio=0.00365 body BODY_JA_TOKO /投稿/ describe BODY_JA_TOKO TOKO score BODY_JA_TOKO 0.6
開発状況
スクリプトそのものについては,簡単に実装できそうなアイデアは取り入れています。
そのため,しばらくの間はスコアバランスの調整以外でこれ以上手を加えることはないです。
現在はこのスクリプトを使って作成したテストルールを評価して,スコアバランスの調整をしている段階です。
ちなみに,作成したテストルールも公開しています。
評価
今は自宅マシンの実運用環境でこのテストルールを試しています。
False Positiveを生じないようにhamデータに強烈に(10倍の)重み付けをしたためか,hamメールでは1〜2個のテストに偶に引っかかることがある程度です。スコアとしては1未満であるため,運用上問題はありません。
spamメールについては,本文が短い(5行程度の)メールや平仮名だらけのメールについては1〜2個くらいしか引っかかりません。文章が長いほどたくさんのテストに引っかかる傾向にあります。多いもので十数個のテストに引っかかっています。
出会い系サイトの勧誘メールはおおよそ6〜10行のものが多いのですが,4〜6個のテストに引っかかっています。1〜2のスコアが付いています。
露骨なアダルトサイト系のものは十数個のテストに引っかかりスコアが3〜4くらい付いています。
今後
SpamAssassinのベイジアンフィルタの自動学習のためにはheaderテストでスコア3以上,bodyテストでスコア3以上の評価が行われる必要があります。
そのため,この日本語のテストだけでスコア3以上が付くのが望ましいです。
スコアを全体的に上げるとFalse Positiveの危険性が高まるのですが,現状ではFalse Positiveは生じていないので,各テストのスコアを0.1くらい底上げしてみても良さそうです。