2017-09-03 105 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嘿,我編輯了我的答案,以適應你正在得到的第二個錯誤。 –