在python中使用朴素贝叶斯进行文档分类

时间:2012-05-09 12:17:34

标签: python nltk document-classification

我正在使用python中的朴素贝叶斯分类器进行文档分类项目。我已经使用了nltk python模块。这些文档来自路透社的数据集。我执行了预处理步骤,例如词干和删除词,并继续计算索引词的tf-idf。我使用这些值来训练分类器,但准确性很差(53%)。我该怎么做才能提高准确度?

4 个答案:

答案 0 :(得分:1)

可能有所帮助的几点:

  • 不要使用停止列表,它会降低准确性(但要删除标点符号)
  • 查看单词功能,仅举例前1000。减少维度将大大提高您的准确性;
  • 使用双字母以及unigrams - 这会提高准确度。

您还可以找到其他加权技术,例如log(1 + TF) * log(IDF),以提高准确性。祝你好运!

答案 1 :(得分:0)

分类器不起作用可能有很多原因,并且有很多方法可以调整它。

  • 你是否用足够的积极和消极的例子训练它?
  • 你是如何训练分类器的?你是否将每个单词都作为一个特征给出,或者你是否还为它进行了更多的功能训练(例如文本的长度)?
  • 你到底想要分类的是什么?指定的分类是否具有与其相关的特定单词?

所以问题相当广泛。也许如果您提供更多详细信息您可以获得更多相关建议。

答案 2 :(得分:0)

如果您使用的是nltk朴素贝叶斯分类器,那么您实际上可能正在使用平滑的多变量bernoulli 朴素贝叶斯文本分类。如果您的特征提取函数映射到所有浮点值的集合(这听起来可能就是这样),这可能是一个问题 你使用tf-idf)而不是所有布尔值的集合。

如果你的特征提取器返回tf-idf值,那么我认为nltk.NaiveBayesClassifier将检查它是否为真

tf-idf(word1_in_doc1) == tf-idf(word1_in_class1)

而不是任何适合tf-idf的连续分布的适当问题。

这可以解释您的准确性低,特别是如果您的训练集中有53%的时间出现一个类别。

您可能想查看scikit-learn中实现的多项式朴素贝叶斯分类器。

有关多项和多元伯努利分类器的更多信息,请参阅this very readable paper

答案 3 :(得分:0)

与Maus所说的一样,NLTK朴素贝叶斯(NB)使用伯努利模型加平滑来控制特征条件概率== 0(对于训练中分类器未见的特征)平滑的常用技术是拉普拉斯平滑你在条件概率的分子上加1,但我相信NLTK在分子上加0.5 .NLTK NB模型使用布尔值并根据它计算其条件,所以使用tf-idf作为一个特征不会产生好的或甚至有意义的结果。

如果你想留在NLTK内,那么你应该使用单词本身作为功能和双字母。查看Jacob Perkins关于使用NB在NLTK中进行文本处理的文章:http://streamhacker.com/tag/information-gain/。本文非常好地解释和演示了您可以对数据进行预处理的一些事项;它使用来自NLTK的电影评论语料库进行情感分类。

还有另一个用于文本处理的模块Python,称为scikit-learn,其中包含各种NB模型,如Multinomial NB,它使用每个单词的频率而不是每个单词的出现来计算其条件概率。

以下是关于NB以及Multinomial和Bernoulli模型如何工作的一些文献: http://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html;使用网页上的上一个/下一个按钮浏览文献。