Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROCESSAMENTO DE LINGUAGEM NATURAL Wheslley Rimar Bezerra Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Descrever processos de implementação de algoritmos de análise de sentimentos. � Programar algoritmos de análise de sentimentos. � Analisar os resultados gerados por algoritmos de análise de sen- timentos. Introdução O aprendizado de máquina (do inglês, machine learning) é uma área da ciência da computação ligada à inteligência artificial responsável por treinar sistemas e dispositivos a executarem tarefas que geralmente seriam realizadas por humanos. Nesse sentido, utilizam-se muitas técnicas para que esses treinamentos sejam efetivos. O propósito do machine learning consiste em humanizar os processos, aproximando cada vez mais os dispositivos das capacidades cognitivas humanas. Uma dessas técnicas está pautada na construção de algoritmos de análise de sentimentos que, entre suas muitas aplicabilidades, auxiliam empresas a entenderem o quão satisfeitos estão os clientes em relação aos seus produtos e/ou serviços, identificando e categorizando compu- tacionalmente as opiniões expressas em um conjunto de dados textual, a fim de determinar se a atitude do escritor em relação a um tópico, produto, etc. é positivo, negativo ou neutro. Portanto, neste capítulo, você aprenderá os processos de implemen- tação de um algoritmo de análise de sentimentos, além de programá-lo utilizando a linguagem Python, e, por fim, poderá analisar os resultados gerados a partir dessa implementação. Ainda, trataremos do Naïve Bayes, um categorizador de textos que se baseia na frequência de palavras utilizadas, citado por Ray (2017). Ao final, abordaremos o conceito de matriz de confusão, que avalia a qualidade e o desempenho de um algoritmo (BROWNLEE, 2016). 1 Processos de implementação de algoritmos de análise de sentimentos Sete etapas no processo de análise de sentimentos Em um primeiro momento, conheceremos as sete etapas que envolvem o processo de análise de sentimentos. Assim, após a explicação das etapas 1 e 2, implementaremos um algoritmo de análise de sentimentos utilizando a linguagem Python, a partir do qual você poderá observar em detalhes a descrição do que faz cada linha de código. Para a execução dos códigos deste capítulo, sugerimos a utilização da ferramenta on-line Google Colab, acessado ao digitarmos o termo “Google Colab” no buscador de escolha. Opcionalmente, você pode utilizar outros ambientes de desenvolvimento integrado (IDE) para a execução dos códigos em Python, como PyCharm ou Spyder. Para realizar o download dessas ferramentas, digite “PyCharm” ou “Spyder IDE” no mecanismo de pesquisa de sua preferência. Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning2 Emoções e sentimento Inicialmente, faz-se necessário entender alguns conceitos relacionados a sentimentos. De acordo com Jurafsky e Martin (2008), o primeiro deles é a emoção, um reflexo de eventos internos relevantes. Embora o autor fale sobre oito emoções, as classificações utilizam mais comumente apenas seis: bravo, triste, alegre, medroso, envergonhado, orgulhoso, entusiasmado e desesperado, sendo os mais abordados a tristeza, a raiva, a surpresa, o medo, o desgosto e a alegria. O autor ainda cita oscilações de humor como eventos difusos sem causa aparente, por exemplo, alegre, sombrio, irritável, apático, deprimido e dinâmico, além de algumas atitudes, traços e posturas que trazem mais variações, mas nos ateremos às seis emoções citadas. Diante de tudo isso, devemos identificar palavras e emoções atribuídas a esses sentimentos, como descrito a seguir. � Palavras relacionadas à alegria: animação, belo, anseio, admirar, etc. � Palavras relacionadas a desgosto: abominável, enjoo, repugnante, cha- tear, etc. � Palavras relacionadas a medo: brutal, calafrio, espantoso, estremecer, escuridão, etc. � Palavras relacionadas à raiva: aversão, aborrecer, doido, diabólico, etc. � Palavras relacionadas à surpresa: expectativa, fantástico, encantamento, prodígio, etc. � Palavras relacionadas à tristeza: abatido, contrito, culpa, abandonar, etc. Portanto, a primeira etapa no processamento de emoções consiste em listar as seis emoções apresentadas e definir quais palavras entrarão em cada emoção. Seleção de textos Em uma construção civil, os revestimentos e materiais reais apresentam di- versos aspectos e características que os tornam únicos. Assim, em uma parede de tijolos aparentes, por exemplo, é fácil perceber que o tijolo é um material mais rugoso, irregular e que, entre cada tijolo, há um espaçamento de massa, que, no modo de instalação correta, fica mais recuada. Quando pensamos em uma textura de tijolo para aplicar em uma superfície, a parede do nosso ambiente, precisamos buscar uma imagem que apresente as características mais próximas possíveis do objeto real. Nesse sentido, é importante buscar 3Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning uma imagem de qualidade em bancos de imagens nos quais podemos controlar a qualidade da imagem. Para realizar a mineração de textos e a análise de emoções, com frequência utilizamos o conjunto de bibliotecas Natural Language Toolkit (NLTK), dis- ponível para a linguagem Python e destinado ao processamento de linguagem natural, sendo muito empregado em algoritmos de machine learning. Neste estudo, faremos uso da NLTK, contudo, antes de aplicá-la, é importante conhecer alguns conceitos relacionados à mineração de emoções em textos. No cenário atual, existem inúmeras possibilidade para a mineração de textos, já que encontramos opiniões de pessoas postadas nas mais diversas redes sociais em forma de palavras, bem como em buscadores, como o Goo- gle, ou em diversos sites e mecanismos de pesquisa. Sabe-se, por exemplo, que o Google Trends analisa a estatística das palavras mais pesquisadas no buscador Google e que os criadores de sites utilizam meta tags para otimizar pesquisas orgânicas. Aqui, abordaremos três conceitos: token, documentos e coleção. No uni- verso da mineração de textos, palavras são chamadas por token, refletindo sentimentos e emoções e apresentando verdades sobre opiniões, apreços ou rejeição por determinado post, produto ou notícia. Já documentos, nesse con- texto, são um arquivo único, que pode variar tanto entre e-mails, artigos Web, opiniões, posts e comentários quanto entre avaliações de cinco, quatro, três estrelas, etc., ou seja, um texto — post, artigo ou e-mail — é um documento. E vários textos formam uma coleção. Agora, imagine que, nesse universo de palavras, documentos e coleções, é necessário identificar emoções. Para isso, fazem-se necessário alguns passos de tratamento de textos, feitos quase sempre em Python, pela importação do conjunto de bibliotecas da NLTK, como veremos mais adiante. Em um documento, ao usar NLTK, deve-se excluir palavras stopword (sem significado), como “e”, “ou”, etc. Além disso, é importante que as palavras estejam na mesma formatação, ou seja, em letras minúsculas. Antes de tudo, ao analisar um texto, é necessário calcular a frequência, denominada TF — taxa de frequência (FOSTER; FAWCETT, 2016) —, segundo a fórmula a seguir: Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning4 Para exemplificar, vamos usar um exemplo de mineração de emoções, no qual em um documento analisado a avaliação “Bom atendimento” aparece 3 vezes, “Agilidade” 2 vezes, e “Qualidade” 1 vez. Para calcular a taxa de frequência das palavras, fazemos um cálculo de normalização: � normalizada Bom atendimento = 3/3; � tf normalizada Agilidade = 2/3; � tf normalizada Qualidade = 1/3. Agora, em outro exemplo, em uma coleção inteira de documentos, são oito documentos analisados.Ao analisar a frequência dessas palavras na coleção inteira, percebe-se que nem sempre uma emoção muito presente em um texto consta na maioria dos textos. Na coleção em questão, temos: “Bom atendimento” (ocorre em 5 documentos), “Agilidade” (em 1 documento) e “Qualidade” (em 8 documentos). Assim, é necessário calcular a quantidade de repetição do corpo completo. � Índice de avaliação de Bom atendimento = 3/3 × 5 = 5. � Índice de Importância de Agilidade = 2/3 × 1 = 0,66. � Índice de Importância de Qualidade = 1/3 × 8 = 2,66. Usar cálculos de palavras mais citadas ajuda a identificar o que de fato é importante; ainda, existe um conceito chamado clusterização, que auxilia na venda de produtos combinados ou oferta por público-alvo. Em clusterização por produtos combinados, por exemplo, sabendo que, entre todos que falam de pipoca em um texto, 80% também falam de refrigerante, identificamos a possibilidade de fazer um combo para promoções. Já em clusterização por público-alvo, por exemplo, pode-se dividir as análises de textos por clusters por idade, avaliando uma coleção de textos de jovens entre 20 e 30 anos, outra entre adultos de 30 a 40 anos e outra entre adultos de 40 a 50 anos. Assim, é possível descobrir semelhanças úteis entre as opiniões de cada grupo, que auxiliam na formação de futuras propagandas. 5Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning 2 Programação de algoritmos de análise de sentimentos Certamente, você percebeu que o processo de análise de sentimentos exige uma série de cuidados especiais, com uma grande atenção aos detalhes, para que o resultado seja efetivo e o algoritmo tenha sucesso em seus propósitos. Analisar sentimentos em textos requer treinar o algoritmo com uma base de dados ampla, excluindo tudo aquilo que é desnecessário, como as stopwords, que veremos a seguir. Assim, a partir desse ponto, veremos como se dá todo o processo de análise de sentimentos utilizando a linguagem Python. Remoção das stopwords Para eliminar todas as stopwords, execute as etapas a seguir em seu ambiente integrado de desenvolvimento. No seguinte exemplo, foi feita uma pesquisa em 10 posts de comentários sobre uma rede de fast food, tendo-se identificado que as frases contidas na variável basetreinamento se repetiram de uma forma ou de outra, com maior frequência em toda a coleção. Nosso objetivo aqui é mostrar como remover stopwords da base de treinamento de emoção, motivo pelo qual você precisa ler os códigos; contudo, antes de colocar isso em prática, observe a Figura 1, pois ela mostra, no canto esquerdo, o código inteiro e, no direito inferior, o resultado. Para executar cada comando do código, selecione a frase completa, cole no Google Colab e pressione Alt Enter. No nosso exemplo, usamos o Spyder, mas recomendamos que empregue o Google Colab. A Figura 1 mostra o resultado no canto direito sem stopwords. Faça um teste: ao copiar a função que inicia com def, mantenha exatamente o mesmo espaçamento (indentação). Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning6 Figura 1. Remoção de stopwords. Função que remove stopwords Criação de frases que aparecem frequentemente na coleção de post De�nição de stopwords Resultado da linha 26, que exibe a base sem stopwords Stemização Agora, falaremos de stemização (do inglês, stemmming), isto é, a remoção de sufixos, o que nos leva a manter apenas os prefixos das palavras. Segundo Rouse (2018), stemização consiste no processo de redução de uma palavra ao seu radical. Assim, o prefixo am, por exemplo, das palavras “amar”, “amou”, etc., será igualmente calculado. Novamente, explicaremos passo a passo como se dá esse processo na Figura 2. Figura 2. Processo de stemização. Aqui importamos duas bibliotecas que auxiliam na tradução da sintaxe para português: Colocamos na variável stopwordsnltk as stopwords em português A função descrita abaixo removerá o su�xo (fará o stemm) das palavras através da divisão (split) e da remoção do su�xo Palavras sem su�xo, resultado da linha 46 7Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning Treinar a base para o aprendizado de máquina Nesta etapa, executaremos alguns comandos que serão responsáveis pelo treinamento do algoritmo. O primeiro deles consiste em contar quantas vezes aparecem as 30 palavras principais (Figura 3), o que é feito por meio da palavra nativa chamada FreqDist. Figura 3. Cálculo da frequência de palavras. Primeiro note que vamos dissociar as palavras das emoções e pegar só as palavras Perceba que usaremos o FreqDist para calcular a frequência. Em seguida, imprimiremos na tela, as stopwords em português Resultado das 30 palavras mais comuns Até aqui, com esses dados, já é possível criar uma tabela (Quadro 1), relacionando palavras a sentimentos, para proceder com tomadas de decisões em relação a filtros de bancos de dados. Pode-se navegar em meio a um banco de dados textual e procurar as palavras contidas na primeira linha da tabela para agilizar pesquisas de sentimentos. É recomendável fazer a remoção de stopwords, a stemização e o levantamento de frequência da maior quantidade de linhas, para, assim, criar uma tabela mais complexa do que está embaixo. Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning8 La nc he A m o A ss us En tr eg Ir ri ta nt D em Su rp re en d D es ap ro v Alegria 3 2 1 Surpresa 2 Medo 2 Tristeza Desgosto 1 Raiva 1 1 1 Quadro 1. Analisando palavras para pesquisas em bancos de dados Aplicar o teste de palavras Supomos que você precisa saber se determinada palavra, ou algumas pala- vras, está no texto (Figura 4), além dos sentimentos que ela reflete. No nosso exemplo, gostaríamos de saber se as palavras em seus radicais admir, hoje e bonit estão no texto e os sentimentos a elas associados. Figura 4. Descobrir se as três palavras estão presentes. Em banco de dados, para descobrir se as palavras estão presentes, costuma-se usar o símbolo de % no meio da palavra, para descobrir se aquele trecho está presente, assim, criaremos a função analisarpalavras: O resultado mostrará que tem “admir”, tem “hoj” , e tem “bonit”. 9Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning Agora, vamos descobrir os sentimentos associados a cada uma dessas palavras, pela utilização do classificador Naïve Bayes, que, embora explicare- mos após o script, refere-se ao modelo matemático de probabilidade que faz o treinamento de probabilidade a priori e, depois, o aplica a posteriori. De acordo com Jurafsky e Martin (2008), a todo momento nossos rostos, vozes e palavras dizem algo, e criar modelos que treinem bases para classificar sentimentos representa uma das muitas ações da NLTK aplicada em Bayes (Figura 5). Figura 5. Avaliação de palavras. Aplica o método bayesiano na classi�cação Descobre qual sentimento a palavra “boni” na variável “teste_bonit” denota. Resultado = alegria Descobre qual sentimento a palavra “amedrontado” na variável “teste_am” denota. Resultado = medo Descobre qual sentimento a palavra “hoje” na variável “teste_hj” denota. Resultado = medo Um questionamento que pode surgir é: como o algoritmo de Bayes faz uma decisão? A equação de Bayes é feita da seguinte maneira: Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning10 Para entender essa equação, vamos supor a análise de oito pessoas dife- rentes, conforme o Quadro 2. PESSOA FAIXA SOCIAL ESTADO CIVIL TEM PAIS VIVOS COMPRAR CASA? 1ª Pessoa MÉDIA SOLTEIRO SIM SIM 2ª Pessoa BAIXA CASADO NÃO NÃO 3ª Pessoa ALTA DIVORCIADO NÃO SIM 4ª Pessoa MÉDIA SOLTEIRO NÃO SIM 5ª Pessoa MÉDIA CASADO SIM NÃO 6ª Pessoa ALTA SOLTEIRO NÃO NÃO 7ª Pessoa BAIXA CASADO SIM SIM 8ª Pessoa BAIXA CASADO SIM NÃO Quadro 2. Pesquisas Agora,aplicaremos a fórmula descrita para identificar, por faixa social, quem tem maior probabilidade de comprar uma casa, como mostrado no Quadro 3. Não Sim BAIXA 2 1 =3/8 0,375 MÉDIA 1 2 =3/8 0,375 ALTA 1 1 =2/8 0,25 Total 4 4 4/8 4/8 0,5 0,5 Quadro 3. Análise de probabilidade da compra de uma casa 11Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning Quem é de classe alta compra casa (sim) com qual probabilidade? Quem é de classe média compra casa (sim) com qual probabilidade? Quem é de classe baixa compra casa (sim) com qual probabilidade? Nesse momento, surgem algumas dúvidas: a classe média compra mais casas que a classe alta? Na verdade, pode ser que sim, ou não, motivo pelo qual se torna necessário calcular o Bayes dos índices para traçar a probabilidade de cada cluster (grupo específico). Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning12 Esse é o cálculo feito no classificador de emoções contido nas variáveis citadas: � basecomclassificador = nltk.classify.apply_ features(analisarpalavras, frasescomstemming) � print(basecomclassificador) 3 Análise dos resultados Cada negócio, dataset e banco, além de cada conjunto de letras, apresenta uma lógica interna, formada por fatores econômicos, geográficos, demográficos, psicológicos, mercadológicos, processuais, legais, sociográficos, governamen- tais e climáticos, ou seja, cada caso deve ser analisado individualmente. Cada planilha de dados coletados tem uma probabilidade e uma lógica interna, e descobrir essa lógica constitui a base do Data Science. A matriz de confusão avalia na primeira coluna se o que era para dar positivo deu positivo, ou se o que era para dar negativo deu negativo; então, teríamos verdadeiro positivo e verdadeiro negativo. A última coluna avalia se o previsto foi falso, se o que era para dar positivo deu falso negativo, ou se o que era para dar negativo deu falso positivo. No Quadro 4, podemos observar uma matriz de confusão, na qual temos quatro palavras — feliz, alegre, triste e chateada. No exemplo, o código de Naïve Bayes colocou as palavras nas colunas positivo e negativo, de acordo com o treinamento ao qual o algoritmo foi exposto. É ALEGRIA? Previsto Re al id ad e Positivo (coluna 1) Negativo (coluna2) Positivo Feliz e Alegre (VERDADEIRO POSITIVO) Chateada (FALSO NEGATIVO) Negativo (VERDADEIRO NEGATIVO) Triste (VERDADEIRO NEGATIVO) Quadro 4. Matriz de confusão 13Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning Avaliar acurácia e matriz de confusão Agora que você já sabe analisar textos, precisa verificar se a análise está correta, contexto no qual a matriz de confusão se insere, já que analisa se o esperado se cumpriu. Sempre que se faz um algoritmo, é necessário testá-lo. No exemplo a seguir, você perceberá que o teste acertou em tudo, exceto em uma palavra, “tristeza”, visto que o treinamento de “tristeza” foi pequeno. O ideal é colocar no mínimo 10 frases e tentar descobrir o motivo pelo qual o teste errou, verificando qual palavra foi usada. Faremos a matriz de confusão no Python. A Figura 6 mostra a criação de uma base para treino. Figura 6. Treinamento de base. Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning14 A Figura 7 exibe a criação de uma base para teste, importação de ferra- mentas de idioma e tradução para português, além da remoção de stopwords. Figura 7. Remoção de stopwords e criação da base de teste. A Figura 8 mostra a stemização tanto do treino quanto do teste: nas linhas 72 a 80, é criada a função de stemizar e, nas linhas 80 e 81, as variáveis de stemm para ambas as bases; já nas linhas 84 a 90, a figura mostra como colocar todas as palavras de cada base em duas variáveis — palavrastreina e palavrasteste. Nesse ponto, ela remove as emoções após a vírgula, mas as deixa armazenadas na variável emotion para usos futuros. 15Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning Figura 8. Stemização e separação de palavras de emoções. Na Figura 9, nas linhas 93 até 95, como o FreqDist, a função buscarpalavras calcula a frequência de cada palavra de cada base, que será colocada, nas linhas 89 e 90, nas variáveis frequenciatest e frequen- ciatreina. Nas linhas 101 até 107, a função procurapalavrasunicas descobre quais palavras são únicas em cada base. Figura 9. Busca da frequência e de palavras únicas. Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning16 Na Figura 10, o algoritmo descobre se as palavras entre aspas estão no código. Pode-se também pesquisar frases. Figura 10. Pesquisa de palavras ou frases. Fonte: Do autor – 2020. Na Figura 11, é criado o classificador, pelo nltk.classify, nas duas bases de treinamento e teste: basecheiatreinamento e basecheia- teste nas linhas 120 e 121. A linha 124 treina a basecheiatreina- mento no Naïve Bayes, para compreender as emoções e armazená-las, para, posteriormente na análise da matriz de confusão, linha 128, comparar com a basecheiateste na linha 131; o resultado está à direita. Figura 11. Realização da matriz de confusão. Também é possível analisar a matriz de confusão com outra biblioteca, a scikit-learn, que, assim como a NLTK, pode ser utilizada no aprendizado de máquina. A vantagem da scikit-learn reside no fato de que ela também faz cálculos rápidos de regressão linear, analisando quando um indicador influencia em outro, além de cálculos de classificação, entre outros cálculos estatísticos. Ela pode ser é utilizada com matplotlib, uma biblioteca que desenha gráficos. Assim, as conclusões matemáticas de scikit-learn se dão por desenhos mais visuais e agradáveis. 17Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning No exemplo que estamos seguindo, que pode ser analisado rapidamente, temos o verdadeiro na linha 1, o previsto na linha 2 e a análise na linha 3. O resultado da matriz de confusão é dado conforme a Figura 12. Figura 12. Matriz de confusão no sklearn. Para finalizar, segue mais um exemplo na Figura 13, agora de maneira ordenada. Figura 13. Matriz de confusão no sklearn ordenada. Isso pode ser feito com grandes bases de textos importadas, bastando so- mente substituir as linhas 1 e 2 por importações de arquivos csv ou arrays da biblioteca numpy. Neste capítulo, você pôde perceber que a linguagem Python, pela remoção de stopwords, a stemização, a análise de frequência e o treinamento com Bayes, tem o poder de avaliar emoções contidas em uma frase, a partir da Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning18 inteligência artificial e da machine learning. Entretanto, é importante mencionar a necessidade de sempre analisar a eficácia do algoritmo para evitar análises erradas, para o qual devemos fazer uso da matriz de confusão. BROWNLEE, J. What is a Confusion Matrix in Machine Learning. Machine Learning Mystery, Vermont, 18 Nov. 2016. Disponível em: https://machinelearningmastery.com/ confusion-matrix-machine-learning/. Acesso em: 9 maio 2020. FOSTER, P.; FAWCETT, P. Data science para negócios: o que você precisa saber sobre mineração de dados e pensamento analítico de dados. Rio de Janeiro: Alta Books, 2016. 408 p. JURAFSKY, D.; MARTIN, J. H. Speech and language processing: an introduction to natural language processing, computational linguistics, and speech recognition. 2. ed. Upper Saddle River: Prentice Hall, 2008. 1024 p. RAY, S. 6 Easy Steps to Learn Naive Bayes Algorithm with codes in Python and R. Analytics Vidhya, Gurgaon, 11 Sep. 2017. Disponível em: https://www.analyticsvidhya. com/blog/2017/09/naive-bayes-explained/. Acesso em: 9 maio 2020. ROUSE, M. What is stemming? Search Enterprise AI, Newton, Jan. 2018. Disponível em: ht- tps://searchenterpriseai.techtarget.com/definition/stemming.Acesso em: 9 maio 2020. Leituras recomendadas BIRD, S.; KLEIN, E.; LOPER, E. Natural language processing with Python: analyzing text with the Natural Language Toolkit. Sebastopol: O’Reilly, 2009. 504 p. ESCOVEDO, T.; KOSHIYAMA, A. Introdução a data science: algoritmos de machine learning e métodos de análise. São Paulo: Casa do Código, 272 p. Os links para sites da web fornecidos neste capítulo foram todos testados, e seu fun- cionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. 19Análise de sentimentos — Utilizando Python para construir e treinar modelos de machine learning
Compartilhar