【问题标题】:Python how to train the naives bayes classierPython如何训练朴素贝叶斯分类器
【发布时间】:2013-04-11 01:31:59
【问题描述】:

我需要一个分类器来将评论分类为正面或负面。对于每个文档,我已经完成了停用词过滤和词形还原,并计算了每个术语的 tf-idf,并将它们存储到 doc_bow 中,如下所示为每个文档。

doc_bow.append((term,tfidf)).

现在,我想训练分类器,但我不知道该怎么做。我从http://streamhacker.com/2010/10/25/training-binary-text-classifiers-nltk-trainer/ 中找到了一个示例,但我仍然无法理解。 td-idf 将如何使用或影响分类器?

【问题讨论】:

  • 您为NLTK / NLTK-trainer 链接了一篇文章,但没有将这个问题标记为此类 - 您目前有这两个问题吗?
  • 我总共有 100 条文档,我手动标记了 50 条文档评论。这是否考虑了训练集?
  • 您的标记数据集就是您的训练集...
  • 那么,使用 doc_bow 和训练集如何训练分类器?
  • 我发布了一个答案.. 请参阅

标签: python classification


【解决方案1】:

我在这方面知之甚少,但我可以分享我所了解的。如果我错了,请纠正我。从我从链接中看到的,没有提到使用 tf-idf 分数进行分类。您应该查看link 以了解如何使用朴素贝叶斯分类器。一般来说,代码看起来是这样的(我从那个链接中获取了这个代码段)

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews

def word_feats(words):
    return dict([(word, True) for word in words])

negids = movie_reviews.fileids('neg')
posids = movie_reviews.fileids('pos')

negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids]
posfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'pos') for f in posids]

negcutoff = len(negfeats)*3/4
poscutoff = len(posfeats)*3/4

trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff]
testfeats = negfeats[negcutoff:] + posfeats[poscutoff:]
print 'train on %d instances, test on %d instances' % (len(trainfeats), len(testfeats))

classifier = NaiveBayesClassifier.train(trainfeats)

每个训练实例都是特征字典和类标签的元组,例如,它可以是({"sucks":True, "bad":True, "boring":True}, "Negative")

至于数字属性,我认为一种常见的方法是将它们分类为低/中/高等类别。

关于TF-IDF 的分数,我不是很确定。我认为一种方法是它们可以用于功能选择,例如,如果你没有。 of features 太大,您可以将前 n 个单词作为特征。

【讨论】:

  • 是的,我也看到了这段代码,但我不太明白如何将它插入到我的案例中。所以,我必须先了解它是如何工作的,以及每个变量的用途是什么,tf-idf 说,pos 标记所有这些。感谢您的回答,所以我现在需要做的基本上是从我提取的训练集中提取 2 个列表,其中一个是正面的,另一个是负面的。我是对的,这两条线是什么意思? negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids] posfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'pos') for f 在 posids]
  • 我不太明白 dict() 和截断的意思为什么是多 3/4
  • dict 将元组转换为字典,这里的截断意味着你使用你标记的数据的 3/4 作为训练集,剩下的 1/4 作为测试集,看看你的分类器有多好.通常是这种情况。 3/4 只是一个方便的数量。它可能是 9/10 的训练,1/10 的测试集,这取决于你的标记数据有多大。如果您觉得有用,请考虑接受我的回答。谢谢!
猜你喜欢
  • 2015-06-25
  • 2020-09-13
  • 2017-06-21
  • 2023-03-23
  • 2017-08-30
  • 2019-05-04
  • 2018-06-08
  • 2012-04-18
相关资源
最近更新 更多