Scikit文本分类 - 错误的输入形状错误

时间:2017-09-03 19:17:34

标签: python scikit-learn text-classification valueerror

我修改了本教程(http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html)以在路透社语料库上构建文本分类器。但是,我得到一个错误的输入形状错误:

编辑:感谢@Vivek Kumar的帮助,我解决了错误的输入形状问题。但是,现在我得到一个AttributeError:找不到低位。经过一番研究后,我认为这可能与路透社语料库没有正确形式有关。有什么方法可以解决这个问题吗?

这是我的代码:

from sklearn.datasets import fetch_rcv1 #import reuters corpus
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

rcv1 = fetch_rcv1()


reuters_train = fetch_rcv1(subset='train', shuffle=True, random_state=42)
reuters_train.target_names

count_vect = CountVectorizer()

train_counts = count_vect.fit_transform(reuters_train.data)
train_counts.shape
count_vect.vocabulary_.get(u'alogrithm')

tf_transformer = TfidfTransformer(use_idf=False).fit(train_counts)
train_tf = tf_transformer.transform(train_counts)
train_tf.shape
tfidf_transformer = TfidfTransformer()
train_tfidf = tfidf_transformer.fit_transform(train_counts)
train_tfidf.shape

clf = MultinomialNB().fit(train_tfidf, reuters_train.target)

text_clf = Pipeline([('vect', CountVectorizer()),
                     ('tfidf', TfidfTransformer()),
                     ('clf', MultinomialNB()),])

text_clf.fit(reuters_train.data, reuters_train.target)
Pipeline(...)

import numpy as np

reuters_testset = fetch_rcv1(subset='test', shuffle=True, random_state=42)

reuters_test = reuters_testset.data

predicted = text_clf.predict(reuters_test)

np.mean(predicted == reuters_test.target)

我是编程和NLP的真正初学者,所以我真的不太了解所有这些东西(还)。 感谢您的任何建议和帮助!

1 个答案:

答案 0 :(得分:1)

这是因为您没有使用CountVectorizer中的实际数据。您正在使用reuters_train,而您应该使用reuters_train.data

变化:

train_counts = count_vect.fit_transform(reuters_train)

为:

train_counts = count_vect.fit_transform(reuters_train.data)

还有CountVectorizer + TfidfTransformer = TfidfVectorizer。所以我建议在两个对象中使用它。

在进一步阅读RCV1 dataset here的说明时,鉴于.data包含:

  

非零值包含余弦标准化的log TF-IDF向量。

因此,无需对数据实际执行CountVectorizer和TfidfTransformer,您可以直接使用它:

clf = MultinomialNB().fit(reuters_train.data, reuters_train.target)

但是由于目标数据的形状,你将再次遇到错误。您看到MultinomialNB().fit()仅适用于单维目标(可能是多类或二进制),但不适用于多标签或多输出数据。

TLDR; 因此您需要从代码中删除CountVectorizer和TfidfTransformer,因为它已在数据中完成,您需要将分类器MultinomialNB更改为支持目标{2中的2-d的任何其他分类器1}}喜欢DecisionTreeClassifier或其他。

相关问题