实现朴素的Bayes文本分类,但我一直得到零

2024-04-27 20:19:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 术语1:术语1存在的次数/类别中的文档数
  • 术语2:术语2存在的次数/类别中的文档数
  • 术语3:术语3存在的次数/类别中的文档数

  • 术语1:术语1存在的次数/类别b中的文档数

  • 术语2:术语2存在的次数/类别b中的文档数
  • 术语3:术语3存在的次数/类别b中的文档数

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

  • term1:存在于测试文档中,因此我对categoryA_term1使用相同的权重
  • term2:在测试文档中不存在,因此我使用1-weight作为categoryA_term2
  • term3:在测试文档中不存在,因此我使用1-weight for categoryA_term3

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

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

然后我乘以每个类别的权重。 当我创建每个句子都有一个句子的虚拟火车/测试文档时,这是可行的,但是当我为火车/测试文档实现真实文档时,当我把所有文档放在一起时,我总是得到零。这是因为概率很小,在乘以这么多个小数字后,python就收敛到零了吗?? 我被困住了,我总是遇到同样的零问题:(我真的很感谢你的帮助!在


Tags: term1文档文本类别次数句子权重术语
1条回答
网友
1楼 · 发布于 2024-04-27 20:19:03

正如EdCottrell评论的那样,您需要考虑如果您遇到一个不在类别文档中的单词会发生什么。使用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)

然后你有一个不是很小的数字的总和。避免使用日志0。如果需要的话,可以在之后进行求幂运算,但通常只需将决策阈值转换为对数上的条件。在

相关问题 更多 >