我想对一列的每一行的单词系列进行分类。我定义了一个函数,它返回每个系列的字典、正字典和负字典以及 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)
最佳答案
原因非常简单:NaiveBayesClassifier
需要一个包含特征集和标签的 2-元组
迭代。
例如,在您的上下文中,积极的词特征集将如下所示:
[({'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 official example ,功能集看起来像这样:
[({'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')]
这里的工作流程采用一个名字,从中生成一个特征(最后一个字母),然后使用每个名字的最后一个字母,结合它是男性还是女性(标签)来确定条件概率根据最后一个字母来判断姓名的性别。
另一方面,您正在做的事情是尝试确定一个句子是正面还是负面,这意味着您需要(此处简化)判断每个单词是正面还是负面。但是,如果是这样,那么您的功能和标签的含义完全相同!
关于python - "Too many values to unpack"训练分类器时出现 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55792897/