8

私は最近、ベイジアン スパム フィルターを作成しました。Paul Graham の記事 Plan for Spam、codeproject で見つけた C# での実装を参考にして、独自のフィルターを作成しました。

CodeProject の実装では、トークンがスパムである確率を計算する際に一意のトークンの総数を使用していることに気付きました (たとえば、ハム コーパスに合計で 10000 のトークンが含まれているが、1500 の一意のトークンが含まれている場合、1500 は確率の計算に ngood として使用されます)。 )、しかし、私の実装では、Paul Graham の記事で言及されているように、投稿の数を使用しました。

  1. 投稿数 (Paul Graham の記事に記載)
  2. 一意のトークンの総数 (codeproject の実装で使用)
  3. 総トークン数
  4. 含まれるトークンの総数 (つまり、b + g >= 5 のトークン)
  5. 含まれる一意のトークンの合計数
4

4 に答える 4

2

Karl-Michael SchneiderによるこのEACLペーパー(PDF)は、確率の計算に多項モデル、つまり合計トークン数を使用する必要があると述べています。正確な計算については、論文を参照してください。

于 2009-04-16T19:15:30.783 に答える
1

一般に、ほとんどのフィルターは、Graham の論文で概説されているアルゴリズムを超えています。SpamBayes のソースを入手し、spambayes/classifier.py (特に) と spambayes/tokenizer.py (特に上部) で概説されているコメントを読むことをお勧めします。このような決定を評価するために行われた初期の実験については、多くの歴史があります。

FWIW、現在の SpamBayes コードでは、確率は次のように計算されます (spamcount と hamcount はトークンが表示されたメッセージの数 (任意の回数)、nham と nspam はメッセージの総数です)。

hamratio = hamcount / nham
spamratio = spamcount / nspam
prob = spamratio / (hamratio + spamratio)
S = options["Classifier", "unknown_word_strength"]
StimesX = S * options["Classifier", "unknown_word_prob"]
n = hamcount + spamcount
prob = (StimesX + n * prob) / (S + n)

unknown_word_strength は (デフォルトで) 0.45、unknown_word_prob は (デフォルトで) 0.5 です。

于 2009-04-30T09:44:33.883 に答える
0

他の方法を使用するようにコードを変更できますか? 次に、別のデータ セットでテストし、結果を投稿できます。

于 2009-04-10T08:58:17.983 に答える