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

for tweet in negTweets: 
    words = re.findall(r"[\w']+|[.,!?;]", tweet) #splits the tweet into words 
    negwords = [(word_feats(words), 'neg')] #tag the words with feature 
    negfeats.append(negwords) #add the words to the feature list 
for tweet in posTweets: 
    words = re.findall(r"[\w']+|[.,!?;]", tweet) 
    poswords = [(word_feats(words), 'pos')] 
    posfeats.append(poswords) 

negcutoff = len(negfeats)*3/4 #take 3/4ths of the words 
poscutoff = len(posfeats)*3/4 

trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff] #assemble the train set 
testfeats = negfeats[negcutoff:] + posfeats[poscutoff:] 

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

я получаю следующее сообщение об ошибке при выполнении этого кода ...Python NLTK Classifier.train (trainfeats) ... ValueError: нужно больше, чем 1 значение для распаковки

File "C:\Python27\lib\nltk\classify\naivebayes.py", line 191, in train 

for featureset, label in labeled_featuresets: 

ValueError: need more than 1 value to unpack 

ошибка приходит из классификатора = NaiveBayesClassifier.train (trainfeats), и я не уверен, почему. Я уже делал что-то подобное раньше, и мои швы тренировки будут в том же формате, что и тогда ... образец из формата приведен ниже ...

[[({'me': True, 'af Истинно, «это»: «Правда», «радость»: «Правда», «высокая»: «Правда», «кальян»: «Правда», «получил»: «Правда», «pos»)]]

какое другое значение имеет значение trainfeats нужно создать классификатор? выделенный текст

+1

У вас есть два набора скобок вокруг круглых скобок: список, единственным элементом которого является список, единственным элементом которого является кортеж. Этот кортеж содержит словарь и строку. Возможно, у вас слишком много оберток, поэтому распаковка видит только один элемент. – Prune

ответ

1

Комментарий по @Prune прав: Ваш labeled_featuresets должна быть последовательность пар (списков двух элементов или кортежей): Функция ДИКТ и категория для каждой точки данных. Вместо этого каждый элемент в вашем trainfeats представляет собой список, содержащий один элемент: кортеж этих двух вещей. Потеряйте квадратные скобки в обоих циклах создания объектов, и эта часть должна работать правильно. НАПРИМЕР,

negwords = (word_feats(words), 'neg') 
negfeats.append(negwords) 

еще две вещей: Рассмотрите возможность использования nltk.word_tokenize() вместо того, чтобы делать свою собственную лексемизацию. И вы должны рандомизировать порядок ваших данных обучения, например. с random.scramble(trainfeats).

+0

Хорошая добавленная стоимость; благодаря! – Prune

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