我正在尝试构建一个Naive Bayes分类器,它接收一个文档,并将文档视为一个单词和不同的书作为单独的类,将文档作为该书的概率(我知道这有点荒谬)但它是其他东西的起点)。我正在使用这个:http://www.stanford.edu/class/cs124/lec/naivebayes.pdf作为我如何做到这一点。
所以,例如,如果我们把文件d作为“福尔摩斯的回归”,然后看一堆p(b | d)的一堆书,“福尔摩斯的回归”会很高和“夏洛克福尔摩斯历险记”一样,詹姆斯·乔伊斯的“尤利西斯”也不太可能。
要做到这一点,我正在p(b|d) α p(d|b)p(b)
,其中p(b) = 1/(# of books)
和p(d|b)=sum over all words w in document[log(p(w|b))]
,其中p(w|b) = (# of times word w appears in book b + 1)/(# of words in book b + vocabularysize)
。
问题是,当我运行它时,它通常会得到正确的书作为第一个结果,有时会提供类似的书籍作为高结果,但它倾向于使用相同的真正长书集合填充顶部结果,最不可能的书总是诗歌,散文和短篇小说。当我在其中一个短篇小说上运行时,它仍然包含所有短文档,包括我正在查看的文档,具有最低或接近最低的非标准化概率,而最可能的书籍仍然是真正的长文本。因此,这种模式的作品,如果一本书足够长,从正确的单词给予它的重量将足以将它放在顶部,但如果一本书太短,那么这个重量将是不够的并且它仍然接近底部,由其他书籍的绝对长度支配。
为什么会发生这种情况?如何修复我的模型,以免发生这种情况?
答案 0 :(得分:2)
很长的书会有很多单词。 Naive Bayes会赞成这些文件,因为您在输入中使用的所有单词很可能在很长的书中出现过多次。因为它是一个特征向量(我假设你使用的是unigrams),所以单词的顺序无关紧要。因此,您的输入中的单词可能会与一本长书相匹配,因为这些单词出现在那本书中。
1)如果你想要很好的概率,你应该远离天真的贝叶斯。独立性假设导致非常糟糕的概率结果。关于其概率值的问题有many papers。
2)文档长度的数量级变化可能难以处理。您可以查找余弦相似度函数,以获得有关我们在处理文本时使用规范化的原因的一些解释 - 并尝试将其应用于特征向量。
3)如果你想坚持天真的海湾,你可能想尝试使用伯努利分布而不是多项式。它应该受字数/文件长度的影响较小,因为这似乎是你的问题。
4)您可能希望将stop words应用于您的语料库。
假设您正在自学,对待这是一个标准的分类问题是一个良好的开端。如果您对正在处理的特定任务更感兴趣 - 您可能需要查看作者身份识别,这与您尝试做的事情非常密切相关(给出文本,识别撰写文本的人 - 您说的是一个文本,识别它来自哪本书)。在你的情况下,“作者”将成为文本来自的书籍。
答案 1 :(得分:1)
这是多项分类器的标准问题,正如Raff所提到的,由于较大的文档淹没了训练中的总计数。看起来你在大多数时候都得到了正确的结果,但是你希望后验是准确的吗?朴素贝叶斯是一个非常糟糕的概率模型,希望现实的后验极不可能。
更好的文档概率模型是Dirichlet Compound Multinomial和Latent Dirichlet Allocation。这些都是生成性的。既然你只对后验课程感兴趣,你应该考虑一个歧视性的模型。 Naive Bayes的判别版本是MaxEnt / Logistic回归/ Log-Linear模型(这些都是相同的,但您可能会听到一个术语使用或另一个术语)。您还可以使用带有Platt方法的SVM来获得概率,或者使用具有softmax输出和交叉熵损失的神经网络。对于判别模型,我建议你用每个文档中的单词总和来标准化你的计数,因为这会使所有文档计数相同。但是,您不能为生成模型执行此操作,因为它们是为计数数据定义的。
答案 2 :(得分:0)
p(w|b)
中的分母似乎很奇怪。你应该尝试只使用
p(w|b) = (# of times word w appears in book b + 1)/(# of words in book b)