Regressão logística e Análise de Sentimentos
A análise de sentimento é uma aplicação do processamento de linguagem natural, uma subárea da IA. Especificamente, a análise de sentimentos se dedica a compreender os sentimentos subjacentes a dados de texto. Esta tarefa possui inúmeras aplicações e pode ser implementada com diferentes abordagens. O uso de modelos de machine learning para análise de sentimentos é um procedimento comum que costuma ter bons resultados. Este será o foco deste post.
Regressão logística e Machine Learning
A regressão logística é uma técnica fundamental em estatística e machine learning. Em machine learning, ela é usada principalmente para tarefas de classificação binária, em que a variável dependente tem apenas dois resultados possíveis. Ela modela a probabilidade de um evento ocorrer em função de uma ou mais variáveis independentes. Veja mais sobre essa técnica aqui.
Para a análise de sentimentos, a regressão logística é adequada para tarefas rotuladas em apenas duas categorias: sentimentos positivos e negativos. Esse é o cenário do conjunto de dados IMDB que continuaremos usando neste post.
Bibliotecas e Importações
Continuaremos usando a biblioteca Pandas. Adicionalmente, usaremos Scikit-learn para construir nosso classificador. Portanto, em um código Python, inicie com as importações necessárias e abra o arquivo contendo os dados já pré-processados:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
df = pd.read_csv('data_clean.csv')
Em seguida, iremos separar os dados em conjunto X de atributos e conjunto y com os rótulos:
X = df["review"]
y = df["sentiment"]
Vetorização de Textos
Modelos de machine learning não entendem textos diretamente. Os dados de textos precisam ser transformados em números antes de alimentarem um modelo. Existem várias estratégias para realizar essa conversão. Usaremos uma das estratégias mais simples disponíveis: TF-IDF.
TF-IDF, que significa Term Frequency-Inverse Document Frequency, é uma medida estatística usada para avaliar a importância de uma palavra em um documento em um corpus. O TF-IDF mede a relevância de uma palavra para um documento específico em uma coleção, considerando que algumas palavras aparecem com mais frequência em geral. Essa técnica permite a vetorização dos textos e é facilmente implementada com Scikit-learn. Dando sequência ao código, realizaremos a vetorização das revisões conforme mostrado abaixo:
vectorizer = TfidfVectorizer()
features = vectorizer.fit_transform(X)
Conversão dos Rótulos
Além da vetorização dos textos, precisaremos usar uma representação numérica para os rótulos. Como nossos rótulos são binários (positivo/negativo), os converteremos em uma representação numérica binária. Adicione o trecho abaixo no seu código:
labels_binary = LabelBinarizer()
y_labels = labels_binary.fit_transform(y).ravel()
Conjuntos de Treinamento e Teste
Em seguida, separamos os dados em conjuntos de treinamento e teste, como mostrado abaixo:
X_train, X_test, y_train, y_test = train_test_split(features, y_labels, test_size=0.2)
Definição do Classificador, Treinamento e Validação
O classificador que usaremos será a regressão logística. Ela é muito facilmente implementada com Scikit-learn. Primeiro, criamos o classificador:
model = LogisticRegression(max_iter=500)
Após definirmos o classificador, usamos os conjuntos de treinamento para treinar o modelo.
model.fit(X_train, y_train)
Por fim, os conjuntos de testes são usados para validar o modelo treinado através de sua acurácia:
predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print("Acurácia:", round(accuracy, 3))
# Resultado: Acurácia: 0.891
Como mostrado acima, nosso classificador tem cerca de 0.89 de acurácia (esse resultado pode variar em função da aleatoriedade intrínseca do método). Esse é um resultado ótimo considerando que estamos usando um modelo bem simples. E assim concluímos nosso classificador.