1

我正在使用朴素贝叶斯进行文本分类,这就是我为指定类别中的每个术语创建初始权重的方式:

  • term1:term 1 存在的次数/categoryA 中的文档数
  • term2:term 2 存在的次数/categoryA 中的文档数
  • term3:term 3 存在的次数/categoryA 中的文档数

  • term1:term 1 存在的次数/categoryB 中的文档数

  • term2:term 2 存在的次数/categoryB 中的文档数
  • term3:term 3 存在的次数/categoryB 中的文档数

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

  • term1:存在于测试文档中,所以我对 categoryA_term1 使用与上面相同的权重
  • term2:在测试文档中不存在,所以我对 categoryA_term2 使用 1-weight
  • term3:在测试文档中不存在,所以我对 categoryA_term3 使用 1-weight

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

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

然后我将每个类别的权重相乘。这在我创建每个句子的虚拟训练/测试文档时有效,但是当我为训练/测试文档实现真实文档时,当我将它们全部组合在一起时,我一直保持为零。这是因为概率是如此之小,以至于在乘以这么多小数之后,python 只是收敛到零?我被困住了,我一直遇到同样的零问题:(我非常感谢你的帮助!

4

1 回答 1

1

正如 Ed Cottrell 评论的那样,您需要考虑如果遇到不在某个类别的文档中的单词会发生什么。您可以通过使用拉普拉斯平滑来避免乘以 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。如有必要,您可以事后求幂,但通常您只需将决策阈值转换为对数条件。

于 2015-05-23T17:57:39.980 回答