2017-09-03 4 views
1

로이터 코퍼스에서 텍스트 분류기를 작성하기 위해이 자습서 (http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html)를 수정했습니다. 그러나 잘못된 입력 모양 오류가 발생합니다.Scikit 텍스트 분류 - 잘못된 입력 모양 오류

편집 : @Vivek Kumar 덕분에 잘못된 입력 모양 문제가 해결되었습니다. 그러나 이제 AttributeError : lower를 찾았습니다. 약간의 연구가 끝나면 올바른 형태가 아닌 로이터의 자료와 관련이 있다고 생각합니다. 이 문제를 해결할 수있는 방법이 있습니까? 내가 프로그래밍 및 NLP에서 실제 초보자, 그래서 정말 매우에 대한 모든 물건의 (아직) 모르는

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) 

:

이 내 코드입니다. 조언과 도움을 주셔서 감사합니다!

답변

0

CountVectorizer에서 실제 데이터를 사용하고 있지 않기 때문입니다. reuters_train.data을 사용해야하는 반면 reuters_train을 사용하고 있습니다.

변경 :

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를 DecisionTreeClassifier 또는 기타와 같은 대상 y의 2-d를 지원하는 다른 유형으로 변경해야합니다.

+0

감사합니다. 매우 도움이되었습니다. 그러나, 지금 나는 AttributeError를 얻고있다 : lower not found? 내가 그 일에 대해 무엇을 할 수 있는지 아는가? – LittleEntertainer

+0

@LittleEntertainer 동일한 코드에서? 또는 변경했습니다. 질문을 수정하고 세부 정보를 추가하십시오. 또한 전체 스택 추적 오류를 추가하십시오. –

+0

@LittleEntertainer 이봐, 두 번째 오류를 해결하기 위해 내 대답을 편집했다. –

관련 문제