【问题标题】:NLTK Naive Bayes Classifies errorNLTK 朴素贝叶斯分类错误
【发布时间】:2015-12-20 02:59:04
【问题描述】:

错误信息:

Traceback(最近一次调用最后一次): 文件“/Users/ABHINAV/Documents/test2.py”,第 58 行,在 分类器 = NaiveBayesClassifier.train(trainfeats) 文件“/Library/Python/2.7/site-packages/nltk/classify/naivebayes.py”,第 194 行,在火车中 对于特征集,labeled_featuresets 中的标签: ValueError:解包的值太多 [在 17.0s 中完成,退出代码为 1]

我在尝试对一组数据实施朴素贝叶斯时遇到此错误。这是代码:

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=[('good'),('pos'),
('quick'),('pos'),
('easy'),('pos'),
('big'),('pos'),
('iterested'),('pos'),
('important'),('pos'),
('new'),('pos'),
('patient'),('pos'),
('few'),('neg'),
('bad'),('neg'),

]

test=[
('general'),('pos'),
('many'),('pos'),
('efficient'),('pos'),
('great'),('pos'),
('interested'),('pos'),
('top'),('pos'),
('easy'),('pos'),
('big'),('pos'),
('new'),('pos'),
('wonderful'),('pos'),
('important'),('pos'),
('best'),('pos'),
('more'),('pos'),
('patient'),('pos'),
('last'),('pos'),
('worse'),('neg'),
('terrible'),('neg'),
('awful'),('neg'),
('bad'),('neg'),
('minimal'),('neg'),
('incomprehensible'),('neg'),
]

classifier = NaiveBayesClassifier.train(trainfeats)
print 'accuracy:', nltk.classify.util.accuracy(classifier, test)
classifier.show_most_informative_features()

【问题讨论】:

    标签: python nltk naivebayes


    【解决方案1】:

    trainfeat 变量应该是:

     trainfeats=[({'good':True,'quick':True,'easy':True,
    'big':True,'interested':True,'important':True,
    'new':True,'patient':True},'pos'),({'few':True,'bad':True},'neg')]
    

    这是 nltk 中标记特征集的正确格式。

    同样,测试变量应该是:

    test=[({'general':True,'many':True,'efficient':True,'great':True,'interested':True,'top':True,'easy':True,'big':True,'new':True,'wonderful':True,'important':True,'best':True,'more':True,'patient':True,'last':True},'pos'),({'worse':True,'terrible':True,'awful':True,'bad':True,'minimal':True,'incomprehensible':True},'neg')]
    

    【讨论】:

      【解决方案2】:

      TLDR

      你需要这个:

      trainfeats=[('good','pos'),
      ('quick','pos'),
      ...
      

      而不是这个:

      trainfeats=[('good'),('pos'),
      ('quick'),('pos'),
      ...
      

      说明

      关键错误是ValueError: too many values to unpack 在您在此行调用的NaiveBayesClassifier.train 内:

      classifier = NaiveBayesClassifier.train(trainfeats)
      

      'Too many values to unpack' 意味着程序期望在一个可迭代对象中有一定数量的值,并且它接收到的值超过了这个数量。例如,从您的错误消息中,该行引发了错误:

      for featureset, label in labeled_featuresets: 
      

      这个 for 循环期望 pairs 事物在 'labeled_featuresets' 中,它会将其中的一个成员分配给 featureset,并将一个成员分配给 label。如果labeled_featuresets 实际上有三胞胎,例如[(1,2,3), (1,2,3)...] 那么程序不知道如何处理第三个元素,所以它会抛出错误。

      这是您传递给该函数的内容,我认为它最终会以labeled_featuresets 结尾:

      trainfeats=[('good'),('pos'),
      ('quick'),('pos'),
      ('easy'),('pos'),
      ...
      

      您似乎正在尝试通过将列表中的项目成对缩进来创建一个元组列表(这将防止您遇到错误),但是这还不够。 Python 不会使用缩进来推断元组,只有 括号。我想这就是你想要的:

      trainfeats=[('good','pos'),
      ('quick','pos'),
      ('easy','pos'),
      ...
      

      每对都用括号括起来,创建一个元组列表而不是单个元素的列表。

      【讨论】:

      • 我试着定义你提到的元组,但我仍然遇到一些错误。这是我得到的: Traceback(最近一次调用):文件“Documents/test2.py”,第 28 行,在 分类器 = NaiveBayesClassifier.train(trainfeats)文件“/Library/Python/2.7/site- packages/nltk/classify/naivebayes.py",第 196 行,在训练 fname 中,在 featureset.items() 中的 fval:AttributeError:'str' 对象没有属性 'items' [在 2.9 秒内完成,退出代码为 1]
      猜你喜欢
      • 2016-09-28
      • 2017-04-19
      • 2012-12-05
      • 2012-11-10
      • 2013-04-19
      • 2017-08-30
      • 2012-04-01
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多