实现朴素贝叶斯文本分类,但我不断得到零

时间:2015-05-23 17:28:45

标签: python algorithm nlp text-classification naivebayes

我使用Naive Bayes进行文本分类,这就是我为指定类别中的每个术语创建初始权重的方法:

  • term1:第1项存在的次数/类别A中的文档数
  • term2:第2期存在的次数/类别A中的文件数
  • term3:第3项存在的次数/类别A中的文件数

  • term1:第1项存在的次数/ B类文件数

  • term2:第2项存在的次数/ B类文件的数量
  • term3:第3项存在的次数/ B类文件的数量

使用新的测试文档我根据测试文档中是否存在该术语来调整权重:

  • term1:存在于测试文档中,因此我对categoryA_term1使用与上面相同的权重
  • term2:测试文档中不存在,因此我使用1-weight进行类别A_term2
  • term3:测试文档中不存在,因此我使用1-weight进行类别A_term3

  • term1:存在于测试文档中,因此我对categoryB_term1使用与上面相同的权重

  • term2:测试文档中不存在,因此我对categoryB_term2使用1-weight
  • term3:存在于测试文档中,因此我对categoryB_term2使用与上面相同的权重

然后我将每个类别的权重相乘。 当我创建每个句子的虚拟列车/测试文档时,这种方法有效,但是当我为列车/测试文档实现真实文档时,当我将它们全部加在一起时,我会保持为零。这是因为概率是如此之小,以至于在乘以这么多小数后,python只会收敛到零? 我很困难,我只是继续遇到同样的问题:(我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

正如Ed Cottrell评论的那样,如果遇到类别不在文档中的单词,您需要考虑会发生什么。您可以使用Laplace smoothing避免乘以0。如果在类别中的n个文档中看到k个单词,则将条件概率(k + 1)/(n + 2)或(k + a)/(n + 2a)分配给给定类别的单词。

不是采用许多小数的乘积,而是计算产品的对数是标准的。

log x*y = log x + log y
log(P(a0|c) * P(a1|c) * ... * P(ak|c))
    = log P(a0|c) + log P(a1|c) + ... + log P(ak|c)

然后你得到的数字总和不是那么小。避免使用log 0.如果需要,您可以在之后进行取幂,但通常只需将决策阈值转换为对数条件。