Alexa, o que dizem de você por ai?

Original article was published by Matheus Duzzi Ribeiro on Deep Learning on Medium


Alexa, o que dizem de você por ai?

Uma análise de textos usando Deep Learning para os reviews da Amazon Alexa

Introdução

Se você chegou até aqui, provavelmente já ouviu falar na Amazon Alexa. Entretanto, como forma de adequar o texto para que mais pessoas consigam entender do que se trata essa tecnologia, vou dar uma breve explicação.

Fonte: Tecmundo

A Alexa é uma assistente virtual, assim como a Siri da Apple, que te ajuda em tarefas relacionadas desde o agendamento de um alarme até nas mais complexas, como ligar a torneira de uma banheira para um banho quente depois de um dia chuvoso no trabalho.

Assim, sem mais delongas, nossa missão aqui hoje é ver como são as reações dos consumidores nos textos de review da caixa de som Echo Alexa, no próprio site da Amazon.

Desse modo, é esperado que consigamos separar essas avaliações em positivas ou negativas baseados em textos que previamente sabemos sua interpretação, para que assim, novas avaliações possam ser classificadas sem ter a árdua tarefa de ser lida uma a uma.

Redes neurais

O processo que trabalharemos aqui será a criação e treinamento de uma rede neural, de modo que o algoritmo “compreenda” por si só quando ele deve apontar um texto como positivo ou negativo, baseado em probabilidades.

Sendo um método criado com base no funcionamento do sistema nervoso humano, o neurônio artificial aponta um fluxo de energia muito semelhante ao neurônio ao natural.

Fonte: Deep Learning Book
Fonte: Monolito Nimbus

O caminho do neurônio biológico é formado pela chegada da informação pelos dendritos, “compreendida” no núcleo, e transportada pelo axônio até que seja passada para o próximo neurônio.

Já no neurônio artificial, temos a entrada das informações, que logo de início passam por pesos (inicialmente randômicos) para o cálculo de probabilidades de possuir certo tipo de característica que ajude a predizer de maneira mais assertiva aquilo que almejamos.

Já no axônio dos neurônios artificiais, temos o que chamamos de “camadas ocultas”, as quais elaboraram cálculos específicos até chegarem em uma função final. Esta que resultará em um único número representativo sobre o palpite que o algoritmo tem se aquele texto em específico é positivo ou negativo.

Porém, tratando-se de um treinamento, é natural notarmos que esse processo de “fluxo de informações” se repete por várias e várias vezes. De fato, ele tem essa frequência, e o objetivo disso é que os pesos sejam calibrados da melhor maneira possível.

Parece surreal e até mesmo fantasioso demais para ser reproduzido na prática, mas hoje dispomos de tecnologias bastante flexíveis e próprias para esse tipo de abordagem, como é o caso do TensorFlow.

Fonte: TensorFlow

Tudo isso que explicamos de maneira geral sobre as redes neurais, a biblioteca TensorFlow trás de maneira muito intuitiva, sendo um verdadeiro bloco de montar para construir uma rede neural.

Análise textual e tokenização

Então veja, como dissemos na introdução esse projeto terá como objetivo a análise textual, assim teremos que construir métodos para que possamos descobrir padrões existentes em textos dos dois tipos de sentimentos.

Aproveito para deixar a minha recomendação para o curso Deep Learning Prático com TensorFlow e Python, o qual foi base para boa parte desse artigo. Nesse curso aprendemos por tokenização, que nada mais é do que um método de procura de palavras únicas em conjuntos de textos, veja um exemplo:

  • “Eu amo Python”
  • “Python significa amar data science”
  • “Estatística é data science e data science é tudo”

Assim, temos as seguintes palavras únicas:

[“Eu”, ”amo”, “Python”, ”significa”, ”amar”, ”data science”, ”Estatística”, ”é”, ”e”, ”tudo”]

Com isso, podemos enxergar as três frases citadas como:

  • [1,1,1,0,0,0,0,0,0,0]
  • [0,0,1,1,1,1,0,0,0,0]
  • [0,0,0,0,0,2,1,2,1,1]

Onde o número zero significa que a frase não tem a palavra respectiva a entrada do vetor, e um ou mais é o número de vezes que aquela palavra aparece.

Banco de dados

import tensorflow as tf
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df_alexa = pd.read_csv('/content/amazon-alexa.tsv', sep = '\t')
df_alexa.head()

Tendo importado as bibliotecas acima, você conseguirá encontrar os dados para o projeto de hoje no Kaggle e deverá ler-los com o auxílio do pandas, não esquecendo de indicar o separador como tabular. Feito isso você verá algo como:

Amostra dos dados

Vemos que no banco de dados temos a disposição colunas relacionadas a número de estrelas da avaliação, data, modelo do produto, texto que foi deixado pelo consumidor e se é positiva ou negativa.

sns.countplot(df_alexa['feedback'], label = 'Count');
sns.countplot(df_alexa['rating'], label = 'Count');

Para iniciar nossa abordagem aqui, podemos estar interessados em saber um pouco sobre a dispersão dos dados. Para isso o código acima nos fornece as seguintes figuras:

Contagem de avaliações por sentimento

Veja que com o gráfico acima notamos que nossos dados estão desbalanceados, tendo mais avaliações de cunho positivo que negativo.

Mais ainda, conseguimos saber pelas avaliações, que prevalecem as aquelas com número de estrelas acima de 4.

df_alexa = df_alexa.drop(['date', 'rating'], axis = 1)

Entretanto, para nossa análise não será tão impactante esses quesitos. Portanto, com o código acima tiramos tanto o número de estrelas quanto a data.

Transformação das variáveis categóricas e tokenização

É chegada a hora de começarmos a fazermos algumas transformações no nossos dados para que seja possível de fato executarmos o aprendizado de máquina.

variation_dummies = pd.get_dummies(df_alexa['variation'])
df_alexa.drop(['variation'], axis = 1, inplace=True)
df_alexa = pd.concat([df_alexa, variation_dummies], axis = 1)

O primeiro deles é a fragmentação da variável de modelo do produto em uma indicadora, de modo que tenhamos algo como:

Transformação para Dummy

Logo após a transformação da variável produto em indicadora, descartamos sua presença no nosso data frame principal e concatenamos as novas variáveis com o sentimento e o texto envolvido pela observação.

from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()alexa_countvectorizer = vectorizer.fit_transform(df_alexa['verified_reviews'])df_alexa.drop(['verified_reviews'], axis = 1, inplace=True)reviews = pd.DataFrame(alexa_countvectorizer.toarray())df_alexa = pd.concat([df_alexa, reviews], axis = 1)

Já no fim da etapa de transformação, é hora de aplicarmos a tokenização. Seremos breves aqui, afinal o Sklearn faz todo o trabalho duro por nós, sendo o nosso único dever de chamar a função e concatenar com os dados transformados no passo anterior.

Classificação e treinamento do modelo

Como todo modelo típico de aprendizado de máquina, é chegado o momento de separarmos nossos dados de treino e teste.

X = df_alexa.drop(['feedback'], axis = 1)y = df_alexa['feedback']from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 5)

Com isso, temos em Y um vetor condizente com a resposta se é positivo ou negativo e em X o resto das variáveis que serviram como preditoras.

X_train.shape

É importante notar o código acima, pois com ele sabemos que os dados de treino possuem 4060 colunas, número que será condizente a quantidade de pesos de entrada.

classifier = tf.keras.models.Sequential()classifier.add(tf.keras.layers.Dense(units = 400, activation='relu', input_shape=(4060,)))classifier.add(tf.keras.layers.Dense(units = 400, activation='relu'))classifier.add(tf.keras.layers.Dense(units = 1, activation='sigmoid'))

Dito isso criamos nossa rede neural, com uma camada inicial e uma oculta, ambas com função de ativação “relu”. Por fim teremos uma única saída, condizente com o cálculo de uma função sigmoide.

classifier.compile(optimizer='Adam', loss='binary_crossentropy', metrics = ['accuracy'])epochs_hist = classifier.fit(X_train, y_train, epochs=10)

Dito que tratamos de um problema de classificação, usaremos a função de perda dada por “binary_crossentropy” e a métrica de avaliação será a acurácia. Configurada nossa rede, treinamos por 10 épocas.

Avaliação do modelo

Não iremos estender tanto nossas análises aqui, pois esse tópico será tema de um artigo único sobre, mas façamos uma breve visualização do resultado.

Acurácia do modelo com o passar das épocas

Veja que nosso modelo se performa muito bem quando olhamos seu desempenho durante o treino, tendo um grande aumento na acurácia.

Matriz de confusão com dados de teste

Entretanto, a matriz de confusão com os dados de teste nos mostra uma dificuldade para acerto quando tratamos de avaliações negativas.

Desse modo, minha sugestão como “próximos passos” é que seja incorporado o uso de “stop words” na fase de tokenização, aprimorando o treinamento por retirar palavras que não tem tanta significância na positividade de uma frase, como conjunções e preposições.

Finalizamos aqui nosso projeto de hoje.

Espero que tenha gostado, nos vemos em breve!