1
resposta

Como clasificar uma nova review do IMDB

Fiz o seguinte código para classificar uma nova resenha usando o modelo treinado com o dataset do IMDB_PTBR

from itertools import repeat
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from nltk import tokenize

predict_model = pickle.load(open('sentiments.sav', 'rb'))

vectorizer = CountVectorizer(
    lowercase=False,
    ngram_range=(1, 2),
    max_features=(predict_model.n_features_in_ - 6))

phrase = "nunca assisti um filme tao ruim"

bag_of_words = vectorizer.fit_transform([phrase])

predict_result = predict_model.predict(bag_of_words)

print(predict_result)

O problema é que quando roda o código acima, o seguinte erro é retornado

ValueError: X has 11 features per sample; expecting 2424930

Eu entendi que o tamanho da minha nova review é diferente dos dados de treino mas ai eu não sei como "completar" a nova frase com os espaços necessários. Alguém pode me ajudar?

1 resposta

Oi Paulo! Tudo bem com você?

Desculpa a demora em te trazer um retorno.

Você identificou corretamente o problema, seu modelo de agora tem um número de dados diferentes do antigo. Então para conseguir utilizar novas entradas, você deve fazer a transformação dessas frases utilizando o mesmo vocabulário e assim resultando em um vetor do mesmo tamanho esperado pelo seu modelo.

Pensando no exemplo da aula, vamos ter a variável vetorizar que foi criada assim:

vectorizer = CountVectorizer(
    lowercase=False,
    ngram_range=(1, 2),
    max_features=(predict_model.n_features_in_ - 6))

Nesse momento ela ainda não aprendeu nenhum vocabulário, resolvemos isso com o fit_transform, que você chamou de bag_of_words:

bag_of_words = vectorizer.fit_transform(resenha.text_pt)

Pronto, agora o vetorizar aprendeu um vocabulário a partir dos dados da resenha.text_pt.

E você vai utilizar os dados bag_of_words para treinar seu modelo.

Outro detalhe é que você precisa salvar também o vectorizer:

pickle.dump(vectorizer, 'vectorizer.sav')

Agora onde entram os nossos novos dados?

Bom, para transformar nossos novos dados, vamos utilizar o mesmo vetorizar que já conhece o vocabulário, da seguinte maneira:

vectorizer = pickle.load(open('vectorizer.sav', 'rb'))

A diferença é que agora vamos utilizar o método transform que fará apenas a transformação a partir do vocabulário que ele já aprendeu quando você executou o fit_transform.

novas_resenhas_transformadas = vetorizar.transform(phrase) 

Agora poderá utilizar a variável novas_resenhas_transformadas sem problemas no seu modelo.

Espero ter ajudado, mas se ainda persistir alguma dúvida estou sempre à disposição.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!