我使用Naive Bayes进行文本分类这是我为指定类别中的每个术语创建初始权重的方式:
TyM1:类别1的存在次数/类别中的文档数
TyM2:第2项的存在次数/类别中的文档数
TrM3:类别3的存在次数/类别中的文档数
TyM1:在类别B中存在1项的次数
TyM2:在类别B中存在的次数2项/文档数
第3项的次数/文件编号
有了新的测试文档,我根据测试文档中是否存在这个词来调整权重:
TMM1:存在于测试文档中,因此我使用与上面的CyryAyTyM1相同的权重
TyM2:在测试文档中不存在,所以我使用1-权重为CyryYyTyM2
TyM3:在测试文档中不存在,所以我使用1-权重来分类
TMM1:存在于测试文档中,因此我使用与上面的Cype一样的权重
TyM2:在测试文档中不存在,所以我使用1-权重来分类BytMyTyM2。
TrM3:存在于测试文档中,因此我使用与CyryByTyM2相同的权重
然后我把每一类的权重相乘。
当我为每个句子创建一个虚拟的训练/测试文档时,这是有效的,但是当我为训练/测试文档实现真正的文档时,当我将所有这些文档组合在一起时,我会一直得到零。这是不是因为概率太小了,在乘以这么多小的数之后,python就收敛到零了?是吗?
我被困在这个零问题上了:(我真的很感谢你的帮助!
最佳答案
正如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如果有必要,可以在之后进行指数运算,但通常只需将决策阈值转换为对数条件。
关于python - 实现朴素贝叶斯文本分类,但我一直得到零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30415636/