Análise de Sentimentos — Máquinas de Vetores de Suporte




Análise de Sentimentos — Máquinas de Vetores de Suporte

Na próxima série de tópicos, vamos mergulhar em diferentes abordagens para resolver o problema do Olá Mundo da NLP, a análise de sentimentos.

O código esta disponível aqui.

O classificador SVM

Este classificador trabalha tentando criar uma linha que divida o conjunto de dados deixando a maior margem possível entre pontos chamados vetores de suporte . Conforme a figura abaixo, a linha A tem uma margem maior que a linha B , então os pontos divididos pela linha A têm que percorrer muito mais para cruzar a divisão, do que se os dados fossem divididos por B , então neste caso escolheríamos a linha A.

O código

Para esta tarefa usaremos scikit-learn , uma biblioteca de aprendizado de máquina de código aberto.

Nosso conjunto de dados é composto por resenhas de filmes e rótulos que informam se a crítica é negativa ou positiva. Vamos carregar o conjunto de dados:

O arquivo de reviews é um pouco grande, então está em formato zip. Vamos Extraí-lo:

import zipfile
with zipfile.ZipFile("reviews.zip", 'r') as zip_ref:
    zip_ref.extractall(".")

Agora que temos os arquivos reviews.txt e labels.txt , vamos carregá-los na memória:

with open("reviews.txt") as f:
    reviews = f.read().split("\n")
with open("labels.txt") as f:
    labels = f.read().split("\n")
    
reviews_tokens = [review.split() for review in reviews]

Em seguida, carregamos o módulo para transformar nossas entradas de revisão em vetores binários com a ajuda da classe MultiLabelBinarizer:

from sklearn.preprocessing import MultiLabelBinarizer
onehot_enc = MultiLabelBinarizer()
onehot_enc.fit(reviews_tokens)

Depois disso, dividimos os dados em conjunto de treinamento e teste com a função:train_test_split

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(reviews_tokens, labels, test_size=0.25, random_state=None)

Em seguida, criamos nosso classificador SVM com a classe LinearSVCe o treinamos:

from sklearn.svm import LinearSVC
lsvm = LinearSVC()
lsvm.fit(onehot_enc.transform(X_train), y_train)

O treinamento do modelo levou cerca de 2 segundos.

Após o treinamento, utilizamos a scorefunção para verificar o desempenho do classificador:

score = lsvm.score(onehot_enc.transform(X_test), y_test)

Calcular a pontuação levou apenas cerca de 1 segundo!

Executando o classificador algumas vezes obtemos cerca de 85% de precisão, basicamente o mesmo resultado do classificador naive bayes.