python - "Too many values to unpack"训练分类器时出现 ValueError

标签 python nltk

我想对一列的每一行的单词系列进行分类。我定义了一个函数,它返回每个系列的字典、正字典和负字典以及 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/

相关文章:

Python 求和 itertools.count?

python - Django hstore 字段和索引

python - 在语料库 Python 中查找损坏的文件

python - 如何在 NLTK 中将荷兰语文本与西类牙语部分分开?

python - 从文本问题中删除标点符号/数字

python - 强制斯坦福 CoreNLP 解析器在根级别优先考虑 'S' 标签

python - 运行 Ubuntu 时 Python 代码中的回溯错误

python - 使用 pandas 从开始时间和持续时间(分钟)计算结束时间。标准方法错误

python - 当我为变量 URL 指定转​​换器时,为什么我的 Flask 路由列表功能会失败?

python - 在 Python 中加速 Stanford 依赖解析