■ [Q3] スパムフィルタ再び
日本語スパムの判定精度があまり上がってこないので(半分くらいすり抜けてしまいます)、ここ数日どういう風に判定しているのかをログを取って調べてみました。すると、
- 日本語は2gramで処理しているので英語に比べてトークンの取りうる範囲が広い
- 日本語のメールはクリーンなメールに対してスパムの学習量が少ないため、多くのトークンがクリーンなメールにのみ現れたという状態になっている
- 特に単独では意味を成さないひらがな二文字のトークンがそのような状態になっている
- Paul Graham方式を採用しているため、最も特徴のある15トークンのみしか判定対象にならない
- この結果、クリーンなメールにのみ現れたことのあるひらがな二文字のトークン(スパム度が低い)が判定対象になりがち
- トークンのスパム度やクリーン度が同じ場合、先に現れたほうが優先されてしまうので、最初にそのようなトークンが現れると、後でスパムっぽいトークンが現れても判定対象にならない
- 長めのカタカナのトークンがあるとそれを2文字ずつに分割したトークンが特徴的になってしまう。たとえば、コンピュータは「コン」「ンピ」「ピュ」「ュー」「−タ」になるが、「コンピュータ」自体がクリーンなメールにしか現れたことがないと、判定対象になる15トークンのうち5トークンを占めてしまう
といったことがわかりました。上記のどの問題も大量に日本語のスパムを学習させると解消しそう(たとえば、ひらがな二文字のトークンはスパムにも現れるであろうからいずれトークンのクリーン度が下がるはず)なのですが、そこまで学習させるのは大変そうなので何らかの案を考えたほうが良さそうです。考えられるのは、
- 判定対象を15トークンから増やす
- トークンの取りうる範囲を減らす
- 形態素解析する
- ひらがなを含むトークンを無視する
- カタカナは2gramで分割せずにまとめてトークンとする
- トークンのスパム度やクリーン度が同じ場合には、ランダムにトークンを入れ替える
あたりでしょうか。(1)をやると英語のスパム判定に影響がでそうですし、(2)-(1)はパフォーマンスなどへの影響が大きそうです。(2)-(2), (2)-(3), (3)あたりはわりと簡単に試せそうです。あとは、Gary Robinson方式を試してみるという手もあります。