2017-09-03 106 views
1

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

编辑:感谢@Vivek库马尔的帮助,我已经解决了输入形状不良的问题。但是,现在我得到一个AttributeError:lower not found。经过一番研究,我认为这可能与路透社语料库没有正确的形式有关。有什么办法可以解决这个问题吗?

这是我的代码:

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真正的初学者,所以我真的不知道很多的那些东西都左右(还)。 感谢您的任何建议和帮助!

回答

0

那是因为您没有使用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包含:

Non-zero values contains cosine-normalized, log TF-IDF vectors.

所以没有必要进行实际的CountVectorizer和TfidfTransformer上的数据,就可以直接使用它像这样:

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

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

TLDR;所以你需要从你的代码中删除CountVectorizer和TfidfTransformer,因为它已经在数据中完成了,你需要将分类器MultinomialNB更改为任何其他支持目标y中的2-d,比如DecisionTreeClassifier或其他。

+0

谢谢,这是非常有益的!但是,现在我得到一个AttributeError:找不到?任何想法我能做些什么? – LittleEntertainer

+0

@LittleEntertainer在相同的代码?或者你改变了它。请编辑问题并添加详细信息。还要添加完整的堆栈跟踪错误。 –

+0

@LittleEntertainer嘿,我编辑了我的答案,以适应你正在得到的第二个错误。 –