ValueError:解包的值太多(预期为2)

时间:2017-04-04 05:11:15

标签: python

我正在使用nltk的朴素贝叶斯分类器进行情感分析。我只是插入一个包含单词及其标签作为训练集的csv文件,而不是测试它。我发现每个句子的情绪,然后最终找到所有句子的平均情绪。我的文件包含以下格式的文字:

good,0.6
amazing,0.95
great,0.8
awesome,0.95
love,0.7
like,0.5
better,0.4
beautiful,0.6
bad,-0.6
worst,-0.9
hate,-0.8
sad,-0.4
disappointing,-0.6
angry,-0.7
happy,0.7

但该文件未经过培训,上述错误显示出来。这是我的python代码:

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import stopwords
from nltk.tokenize import sent_tokenize
from nltk.classify.api import ClassifierI

operators=set(('not','never','no'))
stop_words=set(stopwords.words("english"))-operators

text="this restaurant is good but i hate it ."
sent=0.0
x=0
text2=""
xyz=[]
dot=0

if "but" in text:
    i=text.find("but")
    text=text[:i]+"."+text[i+3:]
if "whereas" in text:
    i=text.find("whereas")
    text=text[:i]+"."+text[i+7:]
if "while" in text:
    i=text.find("while")
    text=text[:i]+"."+text[i+5:]

a=open('C:/Users/User/train_words.csv','r')

for w in text.split():
    if w in stop_words:
        continue
    else:
        text2=text2+" "+w

print (text2)

cl=nltk.NaiveBayesClassifier.train(a)

xyz=sent_tokenize(text2)

print(xyz)

for s in xyz:
    x=x+1
    print(s)
    if "not" in s or "n't" in s:
        print(float(cl.classify(s))*-1)
        sent=sent+(float(cl.classify(s))*-1)
    else:
        print(cl.classify(s))
        sent=sent+float(cl.classify(s))
print("sentiment of the overall document:",sent/x)

错误:

    runfile('C:/Users/User/Documents/untitled1.py', wdir='C:/Users  /User/Documents')
 restaurant good . hate .
Traceback (most recent call last):

  File "<ipython-input-8-d03fac6844c7>", line 1, in <module>
    runfile('C:/Users/User/Documents/untitled1.py', wdir='C:/Users/User/Documents')

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/User/Documents/untitled1.py", line 37, in <module>
    cl = nltk.NaiveBayesClassifier.train(a)

  File "C:\ProgramData\Anaconda3\lib\site-packages\nltk\classify\naivebayes.py", line 194, in train
    for featureset, label in labeled_featuresets:

ValueError: too many values to unpack (expected 2)

2 个答案:

答案 0 :(得分:0)

如果没有错,train()会获取元组列表并提供文件obj。

而不是这个

a = open('C:/Users/User/train_words.csv','r') 

试试这个

a = open('C:/Users/User/train_words.csv','r').read()   # this is string
a_list = a.split('\n')
a_list_of_tuple = [tuple(x.split(',')) for x in a_list]

并将a_list_of_tuple变量传递给train()

跳这将有助于:)

答案 1 :(得分:0)

来自doc:

def train(cls, labeled_featuresets, estimator=ELEProbDist):
    """
    :param labeled_featuresets: A list of classified featuresets,
        i.e., a list of tuples ``(featureset, label)``.
    """

所以你可以写类似的东西:

feature_set = [line.split(',')[::-1] for line in open('filename').readline()]