«Слишком много значений для распаковки» ValueError во время обучения классификатора - PullRequest
2 голосов
/ 22 апреля 2019

Я хотел бы классифицировать серии слов каждой строки столбца.Я определил функцию, которая возвращает словарь из каждой серии, положительные и отрицательные словари и train_set.Но когда я начал определять классификатор, код падает на этом уровне.

У меня есть этот код:

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier

def word_feats(words, val): 
    return {word: val for word in words}

voc_pos = [ 'beauty', 'good', 'happy']
voc_neg = [ 'bad', 'sick','lazy']

feat = {}
pos_feats = word_feats(voc_pos, 'pos') 
neg_feats = word_feats(voc_neg, 'neg')
train_set = {**pos_feats, **neg_feats}

classifier = NaiveBayesClassifier.train(train_set) 

Полная трассировка ошибок:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ion/.local/lib/python3.6/site-packages/nltk/classify/naivebayes.py", line 206, in train
    for featureset, label in labeled_featuresets:
ValueError: too many values to unpack (expected 2)

1 Ответ

3 голосов
/ 22 апреля 2019

Причина довольно проста: NaiveBayesClassifier ожидает итерацию из 2- tuples, содержащую набор функций и метку.

Например, в вашем контексте набор функций положительного слова будет выглядеть примерно так:

[({'beauty': 0.2}, 'pos'),
 ({'good': 0.3}, 'pos'),
 ({'happy': 0.4}, 'pos')]

Соответственно, данные, которые должны передавать NaiveBayesClassifier, должны иметь следующую форму:

labelled_featuresets = [({'beauty': 0.2}, 'pos'),
                        ({'good': 0.3}, 'pos'),
                        ({'happy': 0.4}, 'pos'),
                        ({'bad': 0.5}, 'neg'),
                        ({'sick': 0.3}, 'neg'),
                        ({'lazy': 0.2}, 'neg')]

classifier = NaiveBayesClassifier.train(labelled_featuresets)

Однако, если вы посмотрите на более широкий контекст того, что вы делаете, я не уверен, что это действительно имеет смысл, по нескольким причинам.

Принципиальным является то, что у вас на самом деле нет способа решитьчто эти оценки в первую очередь.Вы, кажется, делаете анализ настроений;Самый простой и распространенный способ - загрузить предварительно обученное отображение из слов в оценки настроений, так что вы можете попробовать это.

Во-вторых, набор функций подразумевается как отображение иззначения признаков для меток.Если вы посмотрите на официальный пример nltk , набор функций будет выглядеть примерно так:

[({'last_letter': 't'}, 'female'),
 ({'last_letter': 'a'}, 'female'),
 ({'last_letter': 'h'}, 'female'),
 ({'last_letter': 'l'}, 'female'),
 ({'last_letter': 'a'}, 'female'),
 ({'last_letter': 'a'}, 'female'),
 ({'last_letter': 'e'}, 'female'),
 ({'last_letter': 'r'}, 'male'),
 ({'last_letter': 'a'}, 'male'),
 ({'last_letter': 'n'}, 'female')]

Рабочий процесс здесь берет имя, генерирует из него одну функцию (последнюю букву),а затем использует последнюю букву каждого имени в сочетании с тем, является ли он мужчиной или женщиной (метка), для определения условной вероятности пола имени с учетом его последней буквы.

С другой стороны, что выВы пытаетесь решить, является ли предложение положительным или отрицательным, что означает, что вам нужно (упрощенно здесь) сказать, является ли каждое отдельное слово положительным или отрицательным.Однако, если это так, то и ваша функция, и ваш ярлык означают одно и то же!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...