我正在实施一个天真的贝叶斯垃圾邮件检测器,其功能是单词,我不确定我是否正确理解了算法。
这是我如何尝试实现算法:
在训练集中,我计算垃圾文本中文本中特定单词的出现频率以及非短信文本中出现的频率。我还存储了培训期间检查的垃圾邮件和非警察的总量。
在完成培训后,我假设我有一个新文本T
,我想将其归类。
我首先假设垃圾邮件(S)和非垃圾邮件(N)的先前概率为:
P(S) = 0.5
P(N) = 0.5
现在,我会检查W
T
假设某个字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
由此算法会将文本归类为垃圾邮件。
我无法理解的是以下情况:
假设我们有一个Word W
,它在垃圾邮件文本中存在0次,但在非垃圾邮件文本中存在1次。在这种情况下,垃圾邮件的后验概率为
P(W|S) = O / 50 = 0
因此整个概率也是0。
因此,这意味着只要文本中存在从未在垃圾邮件文本中找到的单词,但在非垃圾邮件文本中找到,该算法会将文本归类为非垃圾邮件,而不管其他任何单词和先前的probabilty。
这让我感到困惑,让我觉得我还没有正确理解算法。
答案 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|
是字典或词汇中的单词数