ベイジアンフィルタNaiveBayesianPHP 1.0 日本語版

岩波講座物理の世界 物理と情報 (3)  ベイズ統計と統計物理http://kitsune.info/blog/item/354

このシステムは、複数のカテゴリに分けられた文書内のテキストから分類方法を生成します。もしも spam と non-spam に分類したいのであれば、"spam" と "nonspam" の二つのカテゴリが必要でしょう。

汎用的なベイジアンフィルタみたい。MySQLに単語データぶち込んで使うようだ。Nucleusコメントスパム用に開発されているようだが、いろいろ使えそう。基本はMySQLだけどストレージがNaiveBayesianStorageってクラスにラップされているのでインターフェースさえあわせれば他のデータベースとかのシステムにも移植できそう。ストレージでやってることは「文章−単語」「文章−文章が分けられるべきカテゴリ(SPAM/NOSPAMとか)」の関連づけ(登録、変更、削除)、そしてそれぞれの数の集計(count)だけなんで、いろんなシステムに移植可能かと。


Wiki/Blogとかのコメントスパム対策にベイジアンフィルタ使うにはコメント本文だけじゃなくて REMOTE_HOST とかも情報としてぶち込めばおもしろそう。あとURLの数とか本文に対するURLの割合とか(割合の計算はベイジアンフィルタがしてくれるのか)


ベイジアンフィルタの基本は「嫌単語率による検知システム」なんで、トークン(単語)で区切らないといけないんだけど、日本語は難しそう。このソース内では split("[^-_A-Za-z0-9]+", $string); で分割しているんで日本語の判定には使えない。コメントスパムは海外から来るものが多いからそれで良いのか(笑)
いや、単語分割も別クラスを使えるような設計にすべきだろうな。kakasiとか使えるように。