8

我最近写了一个贝叶斯垃圾邮件过滤器,我使用Paul Graham 的文章 Plan for Spam我在 codeproject 上找到的 C# 中的实现作为创建我自己的过滤器的参考。

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

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

4 回答 4

2

Karl-Michael Schneider (PDF) 的这篇 EACL 论文说,您应该使用多项模型(即总令牌数)来计算概率。具体计算请参见论文。

于 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 回答
0

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

于 2009-04-14T15:50:58.253 回答