Neste exemplo, vamos testar todos os modelso estudados no curso. Vamo aplica-los a classificação de textos. A base para esse exemplo foi gerada na atividade de clusterização de documentos. Iremos utiliza-la como base de treinamento. A proposta é usar os 100 top filmes para classificar outros 100 top filmes do IMDb. Esse tipo de abordagem pode ser utilizada para realizar uma classificação inicial quando temos muitos dados e não conseguimos classifica-los manualmente. Claro que para a classificação ser mais efetiva precisaríamos realizar diversos testes na criação dos clusters e validarmos a clusterização realizada.
In [18]:
# Imports Necessários
import nltk
import re
import pandas as pd
from sklearn.cluster import KMeans
from imdbpie import Imdb
from nltk.stem.snowball import SnowballStemmer
from sklearn.externals import joblib
In [15]:
dataset = joblib.load("../UnsupervisedLearning/moviesclassifieds.pkl")
data = pd.DataFrame(dataset)
data = data.set_index(['imdbid'])
data.head()
Out[15]:
Vamos carregar também o identificador das classes geradas:
In [16]:
dict_class = joblib.load("../UnsupervisedLearning/moviesclass.pkl")
dict_class
Out[16]:
O passo seguinte é gerar nosso X e y para os algoritmos de classificação. Vamos utilizar a mesma abordagem para a criação da matriz tf-idf no exercício de clusterização. Sendo assim, irei replicar alguns métodos. Detalhes de sua explicação estão no exercício 01 de Algoritmos Não-Supervisionados.
In [19]:
stemmer = SnowballStemmer("english")
def tokenize_and_stem(text):
# first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]
filtered_tokens = []
# filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
for token in tokens:
if re.search('[a-zA-Z]', token):
filtered_tokens.append(token)
stems = [stemmer.stem(t) for t in filtered_tokens]
return stems
In [29]:
data.head()
Out[29]:
In [32]:
list_of_synopses = data['sinopsis'].tolist()
classes = data['class'].tolist()
In [33]:
from sklearn.feature_extraction.text import TfidfVectorizer
#define vectorizer parameters
tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
min_df=0.2, stop_words='english',
use_idf=True, tokenizer=tokenize_and_stem, ngram_range=(1,3))
%time tfidf_matrix = tfidf_vectorizer.fit_transform(list_of_synopses) #fit the vectorizer to synopses
print(tfidf_matrix.shape)
In [34]:
X = tfidf_matrix
y = classes
01) Aplique os modelos estudados juntamente com o RandomForest e o NaiveByes na base de dados geradas. Escolha o melhor classificador.
02) Utilize o melhor classificador para gerar classificar outros 100 textos do IMDb. Neste casso, utilize os top250 textos. Utilizamos 100 para treinar e podemos utilizar os textos de 101 a 200 para testar.