Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;“值太多,无法解包”;训练分类器时的值错误_Python_Nltk - Fatal编程技术网

Python &引用;“值太多,无法解包”;训练分类器时的值错误

Python &引用;“值太多,无法解包”;训练分类器时的值错误,python,nltk,Python,Nltk,我想对一列中每一行的单词序列进行分类。我定义了一个函数,它从每个系列返回一个字典,即正负字典和训练集。但当我开始定义分类器时,代码在该级别崩溃 我有以下代码: import nltk.classify.util from nltk.classify import NaiveBayesClassifier def word_feats(words, val): return {word: val for word in words} voc_pos = [ 'beauty', 'go

我想对一列中每一行的单词序列进行分类。我定义了一个函数,它从每个系列返回一个字典,即正负字典和训练集。但当我开始定义分类器时,代码在该级别崩溃

我有以下代码:

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行,在
文件“/home/ion/.local/lib/python3.6/site packages/nltk/classify/naivebayes.py”,第206行,列车中
对于featureset,在标记的\u featureset中添加标签:
ValueError:要解压缩的值太多(应为2个)

原因很简单:
NaiveBayesClassifier
需要一个包含一个特性集和一个标签的2-
元组的iterable

例如,在您的上下文中,肯定词featureset如下所示:

[({'beauty': 0.2}, 'pos'),
 ({'good': 0.3}, 'pos'),
 ({'happy': 0.4}, 'pos')]
[({'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')]
因此,您应该提供给
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)
然而,如果你从更广泛的角度来看你正在做的事情,我不确定这是否真的有意义,原因有几个

最主要的一点是,你实际上没有办法首先决定这些分数是多少。你似乎在做情绪分析;最简单也是最常见的方法是下载一个预先训练好的从单词到情绪分数的映射,这样你就可以试试了

第二,featureset是指从要素值到标签的映射。如果查看,功能集如下所示:

[({'beauty': 0.2}, 'pos'),
 ({'good': 0.3}, 'pos'),
 ({'happy': 0.4}, 'pos')]
[({'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')]
此处的工作流采用一个名称,从中生成一个特征(最后一个字母),然后使用每个名称的最后一个字母,并结合名称是男性还是女性(标签)来确定给定名称最后一个字母的性别的条件概率


另一方面,你所做的是试图判断一个句子是肯定的还是否定的,这意味着你需要(在这里简化)判断每个单词是肯定的还是否定的。但是,如果是这样,那么您的功能和标签的含义完全相同

@AkshayNevrekar这是nltk中的一行。谢谢你的解释,你向meI澄清了这个问题,做了这些修改,效果很好:def word_feats(word):return{word:True}voc_pos=['beauty','good','happy']voc_neg=['bad','sick','lazy']pos feats=[(word feats(pos pos),'pos)对于voc_pos]neg_feats中的pos=[(单词_feats(neg),'neg')表示voc_neg中的neg]