2017-09-03 1 views
1

J'ai modifié ce tutoriel (http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html) pour créer un classificateur de texte sur le corpus Reuters. Cependant, je reçois une erreur de forme d'entrée incorrecte:Scikit Text Classification - Erreur de forme d'entrée incorrecte

EDIT: Grâce à l'aide de @Vivek Kumar, j'ai résolu le problème de forme d'entrée incorrecte. Cependant, maintenant j'obtiens un AttributeError: lower not found. Après quelques recherches, je pense que cela pourrait avoir quelque chose à voir avec le corpus de Reuters n'ayant pas la forme correcte. Est-ce que je peux y remédier?

Ceci est mon code:

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) 

Je suis un vrai débutant à la programmation et la PNL, donc je ne sais vraiment pas beaucoup sur tous ce genre de choses (encore). Merci pour tous conseils et aide!

Répondre

0

C'est parce que vous n'utilisez pas les données réelles dans le CountVectorizer. Vous utilisez reuters_train alors que vous devriez utiliser reuters_train.data.

Change:

train_counts = count_vect.fit_transform(reuters_train) 

à:

train_counts = count_vect.fit_transform(reuters_train.data) 

également CountVectorizer + TfidfTransformer = TfidfVectorizer. Donc, je recommanderais d'utiliser cette place de deux objets.

En plus la lecture de la description de RCV1 dataset here, son étant donné que le .data contient:

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

donc il n'y a pas besoin de faire réellement le CountVectorizer et TfidfTransformer sur les données et vous pouvez l'utiliser directement comme celui-ci :

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

Mais vous rencontrerez de nouveau une erreur et cette fois en raison de la forme des données de la cible. Vous voyez MultinomialNB().fit() fonctionne uniquement avec des cibles à une seule dimension (peut être multi-classe ou binaire) mais pas avec des données multi-étiquettes ou multi-sorties.

TLDR; Vous devez donc supprimer CountVectorizer et TfidfTransformer de votre code parce que c'est déjà fait dans les données et vous devez changer le classificateur MultinomialNB à tout autre qui supporte 2-d dans la cible y comme peut-être DecisionTreeClassifier ou autres.

+0

merci, c'était très utile! Cependant, maintenant je reçois un AttributeError: lower not found? Une idée de ce que je peux faire à ce sujet? – LittleEntertainer

+0

@LittleEntertainer Sur le même code? Ou l'avez-vous changé. Veuillez modifier la question et ajouter les détails. Ajoutez également la trace d'erreur de la pile complète. –

+0

@LittleEntertainer Hé, j'ai édité ma réponse pour accommoder la deuxième erreur que vous obtenez. –