首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用朴素贝叶斯检测垃圾邮件

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

Stack Overflow用户
提问于 2016-01-29 15:40:25
回答 1查看 98关注 0票数 0

我正在实现一个朴素的贝叶斯垃圾邮件检测器,其中的特征是文字,我不确定我是否理解正确的算法还。

这就是我如何实现算法的方法:

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

现在,训练结束后,假设我有一个新的文本T,我想分类。

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

代码语言:javascript
复制
P(S) = 0.5 
P(N) = 0.5

现在我检查包含在W中的每个单词T

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

代码语言:javascript
复制
P(W|S) = 20 / 50
P(W|N) = 2 / 50

然后计算出的概率是

代码语言:javascript
复制
P(S|W) = P(W|S) * P(S) = 0.2
P(N|W) = P(W|N) * P(N) = 0.02

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

我很难理解的是以下情况:

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

代码语言:javascript
复制
P(W|S) = O / 50 = 0

因此,整个概率也是0。

因此,这意味着,当一个单词出现在一个文本中,而这个文本从未在垃圾文本中发现,但是在一个非垃圾文本中,算法将文本分类为非垃圾文本,而不考虑任何其他单词和先前的概率。

这就是让我困惑的地方,让我觉得我还没有正确理解算法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-29 15:51:15

你必须实现加性平滑,以考虑到非字典词。

这种加性平滑将使字典P(W\\S)中不属于字典的单词的概率大于0。

这是可能性的修正公式:

代码语言:javascript
复制
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|是词典或词汇表中的单词数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35088348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档