我正在尝试实现一个朴素贝叶斯分类器来对文档进行分类,这些文档本质上是集合(而不是袋子)形式的特征,即每个特征包含一组独特的特征,每个特征在文档中最多只能出现一次。例如,你可以将这些特征视为文档的独特关键词。
我仔细阅读了Rennie等人发表在http://www.aaai.org/Papers/ICML/2003/ICML03-081.pdf的论文,但遇到了一个似乎未被解决的问题。具体来说,分类短文档时,由于文档的特征数量较少,导致后验概率显著提高;反之,长文档则相反。
这是因为后验概率的定义是(忽略分母):
P(class|document) = P(class) * P(document|class)
这可以展开为
P(class|document) = P(class) * P(feature1|class) * ... * P(featureK|class)
由此可见,特征较少的短文档会因为需要相乘的项较少而具有更高的后验概率。
例如,假设特征“foo”、“bar”和“baz”都在正向训练观察中出现。那么,仅包含特征“foo”的文档在正向类别中的后验概率会高于包含特征集{“foo”, “bar”, “baz”}的文档。这似乎违反直觉,但我还不确定如何解决这个问题。
是否有某种长度归一化的方法?一个想法是将文档的大小作为一个特征添加进去,但这似乎不太对,因为结果会受到训练数据中文档大小的影响而出现偏差。
回答:
这是一个好问题;现在我并不完全确定这里是否存在问题。后验概率只是给你提供了一个给定文档的每个类别的概率(即每个文档类别的概率)。因此,在对文档进行分类时,你只是在比较给定同一文档的后验概率,因此特征的数量不会改变(因为你没有跨文档比较),也就是说:
P(class1|document) = P(class1) * P(feature1|class1) * ... * P(featureK|class1)...P(classN|document) = P(classN) * P(feature1|classN) * ... * P(featureK|classN)
后验概率最高的类别将被称为文档的标签。因此,由于特征的数量似乎取决于文档而不是类别,所以不需要进行归一化。
我是否遗漏了什么?如果你想做一些比分类更多的事情,例如想要比较某个类别中最可能的文档,那么你就必须使用后验概率的实际定义:
P(class1|document) = P(class1) * P(feature1|class1) * ... * P(featureK|class1)/Sum_over_all_numerators
这样就可以正确地对不同特征长度的文档进行归一化。