我现在正在使用nltk_classifier对句子的类别进行分类。
我已经使用11000个句子的特征集训练了分类器。
train_set, test_set = featuresets[1000:], featuresets[:1000]classifier = naivebayes.NaiveBayesClassifier.train(train_set)
但是我想添加更多的(句子,类别)特征集来提升分类器的性能。我知道的唯一方法是将新的特征集添加到已经学习过的特征集列表中。这样做会创建一个新的分类器。但我认为这种方法效率不高,因为训练一个或更少的句子需要很多时间。
有没有什么好的方法可以通过添加特征集来提高分类器的质量?
回答:
有两点需要注意。
-
朴素贝叶斯通常非常快。它只会遍历一次所有训练数据并累积特征-类别共现统计数据。之后,它使用这些统计数据构建模型。通常情况下,只需用新的(增量)数据重新训练模型即可,不会有什么问题。
-
当有新数据时,不需要重新执行上述步骤,只要你仍然存储了特征-类别统计数据。现在你只需像步骤1中那样处理新数据,并持续更新特征-类别共现统计数据。最终,你会得到新的分子(
m
)和分母(n
),这些适用于类先验概率P(C)
和给定类别的特征概率P(W|C)
。你可以通过m/n
计算出这些概率。
友情提示贝叶斯公式在文档分类中的应用:
— 给定一个文档 D
,文档属于类别 C_j
的概率是:
P(C_j|D) = P(D|C_j)*P(C_j)/P(D)
— 该概率与以下成比例:
P(C_j|D) ~ P(W1|C_j) P(W2|C_j) ... P(Wk|C_j) * P(C_j)
基于以下假设:
- 朴素贝叶斯假设(文档中的所有词,例如
W1, W2, ..., Wk
是独立的), - 舍弃
P(D)
,因为每个类别的P(D)
作为分母是相同的(因此我们说成比例而不是等于)。
— 现在右侧的所有概率都可以通过相应的分数(m/n
)计算,其中 m
和 n
存储在特征-类别共现矩阵中(或可以从中推导出来)。