使用朴素贝叶斯检测垃圾邮件

Using naive-bayes for detecting spam

我正在实现一个朴素的贝叶斯垃圾邮件检测器,它的特征是单词,我不确定我是否正确理解了算法。

这是我尝试实现算法的方式:

在训练集中,我计算文本中的特定单词在垃圾邮件文本中出现的频率以及它在非垃圾邮件文本中出现的频率。我还存储了训练期间检查的垃圾邮件和非垃圾邮件的总量。

现在训练完成后假设我有一个新文本 T 我想对其进行分类。

我首先假设垃圾邮件 (S) 和非垃圾邮件 (N) 的先验概率为:

P(S) = 0.5 
P(N) = 0.5

现在我检查 T

中包含的每个单词 W

假设单词 W 在垃圾邮件文本中出现 20 次,在非垃圾邮件文本中出现 2 次。检查的垃圾邮件总数是 50,检查的非垃圾邮件总数也是 50,所以我有后验概率:

P(W|S) = 20 / 50
P(W|N) = 2 / 50

计算出的概率将是

P(S|W) = P(W|S) * P(S) = 0.2
P(N|W) = P(W|N) * P(N) = 0.02

由此算法会将文本分类为垃圾邮件。

我比较费解的是下面的情况:

假设我们有一个单词 W 在垃圾邮件文本中出现 0 次,但在非垃圾邮件文本中出现 1 次。在这种情况下,垃圾邮件的后验概率为

P(W|S) = O / 50 = 0

因此整个概率也将为 0。

因此,这意味着每当文本中出现一个词,而该词从未在垃圾邮件文本中找到,但在非垃圾邮件文本中找到时,算法会将文本归类为非垃圾邮件,而不管任何其他词和先验概率。

这让我感到困惑,让我觉得我还没有正确理解算法。

您必须实施加法平滑才能将非词典单词考虑在内。

这个加法平滑会让一个词不属于词典的概率P(W|S) > 0。

这是可能性的修改公式:

P(word|class) = sum ( I(word,D) + lambda) / |D_class| + lambda|V| ) on each document D belonging to all documents in the class.

其中 I(word,document) 是指示函数,如果文档包含单词,则 returns 1 否则 0

lambda 是一个选定的常量

|D_class|是class

中的文档数

|V|是词典或词汇表中的单词数