计算在贝叶斯垃圾邮件过滤器中令牌成为垃圾邮件的概率

时间:2009-04-06 01:02:28

标签: c# algorithm bayesian spam-prevention

我最近编写了一个贝叶斯垃圾邮件过滤器,我使用Paul Graham's article Plan for Spaman implementation of it in C# I found on codeproject作为参考来创建我自己的过滤器。

我刚刚注意到CodeProject上的实现使用了唯一令牌的总数来计算令牌被垃圾邮件的概率(例如,如果火腿语料库总共包含10000个令牌但是1500个unqiue令牌,则1500用于计算概率为ngood),但在我的实现中,我使用了Paul Graham的文章中提到的帖子数量,这让我想知道哪一个应该更好地计算概率:

  1. 发布计数(如Paul Graham的文章中所述)
  2. 总唯一令牌数(在codeproject上的实现中使用)
  3. 总令牌数
  4. 包含的总令牌数(即那些具有b + g> = 5的令牌)
  5. 总计唯一包含的令牌数

4 个答案:

答案 0 :(得分:2)

This EACL paper by Karl-Michael Schneider(PDF)表示你应该使用多项式模型,即总令牌数,用于计算概率。请参阅论文了解具体计算方法。

答案 1 :(得分:1)

一般来说,大多数过滤器已超越格雷厄姆论文中列出的算法。我的建议是获取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。

答案 2 :(得分:0)

您可以更改代码以使用其他方法吗?然后,您可以使用不同的数据集进行测试,并发布结果。

答案 3 :(得分:0)

你可能想看一下经过时间考验的perl实现PopFile。它做得非常好。我很确定它是开源的,你可以看到他们使用的是什么公式。