2015-09-22 3 views
0

Сообщение об ошибке:NLTK Наивный байесовский классифицирует ошибку

Traceback (самый последний вызов последний): Файл "/Users/ABHINAV/Documents/test2.py", строка 58, в классификатором = NaiveBayesClassifier.train (trainfeats) Файл «/Library/Python/2.7/site-packages/nltk/classify/naivebayes.py», строка 194, в поезде для набора функций, ярлык в методах с меткой_featuresets: ValueError: слишком много значений для распаковки [Закончено в 17.0 s с кодом выхода 1]

Я получаю эту ошибку, пока я пытаюсь реализовать Naive Bayes на наборе данных. Вот код, который:

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() 

ответ

2

TLDR

Вы должны иметь это:

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

Вместо этого:

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

Объяснение

Решающая ошибка ValueError: too many values to unpack внутри NaiveBayesClassifier.train, которую вы называете на этой линии:

classifier = NaiveBayesClassifier.train(trainfeats) 

«Слишком много значений для распаковки» означает, что программа ожидает определенное количество значений внутри итератора, и он получает больше, чем это число. Например, из сообщения об ошибке, что ошибка возникает на этой линии:

for featureset, label in labeled_featuresets: 

Этот цикл ожидает пар вещей, чтобы быть в «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'), 
... 

, которая окружает каждую пару со скобками, создавая список кортежей, а не список отдельных элементов.

+1

Я попытался определить кортежи, как вы упомянули, но я все еще получаю некоторые ошибки. Вот что я получаю: Traceback (последний последний звонок): Файл «Documents/test2.py ", строка 28, в classifier = NaiveBayesClassifier.train (trainfeats) Файл" /Library/Python/2.7/site-packages/nltk/classify/naivebayes.py ", строка 196, в поезде для fname, fval in featureset.items(): AttributeError: объект 'str' не имеет атрибутов 'items' [Закончено в 2.9 с кодом выхода 1] –

Смежные вопросы