【问题标题】:ValueError: too many values to unpack (NLTK classifier)ValueError:要解包的值太多(NLTK 分类器)
【发布时间】:2018-08-12 08:55:01
【问题描述】:

我正在使用 NLTK 的朴素贝叶斯分类器进行分类分析。我插入一个包含记录和标签的 tsv 文件。

但是由于错误,文件没有得到训练。这是我的python代码

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

dataset = pd.read_csv('tweets.txt', delimiter ='\t', quoting = 3)

dataset.isnull().any()

dataset = dataset.fillna(method='ffill')

import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
corpus = []
for i in range(0,16004):
    tweet = re.sub('[^a-zA-Z]', ' ', dataset['tweet'][i])
    tweet = tweet.lower()
    tweet = tweet.split()
    ps = PorterStemmer()
    tweet = [ps.stem(word) for word in tweet if not word in 
    set(stopwords.words('english'))]
    tweet = ' '.join(tweet)
    corpus.append(tweet)

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features = 10000)
X = cv.fit_transform(corpus).toarray()
y = dataset.iloc[:, 1].values




from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, 
random_state = 0)
train_set, test_set = X_train[500:], y_train[:500]

classifier = nltk.NaiveBayesClassifier.train(train_set)

错误是:

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

ValueError: too many values to unpack

【问题讨论】:

  • labeled_featuresets 是从哪里来的?
  • 是NaiveBayesClassifier.train()函数的变量

标签: python machine-learning nltk naivebayes


【解决方案1】:

NLTKClassifier 不像 scikit 估算器那样工作。它需要Xy 都在一个数组中,然后将其传递给train()

但是在您的代码中,您只向它提供 X_train 并且它会尝试从中解压缩 y,因此会出现错误。

NaiveBayesClassifier 要求输入是元组列表,其中列表表示训练样本,元组内部包含特征字典和标签。比如:

X = [({feature1:'val11', feature2:'val12' .... }, class1),
     ({feature1:'val21', feature2:'val22' .... }, class2), 
     ...
     ...                                                  ]

您需要将输入更改为此格式。

feature_names = cv.get_feature_names()
train_set = []
for i, single_sample in enumerate(X):
    single_feature_dict = {}
    for j, single_feature in enumerate(single_sample):
        single_feature_dict[feature_names[j]]=single_feature
    train_set.append((single_feature_dict, y[i]))    

注意:上面的 for 循环可以通过使用 dict 理解来缩短,但我不是那么流利。

那么你可以这样做:

nltk.NaiveBayesClassifier.train(train_set)

【讨论】:

  • 谢谢!我试图这样做,但我得到一个内存错误。我的数据集太大。有什么方法可以以小增量应用循环,而不是一次性将 y[i] 应用到整个数据集??
  • @SriReka y[i] 应该是单个值,即单个样本的类别标签。所以我的代码一次只做一个增量。您的系统将 X 和 y 保存在内存中,因此这里唯一发生的 wat memoryError 是当数据从 X 复制到 train_set 元组时。这可以通过首先将元组格式写入文件然后在新程序中再次读取它来避免。这样一次 X 和 train_set 将不存在。
  • 非常感谢!!我已经成功地训练了分类器,没有任何记忆错误。但我有一个疑问。在您的代码中,在最后一行 train_set.append((single_dict, y[i])) 中,single_dict 未定义。我用 single_feature_dict 试过了。对吗??
  • @SriReka 是的,这是一个错字。现在修好了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2020-02-24
相关资源
最近更新 更多