使用 naive-bayes 检测垃圾邮件

Posted

技术标签:

【中文标题】使用 naive-bayes 检测垃圾邮件【英文标题】:Using naive-bayes for detecting spam 【发布时间】:2016-05-07 09:56:23 【问题描述】:

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

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

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

现在训练完成后假设我有一个新文本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。

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

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

【问题讨论】:

【参考方案1】:

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

这种附加平滑将使不属于字典 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) 是指示函数,如果文档包含单词则返回1,否则返回0

lambda 是一个选定的常量

|D_class|是类中的文档数

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

【讨论】:

以上是关于使用 naive-bayes 检测垃圾邮件的主要内容,如果未能解决你的问题,请参考以下文章

用于电子邮件垃圾邮件检测的神经网络输入

可靠地检测基于 PhantomJS 的垃圾邮件机器人

目前最好的垃圾邮件过滤算法

垃圾邮件分类 - 机器学习

基于卷积神经网络(CNN)的中文垃圾邮件检测

用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)