2

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

4

4 回答 4

1

可能有帮助的几点:

  • 不要使用停止列表,它会降低准确性(但请删除标点符号)
  • 查看单词特征,仅以前 1000 个为例。降低维度会大大提高你的准确性;
  • 使用二元组和一元组 - 这会提高一点准确性。

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

于 2014-01-15T09:47:17.933 回答
0

分类器无法正常工作的原因可能有很多,并且有很多方法可以对其进行调整。

  • 你用足够多的正面和负面的例子来训练它吗?
  • 你是如何训练分类器的?您是否将每个单词都作为特征赋予它,或者您是否还添加了更多特征来训练它(例如文本的长度)?
  • 你到底想分类什么?指定的分类是否有与之相关的特定词?

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

于 2012-05-09T12:29:50.253 回答
0

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

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

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

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

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

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

有关多项式和多元伯努利分类器的更多信息,请参阅这篇非常易读的论文

于 2012-08-01T01:00:18.157 回答
0

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

如果您想留在 NLTK 中,那么您应该使用单词本身作为特征和二元组。查看 Jacob Perkins 撰写的关于在 NLTK 中使用 NB 进行文本处理的文章:http: //streamhacker.com/tag/information-gain/。这篇文章很好地解释和演示了一些你可以做的事情来预处理你的数据;它使用来自 NLTK 的电影评论语料库进行情感分类。

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

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

于 2014-08-11T15:12:49.253 回答