我已经看过并尝试了关于其Multinomial朴素贝叶斯分类器的scikit-learn教程。
我想用它来分类文本文档,关于NB的问题是它将P(文档|标签)视为其所有独立功能(单词)的产物。现在,我需要尝试做3个trigram分类器,其中P(文档|标签)= P(wordX | wordX-1,wordX-2,label)* P(wordX-1 | wordX-2,wordX-3,标签)。
scikit learn支持什么我可以实现这种语言模型并扩展NB分类器以基于此进行分类?
答案 0 :(得分:4)
CountVectorizer
将为您提取三元组(使用ngram_range=(3, 3)
)。 text feature extraction documentation介绍了这一点。然后,只需使用与变换后的特征矩阵完全相同的MultinomialNB
。
请注意,这实际上是建模:
P(文件|标签)= P(字 X ,字 X-1 ,字 X-2 |标签)* P (word X-1 ,word X-2 ,word X-3 | label)* ...
有多不同?那么,第一个术语可以写成
P(word X ,word X-1 ,word X-2 | label)= P(word X < / sub> | word X-1 ,word X-2 ,label)* P(word X-1 ,word X -2 | label)
当然,所有其他条款也可以这样写,所以你最终会(为了简洁起见,在标签上删除下标和条件):
P(X | X-1,X-2)P(X-1 | X-2,X-3)... P(3 | 2,1)P(X-1,X-2) P(X-2,X-3)...... P(2,1)
现在,P(X-1,X-2)可写为P(X-1 | X-2)P(X-2)。因此,如果我们为所有这些条款执行此操作,我们就
P(X | X-1,X-2)P(X-1 | X-2,X-3)... P(3 | 2,1)P(X-1 | X-2) P(X-2 | X-3)... P(2 | 1)P(X-2)P(X-1)... P(1)
所以这实际上就像使用三元组,双字母组和非语音组(虽然不直接估计二元语法/单语格式)。