Análise de Sentimento e Processamento de Texto Daniel Medeiros Rocha 2018 Análise de Sentimento e Processamento de Texto Daniel Medeiros Rocha © Copyright do Instituto de Gestão e Tecnologia da Informação. Todos os direitos reservados. ASP-Análise de Sentimento e Processamento de Texto – Página 2 de 101 Sumário Capítulo 1. Análise de Sentimento ........................................................................ 5 1.1 Introdução à Análise de Sentimento .......................................................... 5 1.2 Análise de Sentimento em Redes Sociais ................................................. 9 Capítulo 2. Processamento de Linguagem Natual (PLN) .................................... 14 2.1 Introdução................................................................................................ 14 2.2 Aplicações ............................................................................................... 17 2.3 Estrutura e sintaxe da Linguagem ........................................................... 20 2.4 Desambiguação....................................................................................... 23 2.5 Análise Semântica ................................................................................... 24 Capítulo 3. Técnicas de Machine Learning.......................................................... 32 3.1 Introdução................................................................................................ 32 3.2 Aprendizagem supervisionada ................................................................ 37 3.3 Aprendizagem Não-supervisionada......................................................... 39 Capítulo 4. Classificadores .................................................................................. 42 4.1 Introduçção à Python ............................................................................... 42 4.2 Naive Bayes ............................................................................................ 58 4.3 Support Vector Machines ........................................................................ 60 4.4 K-Means .................................................................................................. 66 Capítulo 5. Frameworks e bibliotecas para Machine Learning e ASP ................. 71 5.1 Weka ....................................................................................................... 71 ASP-Análise de Sentimento e Processamento de Texto – Página 3 de 101 5.2 Pandas e SciKit-Learn ............................................................................. 73 5.3 DialogFlow ............................................................................................... 77 5.4 NTLK ....................................................................................................... 80 Capítulo 6. Coleta de Dados na web ................................................................... 81 6.1 Bases de dados para Machine Learning ................................................. 81 6.2 Modelando bases de dados com Pandas e SciKit-Learn ........................ 84 6.3 API do Twitter para coleta de Dados ....................................................... 86 6.4 API do Facebook para coleta de Dados .................................................. 88 Capítulo 7. Processamento e classificação de Texto .......................................... 90 7.1 Introdução................................................................................................ 90 7.2 Técnicas de Pré-Processamento............................................................. 91 7.3 Normalização........................................................................................... 95 7.4 Classificação de Textos (algoritmos) ....................................................... 96 7.5 Similaridade entre textos com Affinity Propagation ................................. 99 Referências 101 ASP-Análise de Sentimento e Processamento de Texto – Página 4 de 101 Capítulo 1. Análise de Sentimento 1.1 Introdução à Análise de Sentimento No Brasil, as pesquisas sobre Análise de Sentimento ainda estão se estabelecendo. Os trabalhos sobre a área de análise de sentimento, mineração de opinião e outros temas relacionados, começaram a surgir com mais frequência após os anos 2000 e o número de pesquisas sobre o assunto vem crescendo. O número de trabalhos sobre o tema ainda é bem limitado, principalmente devido a complexidade em se trabalhar com texto, principalmente advindos de redes sociais, que são desestruturados e o processo para fazer o tratamento exige um custo de tempo alto. É evidente o crescimento da quantidade de informação disponível na Web nos últimos anos. Além do conteúdo disponibilizado por empresas de notícias, os usuários passaram a compartilhar na Web seus conhecimentos, críticas e opiniões em blogs pessoais, sites de relacionamentos, microblogs, dentre outros meios. Com este aumento da participação dos usuários nos conteúdos da Web, surgiu também uma nova área de pesquisa relacionada ao Processamento de Linguagem Natural, chamada de Análise de Sentimentos ou Mineração de Opinião. Para a Aprendizagem de Máquina, essa montanha crescente de dados oferece um vislumbre fascinante da consciência coletiva dos usuários de internet. A Análise de Sentimentos visa identificar o sentimento que os usuários apresentam a respeito de alguma entidade de interesse (um produto específico, uma empresa, um lugar, uma pessoa, dentre outros) baseado no conteúdo disponível na Web. O objetivo principal é permitir que um usuário obtenha um ASP-Análise de Sentimento e Processamento de Texto – Página 5 de 101 relatório contendo o que as pessoas andam dizendo sobre algum item sem precisar encontrar e ler todas as opiniões e notícias a respeito. Cada vez mais pessoas e principalmente empresas, estão interessadas em observar as opiniões de um grupo de pessoas sobre temas que lhe interessam. Um caso comum é uma empresa que se interessa em medir a aceitação de um novo produto, monitorando as opiniões de um grupo em relação a ele. A análise de sentimento é um tipo de mineração de dados que possibilita tal demanda. Utiliza-se ontologia para a realização da mineiração, além de graus numéricos para indicar o quanto uma palavra ou expressão indica o sentimento. Não é analisado o que o conteúdo dos textos expressa, mas sim a emoção predominante no mesmo (positivo ou negativo dentre outros). Figura 1: Google trends – pesquisa abrangendo o termo Sentiment Analysis Pesquisas atuais nos sugerem como a área tem tido um aumento muito grande nestes últimos anos e tende a continuar crescendo. Especificamente para a língua portuguesa, o número de trabalhos neste tema é ainda mais limitado. Encontram-se ainda poucos trabalhos bons que fazem a análise de textos na língua portuguesa, e os trabalhos existentes em sua maioria não apresentem resultados satisfatórios. ASP-Análise de Sentimento e Processamento de Texto – Página 6 de 101 Aplicações práticas A análise de sentimentos pode ser aplicada hoje nos seguintes cenários: Sentimento sobre um produto: Esta análise pode ser usada por uma empresa para determinar a aceitação de um certo produto lançado no mercado, contribuindo para alterações estratégicas nas âreas de marketings. Ainda é possível verificar o sentimento sobre um produto que foi anunciado mas ainda não foi lançado, podendo ajudar em algumas alterações durante o desenvolvimento. Empresas na bolsa de valores: Este cenário é usado para analisar empresas que contem ações na bolsa de valores. O sentimento sobre determinada empresa pode ser obtida através da opinião de especialistas e sites de notícias. O analisador ajuda na tomada de decisão sobre compras e vendas de ações, mas não deve ser um fator decisivo. Análise sobre pessoas: O minerador de opinião pode ser usado para se obter o sentimento sobre determinada pessoas, especialmente daqueles que aparecem muito na mídia. É possível saber, por exemplo, a aceitação ou rejeição de um determinado político durante a época de eleições, dando alternativa para que o político altere sua estratégia de campanha. Os dados para uma análise podem ser obtidas de diversas fontes na internet, antigamente restrito a blogs e fóruns, hoje se expande as redes sócias. Algumas das fontes de minerações: Mecanismos de busca: É possível usar mecanismos de busca como Google ou Bing para obtenção de opiniões na internet, principalmente em fóruns e blogs, mas podendo estender a qualquer site. Este método de obtenção de opinião é variável, conforme a ferramenta de busca altera seus resultados, e não é muito acurado, sendo que páginas favorecidas pela mecanismo de busca podem alterar o ASP-Análise de Sentimento e Processamento de Texto – Página 7 de 101 resultado. O site whatdoestheinternetthink.net possui um algoritmo para saber a opinião da internet sobre determinado assunto, utilizando a ferramenta Bing. Twitter: O twitter é um ótimo local para se obter opinião sobre determinado assunto, já que é uma rede social focada em opiniões de usuários. Ele possui mais de 500 milhões de tweets diários (2015), e os tweets são, em sua maioria, públicos, fornecendo uma base rica em informação e de facil acesso. O site sentiment140 (http://www.sentiment140.com) obtém informações de tweets recentes sobre determinado assunto e forma um gráfico analisando as opiniões dos úsuarios. Facebook: O facebook possui uma grande quantidade de usuários (1 bilhão de usuários ativos em outubro de 2012). Os usuários podem demonstrar suas opiniões através de mensagens, compartilhamentos e “likes”. A obtenção destes dados pode não ser tão trivial em comparação ao twitter, já que não é possível obter estas informações de forma simples, podendo ser necessário a instalação de aplicativos. O Facebook possui uma ferramenta em suas fan pages chamada “Facebook Insight”, ele não funciona exatamente como um minerador de opiniões, mas possui informações sobre a página, incluindo feedbacks negativos. Etapas da mineração de opinião O processo de mineração de opinião consiste basicamente em 3 etapas. Como segue: Coleta de conteúdo; Classificação; Sumarização dos resultados ASP-Análise de Sentimento e Processamento de Texto – Página 8 de 101 Figura 2: Estrutura de classificação de análise de sentimento 1.2 Análise de Sentimento em Redes Sociais A Análise de Sentimento em redes sociais vem sendo explorada em diferentes tipos de pesquisas, tendo como principal intuito extrair opiniões dos usuários, possibilitando que informações significativas sejam obtidas. As redes sociais vem se tornando uma importante fonte para análise de dados, uma vez que nestas estão dados advindos de diferentes perfis de usuários sobre os mais diversos assuntos. Redes sociais online, são serviços Web que permitem que os indivíduos construam perfis públicos ou semi-públicos dentro de uma comunidade virtual na Internet, articulem uma lista de outros usuários com os quais compartilham ASP-Análise de Sentimento e Processamento de Texto – Página 9 de 101 conexões e visualizem e percorram as suas listas de conexões e outras listas feitas por outros usuários no sistema. Um exemplo de rede social online é o Twitter - http://www.twitter.com Especificamente para análise de sentimento, o Twitter é uma base rica, pois concentra publicações de usuários com tamanho padronizado, e na grande maioria estão na forma textual. O Twitter é um serviço de microblog popular onde os usuários postam mensagens de status. Figura 3 – Página inicial do Twitter As mensagens de status postadas pelos usuários são chamadas de tweets. ASP-Análise de Sentimento e Processamento de Texto – Página 10 de 101 Essas mensagens são textos curtos, podendo ter no máximo 140 caracteres. Segundo o site do Twitter, essa rede social possui mais de 500 milhões de usuários, dos quais 284 milhões são usuários ativos na rede. Cerca de 500 milhões de tweets são publicados diariamente. Figura 4: Exemplo de postagem no Twitter do General do Brasil Vilas Boas A quantidade enorme de dados pode ser usada para fornecer insights da opinião do público sobre vários tópicos diferentes, desde política até filmes e produtos. Para poder extrair essas informações dos tweets, as aplicações precisam realizar a análise de sentimento dessas mensagens, que consiste em categorizar o sentimento de um texto como positivo ou negativo de acordo com o seu conteúdo. Como o volume de dados é muito grande, é inviável processar esses tweets manualmente para deles extrair as informações necessárias. Por isso, muitas organizações estão aderindo a formas automáticas de extração das referidas informações. ASP-Análise de Sentimento e Processamento de Texto – Página 11 de 101 Sem dúvidas, trata-se de um ambiente propício a pesquisas e, como tal, vem sendo explorado tanto pela indústria quanto pela academia, principalmente nos últimos anos. iFeel iFeel - Uma ferramenta online para análise de sentimentos. Como uma esforços em buscar e agrupar diversos métodos na literatura, o departamento de computação (DCC) da UFMG, disponibilizou o serviço “iFeel [Araújo et al., 2014]”. - www.ifeel.dcc.ufmg.br. O serviço/aplicativo, facilita o acesso a diversos métodos de análise de sentimentos, sendo uma ferramenta bem útil para aqueles que gostariam de ter contato com a análise de sentimento mesmo sem conhecimento da área. O iFeel também pode ajudar pesquisadores que pretendem avaliar novos métodos em uma única plataforma. Figura 5: Página inicial do iFeel ASP-Análise de Sentimento e Processamento de Texto – Página 12 de 101 Figura 6: Exemplo de classificação de polaridade da sentença inserida ASP-Análise de Sentimento e Processamento de Texto – Página 13 de 101 Capítulo 2. Processamento de Linguagem Natual (PLN) 2.1 Introdução A classificação de documentos/textos é uma das tarefas importantes e típicas no aprendizado de máquina supervisionado (ML). Atribuir categorias a documentos, que podem ser uma página web, livro de biblioteca, artigos de mídia, galeria, etc. tem muitos aplicativos como filtragem de spam, roteamento de e-mail, análise de sentimentos, etc. Será demonstrado nos próximos capítulos, como podemos fazer texto classificação usando python, scikit-learn e o framework NLTK. Linguagem Natural é definida como uma linguagem que é usada para a comunicação diária de humanos. Chama-se Processamento de Linguagem Natural (PLN) um conjunto de técnicas teórico-computacionais que visam representar dados textuais e processar a linguagem natural humana para diversas tarefas. Qualquer tipo de manipulação por computador de uma linguagem natural é definido como um PLN. Ao contrário de linguagens artificiais, como linguagens de programação e notações matemáticas, linguagens naturais evoluíram através das gerações, sendo difícil muitas vezes explicar as suas regras de construção. Por um lado, pode ser simples como contar a frequência de palavras para comparar diferentes estilos de escrita. Por outro lado, PLN envolve entender a comunicação humana e conseguir dar respostas úteis para perguntas feitas por humanos. PLN está voltado, essencialmente, a três aspectos da comunicação em língua natural: ASP-Análise de Sentimento e Processamento de Texto – Página 14 de 101 som: fonologia estrutura: morfologia e sintaxe significado: semântica e pragmática A fonologia está relacionada ao reconhecimento dos sons que compõem as palavras de uma língua. A morfologia reconhece as palavras em termos das unidades primitivas que a compõem (Ex. caçou → caç + ou). A sintaxe define a estrutura de uma frase, com base na forma como as palavras se relacionam nessa frase. (veja figura) Figura 7: Exemplo de uma árvore sintática A semântica associa significado a uma estrutura sintática, em termos dos significados das palavras que a compõem. Na estrutura da figura [7], podemos associar o significado “um animal perseguiu/capturou outro animal”. ASP-Análise de Sentimento e Processamento de Texto – Página 15 de 101 O aspecto pragmático, verifica se o significado associado a uma estrutura sintática é realmente o significado mais apropriado no contexto considerado (ex. no contexto predador-presa, “perseguiu/capturou” → “comeu”. Para a análise de sentimento por PLN, existem diferentes tipos de análise: 1. Nível de documento: o objetivo é saber o sentimento geral do texto sobre o assunto a que ele se refere. O mesmo texto pode conter frases positivas e negativas sobre o assunto e é preciso consolidar o sentimento predominante do texto. 2. Nível de sentença: o objetivo é saber o sentimento de uma sentença do texto. A mesma sentença pode ter sentimentos conflitantes e, da mesma forma, a intenção é saber o sentimento predominante da sentença. 3. Nível de palavra: o objetivo é saber se uma determinada palavra no texto tem conotação positiva ou negativa. Em alguns casos, o documento ou sentença não apresenta nenhum sentimento ou opinião. Por isso, para algumas aplicações, é necessário saber se um determinado documento é objetivo ou subjetivo. O nível de análise do sentimento extraída de um texto depende da aplicação. pode ser mais interessante saber sobre alguns aspectos específicos do produto, como a bateria ou a resolução da tela por exemplo e isso inclui o contexto do objeto ou texto a ser analisado. A análise de sentimentos de tweets é uma tarefa relacionada à análise de sentimentos tradicional, com algumas peculiaridades. Por um lado, a análise de tweets pode ser considerada mais fácil do que a análise de textos tradicionais pelo tamanho curto dessas mensagens, o que faz com que normalmente elas sejam mais objetivas na opinião que querem expressar. ASP-Análise de Sentimento e Processamento de Texto – Página 16 de 101 Por outro lado, o uso de gírias, abreviações, sarcasmo, emoticons, hashtags, menções e links podem dificultar o trabalho de processamento desses textos, tornando-os mais difíceis do que textos tradicionais. A análise de sentimentos de tweets normalmente é usada para analisar a opinião geral dos usuários sobre um determinado tópico, normalmente através de filtros de hashtags, usuários ou termos. Na maioria dos casos para análise de sentimentos no Twitter por exemplo, é suficiente extrair se o tweet em questão, apresenta uma opinião positiva ou negativa. 2.2 Aplicações PLN é uma área de pesquisa muito vasta, que envolve diversas disciplinas do conhecimento humano. Cito aqui as aplicações mais utilizadas hoje em dia: Sumarização automática: Produz um resumo legível de uma parte do texto. Muitas vezes usado para fornecer resumos de texto de um tipo conhecido, como artigos na seção financeira de um jornal. Resolução de correferência: Dada uma frase ou um pedaço maior de texto, determina quais palavras ("menções") se referem aos mesmos objetos ("entidades”). Análise do Discurso: Uma tarefa é identificar a estrutura discursiva do texto conectado. Máquina de tradução: Tarefa de traduzir automaticamente texto de uma linguagem humana para outra. Segmentação morfológica: Separa palavras em morfemas individuais e identifica classes de morfemas. (Um morfema é a menor unidade gramatical de uma língua). ASP-Análise de Sentimento e Processamento de Texto – Página 17 de 101 Geração de linguagem natural: Converte informações de bancos de dados de computador ou intenções semânticas em linguagem humana legível. Compreensão da linguagem natural: Converte pedaços de texto em representações que são mais fáceis de manipular pelos programas de computador. Figura 8: exemplo de robô (Ed) educativo criado pelo Brasil (Petrobrás) Reconhecimento óptico de caracteres (OCR): Dada uma imagem que representa o texto impresso, determina o texto correspondente. Marcação de classe gramatical: Dada uma sentença, determina a classe gramatical de cada palavra. Análise sintática (Parsing): Determina a árvore de análise (análise gramatical) de uma frase. ASP-Análise de Sentimento e Processamento de Texto – Página 18 de 101 Respostas a perguntas: Dada uma questão de linguagem humana, determina sua resposta. Análise de subjetividade: É o mesmo que análise de sentimento. Reconhecimento de fala: Dado um clipe de som de uma pessoa ou pessoas falando, determina a representação textual do discurso. (oposto de síntese). Síntese da fala: É o processo de produção artificial da fala humana. Recuperação de informações: Trata-se de armazenar, pesquisar e recuperar informações voltado para bancos de dados. Figura 9: outro exemplo de chatboot criado para recuperação de informação com reconhecimento de linguagem natural (empresa sete.zoom). Um dos problemas existentes a ser analisado e resolvido com PLN hoje em dia, é a análise de sentimentos. ASP-Análise de Sentimento e Processamento de Texto – Página 19 de 101 PLN, tem sido estudado por cientistas da computação há bastante tempo, porém o interesse pela análise de sentimentos é mais recente das aplicações. 2.3 Estrutura e sintax da Linguagem A estrutura de uma linguagem, é definida por sua gramática. E a gramática, é uma especificação formal da estrutura das sentenças permitidas numa linguagem. O modo mais simples de definir uma gramática, é especificando um conjunto de símbolos terminais, denotando palavras da linguagem, um conjunto de símbolos não terminais, denotando os componentes das sentenças e um conjunto de regras de produção, que expandem símbolos não terminais numa sequência de símbolos terminais e não-terminais. Além disso, a gramática deve ter um símbolo não-terminal inicial. Ex.: O gato caçou o rato Pode ser definido por: frase => sujeito + predicado sujeito => artigo + substantivo predicado => verbo + artigo + substantivo artigo => o substantivo => gato / rato verbo => caçou Para essa gramática, o símbolo não-terminal inicial definido é “frase”. Os símbolos terminais são ‘o’, ‘gato’, ‘caçou’, ‘rato’. ASP-Análise de Sentimento e Processamento de Texto – Página 20 de 101 Nas gramáticas livres de contexto (que é a linguagem natural), o lado esquerdo de uma regra de produção será sempre um único símbolo não terminal, enquanto o lado direito pode conter símbolos terminais e não terminais. Uma gramática pode ser usada tanto para reconhecimento (para decidir se essa frase pertence à linguagem definida pela gramática ou para geração, ou seja, para construir uma frase pertencente à linguagem definida pela gramática. Existem duas estratégias que podemos aplicar para o reconhecimento de frases: 1. Top Down (árvore sintática) 2. Botton Up Abordagem Top Down: Com essa abordagem, sintetizamos a frase a ser reconhecida aplicando as regras de produção de forma progressiva, em profundidade, a partir do símbolo inicial da gramática. Por exemplo, para reconhecer a frase “o gato caçou o rato", procedemos da seguinte maneira: Conseguindo a gramática evoluir até seu final (nas folhas que são os símbolos terminais), dizemos que a sentença foi reconhecida pela gramática. Considere agora a frase: “o gato rato caçou: Então temo: ASP-Análise de Sentimento e Processamento de Texto – Página 21 de 101 Frase sujeito + predicado artigo + substantivo + predicado “o” + substantivo + predicado “o” + “gato” + predicado “o gato” + verbo + artigo + substantivo =>onde está o verbo na frase? A gramática não reconhece. Abordagem Botton Up: Com essa abordagem, derivamos o símbolo inicial da gramática a partir da frase a ser reconhecida, aplicando as regras de produção de forma regressiva. Por exemplo, para reconhecer a frase “o gato caçou o rato", procedemos da seguinte maneira: Obtivemos o símbolo não terminal “frase”, da gramática à partir da frase sendo reconhecida. Então a frase pertence à linguagem definida pela gramática! ASP-Análise de Sentimento e Processamento de Texto – Página 22 de 101 2.4 Desambiguação Ambiguidade léxica, acontece quando uma palavra tem mais de um possível significado. Para exemplificar, pode-se citar a palavra “bala”, que pode ser utilizada no sentido de um doce ou de uma munição! O problema da ambiguidade lexical veio da necessidade de escolher por um dos possíveis significados de uma palavra quando da sua interpretação, relações semânticas. O tratamento da ambiguidade léxica é um estudo amplo na área de processamento de linguagem natural. Na criação de modelos para a tarefa de desambiguação léxica de sentido, os seguintes passos são considerados: 1. Determinar o conjunto de palavras a serem desambiguadas; 2. Definir todos os sentidos possíveis de cada palavra 3. Avaliar o mecanismo estabelecido. Determinar o conjunto das palavras que precisarão passar pelo tratamento da desambiguação depende da aplicação do mecanismo. Alguns trabalhos realizam a desambiguação de todas as palavras de conteúdo da língua. Desambiguação no sentido da palavra, é a tarefa mais crítica na área de linguística computacional. É considerado um problema de difícil solução no ramo da IA (Inteligência Artificial). ASP-Análise de Sentimento e Processamento de Texto – Página 23 de 101 Na grande maioria das vezes, a ambiguidade pode ser resolvida com termos próximos. Figura 10: Modelo de tratamento de ambiguidade 2.5 Análise Semântica Nos tópicos anteriores, vimos como tratar a parte estrutural de uma palavra e/ou sentença. O tratamento da ambiguidade se correlaciona com a análise semântica. Como uma das técnicas de desambiguação se dá trocando uma palavra por outra, para isto é necessário se embasar no que chamamos de contexto. A semântica tem como objeto de estudo o significado das expressões da linguagem natural. ASP-Análise de Sentimento e Processamento de Texto – Página 24 de 101 A semântica aborda o significado das expressões de maneira mais independente de quem as usa ou de como são usadas essas expressões. O estudo do significado pode ser centralizado no significado das palavras, através da semântica lexical, ou no valor verdade de uma proposição, através da semântica lógica. A semântica lexical considera as propriedades referentes a cada uma das unidades, ou seja, as palavras de uma língua, no léxico. Um dos primeiros problemas a serem considerados é o fato de algumas palavras apresentarem múltiplos sentidos. O verbo “ir” por exemplo, apresenta 37 significados baseado no Dicionário Aurélio da língua Portuguesa. Usando-se um dicionário da língua desejada, definições são dadas em termos de outros verbos (por exemplo, ir = partir) e desse modo temos dois verbos compartilhando o mesmo sentido. Para lidar com os sentidos, é comum organizá-los em classes de objetos, de acordo como usualmente classificamos as coisas do mundo. A ambiguidade léxica, se dá quando uma palavra apresenta mais de um sentido. Ex.: banco = instituição financeira e/ou artefato feito para sentar. Temos também a ambiguidade semântica estrutura, advinda de uma ambiguidade sintática. Ex.: “Cachorros e gatos felizes vivem na fazenda” A frase do exemplo anterior, é ambígua em relação ao alcance do adjetivo “felizes”. ASP-Análise de Sentimento e Processamento de Texto – Página 25 de 101 Figura 11: estado contextual dos animais Quem na fig. 11 acima é feliz? Só o gato? Ou o cão e o gato? Este é um exemplo de ambiguidade de semântica estrutural. Mais um exemplo semântico: “Todos os garotos gostam de um cachorro.” A frase possui dois contextos: 1. Existe um único cachorro que todos os garotos gostam 2. Cada garoto gosta de um cachorro diferente Os dois significados apresentariam diferentes traduções em formas lógicas, que constituem o formalismo comumente utilizado para expressar a semântica das frases da linguagem natural. A semântica lógica trata o significado através de uma especificação do domínio de conhecimento, de acordo com a teoria dos conjuntos. Para expressar o significado de expressões da linguagem natural em lógica, é preciso traduzir as expressões para uma linguagem lógica. Porém, para dar conta do alto poder de expressão da linguagem natural, é preciso recorrer a lógicas não ASP-Análise de Sentimento e Processamento de Texto – Página 26 de 101 clássicas. Essas lógicas incorporam noções mais complexas, como o tempo, por exemplo (conjugações verbais). A área de semântica é uma área de estudo mais nebulosa do que a sintaxe, por apresentar questões que são difíceis de tratar de maneira exata e completa. A questão do significado está ligada ao conhecimento de mundo e, além disso, ligada a questões mais obscuras como estados mentais e consciência. Frase: “o chapéu usa o menino” Esta frase, apesar de poder ser reconhecida como uma frase da língua pois está na forma: frase => sujeito + predicado. A estrutura sintática é idêntica à sua inversão, e isto apresenta dificuldade de interpretação sendo necessário definir o contexto da frase. Certas aplicações necessitam lidar com a interpretação das frases bem formadas, não bastando o conhecimento da estrutura. Em um tratamento automático, a análise semântica consiste em associar a uma sequência, marcadores linguísticos, “representação interna”, entendida como a representação do significado da sentença. A representação de informação semântica pode estar presente no léxico (o que a torna útil, inclusive, à análise sintática). “O banco me forneceu um empréstimo” Identificação de sentido baseado em entradas léxicas com restrições de seleção: banco -> [- objeto físico], [+ instituição] banco -> [+ objeto físico], [+ artefato] Os traços semânticos informados no léxico podem ser ainda utilizados para restringir as possibilidades de combinações entre as palavras, identificando incoerências semânticas. ASP-Análise de Sentimento e Processamento de Texto – Página 27 de 101 As classes semânticas utilizadas em restrições podem ser organizadas hierarquicamente em ontologias. Uma ontologia é um modelo “extralinguístico” de conhecimento. Contém informações extralinguísticas organizadas em uma rede de conceitos, com definições de objetos, relações e propriedades, e as relações entre estes. As ontologias apresentam a modelagem do conhecimento associado a um certo domínio em particular. As relações entre palavras no português vêm sendo estudadas de modo a representarmos ligações que sejam importantes, no momento de indexar a informação contida em documentos escritos, e no momento de recuperá-la. Neste caso, entretanto, já estamos lidando com conhecimentos que transcendem os itens lexicais isolados, o que aponta para uma semântica gramatical, e não apenas lexical. Formalismos Na construção das representações semânticas, dois grupos de formalismos são mais usados. 1. As estruturas do tipo ‘atributo-valor’ e 2. formalismos lógicos 1. Atributo-valor Canário Tipo-de: pássaro Cor:amarelo Propriedade:assobiar 2. Lógico ASP-Análise de Sentimento e Processamento de Texto – Página 28 de 101 Figura. 12: Representação semântica em forma de grafo Os grafos também constituem a forma de representação semântica denominadas, primitivas de dependência conceitual. Servem para representar conhecimentos semânticos. Podemos representar, através de fórmulas lógicas, os conhecimentos lexicais, cada conceito ou significado, corresponderá um predicado com um número fixo de argumentos. Para demonstrar a construção de uma representação semântica através de uma linguagem lógica podemos recorrer à DCG (Definete Clause Grammars) do Prolog. Por exemplo, dar (X, Y, Z) pode representar a ação do agente X de dar o objeto Y a Z. ASP-Análise de Sentimento e Processamento de Texto – Página 29 de 101 Figura 13: Consulta semântica definida em PROLOG Construção de representações semânticas Usaremos um subconjunto bastante simplificado do português onde os únicos sintagmas nominais são os nomes (rex, felix) e a seguinte sintaxe. f--> sn, sv. (predicado) sv--> v(1). (sujeito-predicado) sv-->v(2), sn. (sujeito-predicado),(objeto) v(1)-->[dorme] v(2)-->[persegue] sn--> [rex] sn-->[felix] ASP-Análise de Sentimento e Processamento de Texto – Página 30 de 101 f(Predicado)--> sn(Sujeito), sv(Sujeito^Predicado) sv(Sujeito^Predicado)--> v(Sujeito^Predicado) sv(Sujeito^Predicado)-->v(Objeto^(Sujeito^Predicado)), sn(Objeto) sn(rex) --> [rex] sn(felix) --> [felix] v(X^dorme(X)) --> [dorme] v(Y^(X^persegue(X,Y))) --> [persegue] O analisador irá responder à consulta da seguinte forma: ?-f(Semantica,[rex,persegue,felix],[]) Semantica = persegue(rex,felix) Figura 14: Árvore representação semântica ASP-Análise de Sentimento e Processamento de Texto – Página 31 de 101 Capítulo 3. Técnicas de Machine Learning 3.1 Introdução Vimos nos últimos anos uma grande transformação em nosso dia a dia, proporcionada pelo surgimento de novas tecnologias de comunicação, dados e de eletrônica embarcada. Todas incorporadas massivamente a dispositivos de nosso uso diário. O exemplo mais típico destes novos dispositivos, qualificados como smart "feliz :-) ", é o aparelho de telefone celular, com tantas funções a mais que a comunicação de voz. Dotados de sensores dos mais diversos tipos, estes dispositivos possuem uma grande capacidade de coleta e armazenamento de dados, proporcionando também uma conexão a vários serviços e a outros usuários e dispositivos (IoT INTERNET OF THINGS). A chamada Internet das coisas, definida pela conexão massiva em rede de diversos dispositivos com algum grau de autonomia vem determinando novas tendências e modificando padrões atuais de comportamento. Exemplos destes novos dispositivos, caracterizados como unidade físicocibernéticas (Cyber-Physical Systems Units), podem ser encontrados nas indústrias, residências, automóveis ou mesmo na forma de agentes de softwares conectados à Internet. ASP-Análise de Sentimento e Processamento de Texto – Página 32 de 101 Fig. 15: Representação esquemática de uma CPSU ou Cyber-Physical System Unit, sendo a unidade cibernética implementada como uma Máquina de Aprendizado. Livro Braga Nos últimos anos, fatores como o baixo custo do hardware embarcado, maior escala de integração de circuitos integrados, baixo custo de armazenamento e novos paradigmas, levaram a expectativas quanto à implementação massiva de unidades cyber-physical autônomas. A capacidade dotada dessas unidades ou máquinas de serem autônomas e tomarem decisões é o principal objetivo da Aprendizagem de Máquina. Técnicas de identificação de sentimentos em textos, expressos em linguagens naturais, como meio de interface entre homem-máquina, que incorporam a figura de dados a serem identificados e classificados para serem incorporados a estes sistemas. Aprendizado Existem vários algoritmos de classificação e aprendizado. Cada qual com suas vantagens e desvantagens. ASP-Análise de Sentimento e Processamento de Texto – Página 33 de 101 A etapa da aprendizagem, consiste em um processo iterativo de ajustes de valores de parâmetros. Esses algoritmos diferem basicamente pela maneira pela qual os ajustes dos pesos (valores), são feitos. Fig. 16: adaptada do livro do Braga para os problemas resolvíveis por IA Problemas de Regressão Os problemas de regressão envolvem a estimativa da relação entre variáveis por meio de métodos de indução de funções a partir de amostras dessas variáveis. Estimativa é uma função aproximadora. Como exemplo, considere um processo de combustão industrial, para o qual deseja-se estimar um valor esperado de uma variável dependente, como por exemplo a pressão interna de uma caldeira, a partir de variáveis independentes, como aquela relacionadas à combustão propriamente dita, como as vazões de combustível e de ar nos queimadores. ASP-Análise de Sentimento e Processamento de Texto – Página 34 de 101 O objetivo do regressor, seria estimar a pressão, dados os valores das vazões. A construção ou indução, do regressor, seria realizada por meio de exemplos de amostras das vazões e da pressão. Assim, o problema de regressão envolve estimar uma função ou, em outras palavras, os seus parâmetros, que represente a relação entre variáveis dependentes e independentes. Fig. 17: Convergência da regressão Problemas de Classificação Problemas de classificação envolvem a associação de uma amostra de entrada a uma classe conhecida. Da mesma forma que nos problemas de regressão, um vetor de entrada é associado a um valor da variável dependente, a resposta da função classificadora também resulta em um valor de saída que, neste caso indica a classe resultante. O problema de classificação, também é essencialmente um problema de regressão, já que envolve a busca por uma função discriminante, usualmente obtida por meio da partição do espaço de entrada em regiões distinta para cada uma das classes que definem o problema. ASP-Análise de Sentimento e Processamento de Texto – Página 35 de 101 Como as amostras de mesma classe devem estar espacialmente próximas, esta caracterização define regiões para cada uma das classes, portanto, o objetivo da função discriminante é o de identificar as regiões de separação, delimitá-las e localizar cada classe em suas respectivas regiões. Fig. 18: separação das classes em regiões distintas no gráfico Para nosso estudo, aplicaremos as técnicas de Machine Learn em Análise de Sentimentos. As classes que queremos classificar com a Análise de Sentimos, são as polaridade do sentimento que as definimos como classes que são: classe “positiva” classe “neutra” classe “negativa” ASP-Análise de Sentimento e Processamento de Texto – Página 36 de 101 3.2 Aprendizagem supervisionada No aprendizado supervisionado, os algoritmos são treinados como pares de conjuntos de entrada e de saída desejadas. Os dados de entrada são comparados com um conjunto de valores de saída desejados. Fig. 19: Aprendizagem supervisionada No aprendizado supervisionado, quando treinamos o algoritmo, utilizamos um conjunto de dados que já são mapeados para categorias desejadas. Ao associarmos ao algoritmo, este deverá ter a capacidade de verificar o resultado previsto e o resultado esperado e conforme a diferença de resultado, ajustar seus parâmetros internos até obter o resultado esperado. Cada exemplo de treinamento é descrito por um conjunto de atributos que servem como dados de entrada que são associados a um valor de saída (também chamado de sinal de controle). A partir desses conjuntos de entrada e saídas, o algoritmo pode produzir uma função de inferência capaz de gerar uma saída adequada a partir de uma nova entrada. ASP-Análise de Sentimento e Processamento de Texto – Página 37 de 101 Muitos algoritmos são utilizados para criar aprendizagem supervisionadas, dentre eles os mais comuns como as Redes Neurais, Máquinas de Vetor de Suporte (SVM), e classificador Naive Bayes. Exemplo de uso: O objetivo aqui é classificar a palavra “amor” como sendo da classe positiva ou negativa: Base de dados de treinamento: Palavra Classe cachorro Positive amor Negative ruim Negative amor Positive amor Positive cachorro Positive casa Positive gato Positive gato Negative gato Negative amor Negative casa Positive amor Positive O primeiro passo é criar uma tabela de frequência das palavras e suas classes. ASP-Análise de Sentimento e Processamento de Texto – Página 38 de 101 Tabela de probabilidades Palavra Positive Negative cachorro 2 0 2/13 = 0.15 amor 3 2 5/13 = 0.38 ruim 0 1 1/13 =0.076 gato 1 3 4/13 = 0.30 casa 0 2 2/13 = 0.15 Total 7 6 7/13 = 0.53 6/13 = 0.46 Baseado nas informações de probabilidade de incidência os algoritmos como o Naive Bayes (estatístico), fazem a inferência (cálculos) das palavras, para atribuir as polaridades a cada palavra. 3.3 Aprendizagem Não-supervisionada A aprendizagem não supervisionada, por outro lado, nos permite abordar problemas com pouca ou nenhuma ideia do que nossos resultados deve ser aparentar. Podemos derivar estrutura de dados onde nós não necessariamente saberíamos o efeito das variáveis. No aprendizado não-supervisionado, os algoritmos não recebem as informações de saídas desejadas. São fornecidos somente os dados de entrada que ASP-Análise de Sentimento e Processamento de Texto – Página 39 de 101 por meio de processos de competição por exemplo, se chega ao reconhecimento dos padrões, ou seja, das características em comum entre o conjunto de dados. Fig. 20: Aprendizado Não supervisionado No aprendizado não supervisionado, como o próprio nome sugere, não há um professor ou supervisor para acompanhar o processo de aprendizado. Apesar da semelhança entre o aprendizado supervisionado e o aprendizado dos seres humanos, muitos dos sistemas biológicos ocorrem através de aprendizado não supervisionado. Os estágios iniciais dos sistemas de visão e audição no mundo animal por exemplo, são exemplos de aprendizagem não supervisionada. Para estes algoritmos, somente os padrões de entrada estão disponíveis para a rede, ao contrário do aprendizado supervisionado com seus pares de entrada e saída. A partir do momento em que se estabelece uma harmonia com as regularidades estatísticas da entrada de dados, desenvolve-se uma habilidade de formar representações internas para codificar características da entrada e criar novas classes ou grupos automaticamente. Este tipo de aprendizado só se torna possível quando existe redundância nos dados de entrada. Sem redundância seria impossível encontrar quaisquer padrões ou características nos dados de entrada. ASP-Análise de Sentimento e Processamento de Texto – Página 40 de 101 Existem também diferentes abordagens para aprendizagem não supervisionada assim como para supervisionada. Incluem-se, K-Means, Redes Neurais de Kohonen. Fig. 21: Exemplo de implementação e visualização do K-Means ASP-Análise de Sentimento e Processamento de Texto – Página 41 de 101 Capítulo 4. Classificadores 4.1 Introduçção à Python Segundo pesquisa feita a partir de 2015, esta revelou as ferramentas mais usadas pela comunidade de Data Science utilizadas atualmente. Segundo a pesquisa, Python foi considerada a linguagem de programação mais usada pela comunidade de cientistas de dados. Python tem inúmeras razões para ser escolhida e podemos citar algumas como simplicidade, clareza e reusabilidade. A linguagem oferece uma sintaxe ASP-Análise de Sentimento e Processamento de Texto – Página 42 de 101 simples e objetiva permitindo o programador se focar no problema a ser resolvido sem se preocupar tanto com detalhes de implementações. Por exigir que todo o código fonte seja corretamente endentado, sua leitura e compreensão se torna extremamente clara e organizada, contribuindo para o aumento de produtividade entre programadores. Além da grande comunidade no mundo inteiro, Python possui um vasto e variado conjunto de bibliotecas para se trabalhar com diversas áreas, desde computação científica, redes, segurança e claro análise de dados. Vamos citar algumas principais ferramentas e bibliotecas indispensáveis para trabalhar com Data Science. Jupiter, é uma aplicação cliente-servidor que permite a edição e execução de notebooks via browser. Notebooks são documentos que contém código e elementos visuais como imagens, links, equações. ASP-Análise de Sentimento e Processamento de Texto – Página 43 de 101 A principal vantagem na utilização de notebooks é para a documentação de análises e seus resultados de forma dinâmica e interativa além de permitir o rápido compartilhamento através da sua arquitetura web. Jupyter utiliza o conceito de Kernels, onde é possível utilizar diferentes linguagens de programação para executar scripts no mesmo Notebook. Para documentação por padrão é disponibilizado a linguagem Mark Down que é amplamente utilizada e compatível com os principais produtos como navegadores, etc. O projeto Jupyter é muito utilizado pela comunidade de Data Science ao redor do mundo. Diante da frustrante tarefa de manter o ambiente de pacotes para trabalhar com Data Science homogêneo o Anaconda vem para resolver esse problema fornecendo um ambiente open source e totalmente integrado com centenas de pacotes para trabalhar com ciência, matemática, engenharia e análise de dados. Além dos mais populares e confiáveis pacotes já estarem presentes no pacote do anaconda é fornecido um aplicativo para o gerenciamento de novos pacotes chamado conda. Através do conda é possível remover pacotes e bibliotecas indesejáveis e adicionar outras em seu ambiente caso seja necessário. ASP-Análise de Sentimento e Processamento de Texto – Página 44 de 101 Anaconda trabalha com as linguagens Python e R e tem versões para executar tanto em ambiente Linux, Windows e OSX. Bibliotecas Python O Python como já descrevemos anteriormente é uma linguagem de programação bem completa e possui inúmeras bibliotecas para trabalhar com Análise de Dados. Apresento uma lista das bibliotecas mais utilizadas e suas aplicações uma breve descrição. NumPy : Biblioteca Python para computação científica. Implementa arrays multidimensionais e permite a fácil execução de operações matemáticas e lógicas como ordenação, seleção, transformações, operações estatísticas básicas etc. Matplotlib : Biblioteca Python 2D para a visualização e plotagem de gráficos. Pode ser utilizada para gerar diversos tipos de gráficos como histogramas, gráficos de barras, gráficos de pizza tudo de forma fácil e rápida. ASP-Análise de Sentimento e Processamento de Texto – Página 45 de 101 Pandas : Esta biblioteca talvez seja a mais utilizada para análise de dados. Ela fornece ferramentas para manipulação de estruturas de dados de forma extremamente simples. Operações complexas que trabalham com matrizes e vetores podem ser facilmente realizadas com uma ótima performance. Scikit-Learn : Biblioteca em Python para trabalhar com Machine Learn (Aprendizado de Máquina). Contém diversos algoritmos implementados, métodos de análise e processamento de dados, métricas de avaliação etc. Essa também é uma biblioteca extremamente útil para o cientista de dados. NLTK é uma plataforma líder para a construção de programas Python para trabalhar com dados de linguagem Humana (PLN). Ele fornece interfaces fáceis de usar para mais de 50 corpora e recursos lexicais como o WordNet, juntamente com um conjunto de bibliotecas de processamento de texto para classificação, tokenização, stemming, tagging, análise e raciocínio semântico. A instalação do ambiente de programação assim como a linguagem Python não tem muito segredo e é uma tarefa simples. No site próprio da linguagem você possui as versões dos sistemas nas quais roda a plataforma de desenvolvimento e ASP-Análise de Sentimento e Processamento de Texto – Página 46 de 101 pode-se fazer o download das versões e também possui uma documentação bastante vasta de sintaxe e exemplos. Fig. 22: https://www.python.org/ - site official da linguagem Python é uma linguagem excelente para quem trabalha com “dados”. Dominar essa linguagem é de suma importância para qualquer pessoa que quer trabalhar com projetos de Data Science. Neste tópico vamos conhecer um pouco mais sobre essa linguagem, como manipular seus operadores, como a linguagem funciona e como fazer tarefas essenciais para depois podermos aplica-la para resolver nossos problemas assim como utilizá-la em nossos algoritmos classificadores que abordarei nos próximos tópicos. Vamos começar nossa trajetória de aprendizado em programação da linguagem com um comando bem simples! >>> print(“Alô Mundo!!”) Este comando irá imprimir na tela a frase: >>>Alô Mundo!! ASP-Análise de Sentimento e Processamento de Texto – Página 47 de 101 Operações Matemáticas No python, fazer operações matemáticas é muito simples, veja alguns exemplos: Digite em seu terminal: >>>2 + 2 >>>4 >>>2 - 2 >>>0 >>>2 * 2 >>>4 >>>2 / 2 >>>1 Veja que fizemos as quatro operações básicas, soma, subtração, multiplicação e divisão. Tudo de forma simples e sem escrever muito. Também é possível fazer outras duas operações facilmente, que são a potência e o módulo: >>>2 ** 2 >>>4 -> operação de potência de 2 >>>8 % 2 >>>0 -> a operação “módulo” retorna o resto da operação de divisão! Números Float (flutuantes ou fracionários) Números float são números reais, ou seja, números fracionados. Veja alguns exemplos de operações com números float no python: ASP-Análise de Sentimento e Processamento de Texto – Página 48 de 101 >>>3.6 + 6.4 >>>10 Funções Python contém diversas funções próprias da linguagem, vejamos algumas funções mais úteis: Type: A função type() imprime o tipo de uma variável ou de um valor. Veja, no caso de alguns números, ao usar a função type() esta irá nos retornar que tipo está esse dado: A função retorna em seu valor como a variável sendo do tipo “inteiro”! A função retorna em seu valor como a variável sendo do tipo “float”! Funções de Conversão É possível converter variáveis ou valores usando as funções de conversão. Veja um exemplo, de algumas conversões: Converte um número float para inteiro: >>>int(7.0) >>>7 ASP-Análise de Sentimento e Processamento de Texto – Página 49 de 101 Converte um número float para inteiro, porém, é realizado um arredondamento do valor: >>>int(7.5) >>>7 Converte um número inteiro para float: >>>float(7) >>>7.0 As funções são bem úteis, só devemos tomar cuidado no caso de arredondamento de valores, pois, em alguns casos pode haver uma perda da informação. Para arredondamento ou truncagem como pode ser chamado, Python tem uma função chamada round() que faz essa tarefa: Por padrão a função round() elimina qualquer valor após a vírgula. É possível passar como parâmetro para a função, a quantidade de números que devem ser mantidos após a vírgula. No exemplo abaixo, a função irá arredondar o valor e manter apenas 2 números após a vírgula, veja: ASP-Análise de Sentimento e Processamento de Texto – Página 50 de 101 E se quisermos manter 3 números? É só passar por parâmetro para a função: Variáveis e Strings As variáveis no python são de tipagem dinâmica, ou seja, o interpretador define o tipo de dados conforme a variável recebe dados, sem a necessidade de que o desenvolvedor tenha que definir o tipo anteriormente. Por exemplo, veja a declaração e execução a seguir das variáveis no python: >>>var1 = 1 >>>var2 = 3 >>>var1 + var2 >>>4 No exemplo acima, criei duas variáveis “var1” e “var2” e somamos os valores atribuídos à cada variável, como feito anteriormente. A tipagem dinâmica me dar a liberdade de atribuir um outro tipo de dados a qualquer uma dessas variáveis, veja o exemplo abaixo: >>>var1 = “Python é fácil!” ASP-Análise de Sentimento e Processamento de Texto – Página 51 de 101 >>>print(var1) >>>Python é fácil Atribuímos com os comandos acima, uma frase à variável “var1”, ou seja, agora a variável var1 é do tipo string. Vejam vocês com o comando type: >>>type(var1) Manipulação de strings Trabalhar com strings no Python é muito simples. A linguagem já possui recursos nativos que ajudam em muito o desenvolvedor. Como concatenar sentenças? é fácil: O Python irá concatenar as duas sentenças com o operador de sinal “+” como se fosse uma operação de soma. Podemos também contar quantas ocorrências de um caracter temos em uma frase com o método .count() da string: Podemos também contar quantas ocorrências de um caracter temos em uma frase com o método .count() da string: >>>frase.count(‘a) >>>2 ASP-Análise de Sentimento e Processamento de Texto – Página 52 de 101 A função len(), te retorna também qual o tamanho de uma frase:. Ainda com strings podemos obter posições específicas em uma variável (frase) definindo as posições dos caracteres, vejamos a imagem em nosso terminal: A função lower() coloca todas as palavras da frase em minúsculo: Queremos agora saber o índice onde se começa a palavra ‘minúsculo’ na frase anterior: ASP-Análise de Sentimento e Processamento de Texto – Página 53 de 101 Listas As listas são tipos de dados bem versáteis, podem conter dados de tipos diferentes, podem ser aninhadas e são bem fáceis de manipular. As estruturas do tipo lista, podem conter tudo misturado itens como sendo tipos String, Inteiro e Float. Para acessar valores na lista usamos um índice, ou seja, passamos qual posição da lista queremos acessar, veja: No exemplo, imprimimos o valor do terceiro elemento da lista. Os índices sempre iniciam com o valor 0, onde o 0 significa o primeiro ítem da lista. A função len(), nos retorna quantos elementos temos na lista: É possível fazer diversas operações nas listas, como atualização de itens, exclusão, concatenação, multiplicação de itens etc. ASP-Análise de Sentimento e Processamento de Texto – Página 54 de 101 Veja algumas operações: Adicionando novos itens a lista: Para remover um elemento da lista, utilizamos o comando “del”: Podemos também concatenar 2 listas : ASP-Análise de Sentimento e Processamento de Texto – Página 55 de 101 Dicionários Os dicionários são estruturas de dados bastante útil. Basicamente num dicionário temos uma chave e um valor para cada chave, onde essas chaves são únicas, mas os valores podem se repetir. Os valores das chaves podem ser de qualquer tipo, tais como inteiros, strings, listas etc. Vamos ver alguns exemplos de dicionários e algumas operações envolvendo essa estrutura de dados. Para criar um dicionário faça: No exemplo acima, criamos um dicionário com 2 chaves, repare que a sintaxe é diferente das listas, este usa as chaves {} entre os itens e seus valores. O nome do nosso dicionário é “dic”, e se quiséssemos acessar o ítem nome seria: ASP-Análise de Sentimento e Processamento de Texto – Página 56 de 101 Importante : Para definir o dicionário usamos as chaves “{}”, mas para acessar as chaves do dicionário usamos os colchetes “[]”. Para adicionar mais chaves ao dicionário fazemos: Para remover uma chave, por exemplo a chave ‘Sexo’, use a instrução ‘del’: ASP-Análise de Sentimento e Processamento de Texto – Página 57 de 101 4.2 Naive Bayes Ao estudar Probabilidade e Estatística, um dos primeiros e mais importantes teoremas que os alunos aprendem é o Teorema de Bayes . Este teorema é a base do raciocínio dedutivo, que se concentra em determinar a probabilidade de um evento ocorrer com base no conhecimento prévio das condições que podem estar relacionadas ao evento. O Classificador Naive Bayes traz o poder deste teorema ao Aprendizado de Máquina, construindo um classificador muito simples, mas poderoso. Neste artigo, veremos uma visão geral de como esse classificador funciona, quais aplicativos adequados ele possui e como usá-lo em apenas algumas linhas do Python e da biblioteca Scikit-Learn. Os métodos Naive Bayes são um conjunto de algoritmos de aprendizado supervisionados baseados na aplicação do teorema de Bayes com a suposição “ingênua” de independência entre cada par de recursos. Caso venha de algum curso como, Ciência da Computação, Matemática ou qualquer outro campo envolvendo estatística, é muito provável que em algum momento você tenha encontrado a seguinte fórmula: P(H|E) = (P(E|H) * P(H)) / P(E) onde: P(H|E) é a probabilidade de hipótese ‘H’ dada o evento E, uma probabilidade posterior. P(E|H) é a probabilidade de evento ‘E’ dado que a hipótese ‘H’ seja verdadeira. P(H) é a probabilidade das hipóteses ‘H’ serem verdadeiras (independentemente de qualquer evento relacionado) ou probabilidade anterior de ‘H’. P(E) é a probabilidade do evento ocorrer (independentemente da hipótese). ASP-Análise de Sentimento e Processamento de Texto – Página 58 de 101 Este é o Teorema de Bayes. Apesar de suas suposições aparentemente simplificadas, os classificadores ingênuos de Bayes têm funcionado muito bem em muitas situações do mundo real, notadamente a classificação de documentos e a filtragem de spam. Eles exigem uma pequena quantidade de dados de treinamento para estimar os parâmetros necessários. Treinamento e classificação com Naive Bayes, podem ser extremamente rápidos em comparação com métodos mais sofisticados. O desacoplamento das distribuições de características condicionais de classe significa que cada distribuição pode ser estimada independentemente como uma distribuição unidimensional. Isso, por sua vez, ajuda a aliviar os problemas decorrentes da maldição da dimensionalidade. À primeira vista, pode ser difícil fazer sentido, mas é muito intuitivo se o explorarmos através de um exemplo: Digamos que estamos interessados em saber se um e-mail que contém a palavra “learn” (evento) é spam (hipótese). Se voltarmos à descrição do teorema, este problema pode ser formulado como: P(class=SPAM|contains="learn") = (P(contains="learn" |class=SPAM) * P(class=SPAM)) / P(contains="learn") A probabilidade de um e-mail contendo a palavra learn ser spam é igual à proporção de e-mails de spam que contém a palavra learn multiplicada pela proporção de e-mails sendo spam e dividida pela proporção de e-mails mails contendo a palavra learn. Vamos verificar o que este trecho de código faz: P(class=SPAM|contains="learn") é a probabilidade de um e-mail ser SPAM, dado que este e-mail contém a palavra “learn”. É isso que estamos interessados em prever. ASP-Análise de Sentimento e Processamento de Texto – Página 59 de 101 (contains="learn"|class=SPAM) é a probabilidade de um e-mail conter a palavra “learn”, dado que este e-mail foi reconhecido como SPAM. Estes são nossos dados de treinamento, que representam a correlação entre um e-mail sendo considerado SPAM e esse e-mail contendo a palavra “learn”. P(class=SPAM) é a probabilidade de um e-mail ser SPAM (sem qualquer conhecimento prévio das palavras que ele contém). Esta é simplesmente a proporção de e-mails sendo SPAM em todo o nosso conjunto de treinamento. Nós multiplicamos por este valor porque estamos interessados em saber quão significativas são as informações relativas aos e-mails de SPAM. Se este valor for baixo, o significado de qualquer evento relacionado a e-mails de SPAM também será baixo. P(contains="learn") é a probabilidade de um e-mail conter a palavra “learn” . Esta é simplesmente a proporção de e-mails contendo a palavra “learn” em todo o nosso conjunto de treinamento. Nós dividimos por este valor, porque quanto mais exclusiva a palavra “learn”, mais importante é o contexto em que ela aparece. Assim, se esse número for baixo (a palavra aparece muito raramente), pode ser um ótimo indicador de que, nos casos em que ele aparece, é um recurso relevante a ser analisado. 4.3 Support Vector Machines Máquinas de Vetores de Suporte (SVMs, do Inglês Support Vector Machines), técnica de Aprendizado de Máquina que vem recebendo crescente atenção nos últimos anos. As SVMs vêm sendo utilizadas em diversas tarefas de reconhecimento de padrões, obtendo resultados superiores aos alcançados por outras técnicas de aprendizado em várias aplicações. As vantagens das máquinas de vetores de suporte são: Eficaz em espaços dimensionais elevados. ASP-Análise de Sentimento e Processamento de Texto – Página 60 de 101 Ainda é eficaz nos casos em que o número de dimensões é maior que o número de amostras. Usa um subconjunto de pontos de treinamento na função de decisão (chamados vetores de suporte), portanto, também é eficiente em termos de memória. Versátil: diferentes funções do Kernel podem ser especificadas para a função de decisão. Os kernels comuns são fornecidos, mas também é possível especificar kernels customizados. As desvantagens das máquinas de vetores de suporte incluem: Se o número de recursos for muito maior que o número de amostras, evitar o ajuste excessivo na escolha de funções do Kernel e o termo de regularização é crucial. As SVMs não fornecem estimativas de probabilidade diretamente, elas são calculadas usando uma valiosa validação cruzada de five-fold validação cruzada. As máquinas de vetores de suporte no scikit-learn suportam vetores de amostra densos ( numpy.ndarraye convertíveis para isso por numpy.asarray) e esparsos (qualquer scipy.sparse) como entrada. No entanto, para usar um SVM para fazer previsões de dados esparsos, ele deve estar adequado a esses dados. Para um desempenho ideal, use C- ordenado numpy.ndarray(denso) ou scipy.sparse.csr_matrix(esparso) com dtype=float64. ASP-Análise de Sentimento e Processamento de Texto – Página 61 de 101 Figura 15 – SVC, NUSVC e LinearSVC - modelos de implementação do SVM (http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html) SVC, NuSVCE LinearSVC são modelos de implementação do SVM capazes de realizar a classificação multi-classe em um conjunto de dados. Vamos à um exemplo prático: Carregando o conjunto de dados: (isso pode levar alguns minutos, então paciência)! from sklearn.datasets import fetch_20newsgroups twenty_train = fetch_20newsgroups(subset='train', shuffle=True) ASP-Análise de Sentimento e Processamento de Texto – Página 62 de 101 Nota: com este comando apenas carregamos os dados de treinamento. Carregaremos os dados de teste separadamente mais tarde em nosso exemplo. Pode verificar os nomes alvos (categorias) e alguns arquivos de dados seguindo os comandos. twenty_train.target_names #imprime todas as categorias #imprime a primeira linha do arquivo de dados print("\n".join(twenty_train.data[0].split("\n")[:3])) Arquivos de texto são na verdade, séries de palavras (ordenadas). Para executar algoritmos de aprendizado de máquina, precisamos converter os arquivos de texto em vetores de recursos numéricos. Nós estaremos usando o modelo bag of words para o nosso exemplo. Resumidamente, nós segmentamos cada arquivo de texto em palavras (para o inglês dividido pelo espaço) e contamos o número de vezes que cada palavra ocorre em cada documento e finalmente atribuímos a cada palavra um ID inteiro. Cada palavra única em nosso dicionário irá corresponder a uma característica (característica descritiva). O Scikit-learn possui um componente de alto nível que criará vetores de características para nós: 'CountVectorizer'. from sklearn.feature_extraction.text importContactVectorizer count_vect = CountVectorizer () X_train_counts = count_vect.fit_transform(twenty_train.data) X_train_counts.shape No trecho de código criado, ' count_vect.fit_transform (twenty_train.data) ', estamos aprendendo o dicionário de vocabulário e ele retorna uma matriz denominada Document-Term de formato [n_amostras, n_características]. ASP-Análise de Sentimento e Processamento de Texto – Página 63 de 101 Apenas contar o número de palavras em cada documento tem um problema, ele dará mais peso a documentos mais longos do que para documentos mais curtos. Para evitar isso, podemos usar o termo de frequência (TF - Term Frequencies ), ou seja, #count (word) / #Total words, em cada documento. Reduziremos o peso de palavras mais comuns como (o, é, etc.) que ocorre em todos os documentos. Isso é chamado de TF-IDF, isto é, Frequência de termo vezes a freqüência inversa do documento. O trecho de código que nos dá o “TF” e o “TF-IDF” é: from sklearn.feature_extraction.text import TfidfTransformer tfidf_transformer = TfidfTransformer() X_train_tfidf = fidf_transformer.fit_transform(X_train_counts) X_train_tfidf.shape A última linha do código nos mostra a dimensão da matriz. Existem vários algoritmos (classificadores) que podem ser usados para classificação de texto. Um deles é o Naive Bayes falado no capítulo anterior. Utilizaremos neste nosso exemplo em questão o algoritmos SVM discutido neste capítulo. >>> from sklearn.linear_model import SGDClassifier >>> text_clf_svm = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()),('clfsvm',SGDClassifier(loss='hinge', penalty='l2', alpha=1e-3, n_iter=5, random_state=42)),]) >>> text_clf_svm.fit(twenty_train.data,twenty_train.target) >>> predicted_svm = text_clf_svm.predict(twenty_test.data) >>> np.mean(predicted_svm == twenty_test.target) 0,9127… E com isto o classificador nos fornece uma acurácia de 91,3%. ASP-Análise de Sentimento e Processamento de Texto – Página 64 de 101 Atingimos 91,3% de precisão usando o SVM. Para resultados mais detalhados fazemos: >>> from sklearn import metrics >>> print(metrics.classification_report(twenty_test.target, predicted, ... target_names=twenty_test.target_names)) ... precision recall f1-score support alt.atheism 0.95 0.81 0.87 319 comp.graphics 0.88 0.97 0.92 389 sci.med 0.94 0.90 0.92 396 soc.religion.christian 0.90 0.95 0.93 398 micro avg 0.91 0.91 0.91 1502 macro avg 0.92 0.91 0.91 1502 weighted avg 0.92 0.91 0.91 1502 >>> metrics.confusion_matrix(twenty_test.target, predicted) array([[258, 11, 15, 35], [ 4, 379, 3, 3], [ 5, 33, 355, 3], [ 5, 10, 4, 379]]) Como resultado obtivemos com a matriz de confusão mostrando que as postagens dos grupos de notícias sobre o ateísmo e o cristianismo são mais freqüentemente confundidas umas com as outras do que com computação gráfica. ASP-Análise de Sentimento e Processamento de Texto – Página 65 de 101 4.4 K-Means Diferente do aprendizado supervisionado onde você informa o computador o que ele deve procurar e aprender, no aprendizado não supervisionado a gente não sabe exatamente o que estamos tentando ensinar o computador a aprender. Então precisamos recorrer à agrupadores lógicos de segmentação para encontrar similaridade entre os dados da amostra. Tenta-se assim definir um padrão e assumir que este padrão encontrado é o que estamos tentando ensinar ao computador (algoritmo), algoritmo vai aprender a encontrar esse padrão sempre quando for solicitado. Depois de descoberto o padrão, qualquer item novo que tenha uma similaridade com aquele segmento (cluster) pode ser inferido que ele “faz parte daquilo”. Para exemplificar, pense em um dataset com algumas amostras dispostas nos eixo X e Y, como o gráfico abaixo: Figura 16 – distribuição amostral Seu objetivo é agrupar estes dados baseado em sua similaridades. É possível bater o olho neste gráfico e ver a separação em alguns grupos. Cada um de nós que olhar o gráfico pode tentar criar um número diferente de cluster, ou até mesmo quando a quantidade de cluster for igual, pode-se pensar em agrupamentos de formas diferentes. Por exemplo, alguns podem ver a separação com apenas 2 clusters, e poderíamos ter os gráficos: ASP-Análise de Sentimento e Processamento de Texto – Página 66 de 101 Figura 17: distribuições em 2 grupos (clusters) Isso pode acontecer de acordo com a interpretação de cada um dos observadores que encontraram apenas 2 grupos nestes dados. Outros podem encontrar 3 grupos, e não apenas dois, podendo chegar a definições como estas outras. Figura 18: distribuições divididas em 3 clusters ASP-Análise de Sentimento e Processamento de Texto – Página 67 de 101 Para entender o funcionamento vamos separar em 2 clusters e entender os passos que o algoritmo K-Means faz como os dados para convergir em um resultado. Vamos tomar k=2 criando então 2 clusters. O K, de K-Means, é a quantidade de centróides (pontos centrais dos grupos) que serão criados e ajudará a encontrará a similaridade dos dados. Uma das formas de iniciar o processo é o algoritmo inserir o K pontos (centróides) aleatórios iniciais, pode ser qualquer lugar do plano, para em seguida começar as iterações e encontrar os resultados. Veja dois pontos aleatórios criados no gráfico, e uma linha tracejada que é calculada aproximadamente na metade da distância dos pontos Vermelho e Azul. Figura 19: centroides Com este segmento, os ítens que estão plotados acima da linha tracejada fazem parte do grupo vermelho e os de baixo da linha fazem parte do grupo azul. A primeira iteração do algoritmo é calcular a distância média de todos os pontos que estão atrelados ao centróide, e então mudar a posição do centróide para o novo ponto que foi calculado, que é a distância média de todos os pontos que se ligaram à aquele centróide. Essa mudança de posição do centróide pode alterar os itens que fazem parte daquele grupo. Figura 20: alteração dos centróides ASP-Análise de Sentimento e Processamento de Texto – Página 68 de 101 Figura 21: nova disposição dos clusters Podemos reparar que após a iteração do cálculo da média, alguns pontos mudaram de centróide, os pontos que estão marcados em verde passaram do centróide azul para o vermelho, e o que está marcado em azul passou do centróide vermelho para o azul, essa iteração de cálculo da média da distância dos pontos até o centróide ocorre em loop até que nenhum ponto mude de centróide, isso acontece quando os centróides param de se mover porque já estão na posição central da distância entre os pontos. Figura 22: determinação dos padrões Veja que entre a penúltima iteração e esta não ouve mais mudança de pontos entre o gráfico e o centróide, fazendo com que o algoritmo K-Means pare sua execução chegando ao resultado esperado e criando dois grupos, quando um novo item for incluído no gráfico, ele já terá um grupo que atende aquela região e o computador já saberá do que se trata o dado novo. Elbow Method • O Elbow Method é uma das formas utilizadas para se escolher a quantidade de K(clusters) no algoritmo. Se parece com o formato de um “braço” e nós sempre procurarmos o “cotovelo” pra definir que este é o número aceitável de K (clusters) a serem criados com base nos dados da amostra. Este método vai crescendo a quantidade de clusters a partir de 1 e analisando o resultado melhorado a cada incremento. Quando o benefício parar de ser relevante (um ASP-Análise de Sentimento e Processamento de Texto – Página 69 de 101 salto entre uma quantidade de cluster e a próxima quantidade) ele entra em um modelo platô, no qual a diferença da distância é quase insignificante. É neste momento que entende-se que o algoritmo é relevante com aquela quantidade de K e então ele deve ser usado pra segmentar os dados do gráfico. Depois de executar o código do algoritmo do Elbow Method e olhando para os dados que estamos apresentando como exemplo, um bom número de K para ele é o número 4. Figura 23: determinação de centróides Rodando o algoritmo com 4 centróides, é possível ver a segmentação: Figura 24: número de centroides e segmentação Neste cenário, quando qualquer item novo for adicionado na base de dados, o algoritmo saberá classificar a qual grupo este novo item pertence. ASP-Análise de Sentimento e Processamento de Texto – Página 70 de 101 Capítulo 5. Frameworks e bibliotecas para Machine Learning e ASP 5.1 Weka Weka é um projeto open source que significa Waikato Environment for Knowledge Analysis (Ambiente para Análise de Conhecimento Waikato). Foi criado como um projeto de Machine Learning pela universidade de Waikato na Nova Zelândia. O projeto tem o objetivo de disseminar técnicas de Machine Learning através da disponibilização do software para utilização de pesquisadores, alunos e para resolver problemas reais da indústria além de contribuir com a ciência pela mundo. O grande diferencial do Weka além de todo o seu arsenal de métodos e algoritmos é a sua interface gráfica (GUI – Graphical User Interface) que torna as tarefas de mineração de dados extremamente fáceis e rápidas. Através da interface é possível consultar dados em sistemas de bancos de dados, executar métodos de processamento de dados, executar e configurar parâmetros dos algoritmos e visualizar os resultados através de gráficos. Tudo isso sem precisar escrever comandos ou programar. O weka tem funcionalidades para manipulação de bases de dados (preprocessamento), interface para visualização de dados, e ainda disponível diversos algoritmos de machine learning e Data Mining. Isso facilita muito a vida dos seus usuários que não tem que dominar diversas ferramentas para fazer seu trabalho. Para quem gosta de escrever comandos ou programar scripts o Weka fornece também acesso a sua vasta coleção de técnicas e algoritmos via API. ASP-Análise de Sentimento e Processamento de Texto – Página 71 de 101 Figura 25: exemplo de classificação com weka ASP-Análise de Sentimento e Processamento de Texto – Página 72 de 101 5.2 Pandas e SciKit-Learn Pandas, talvez seja a biblioteca mais utilizada em projetos de Análise de Dados e Python. O Pandas é um biblioteca open source amplamente utilizada na comunidade acadêmica. Esta se tornou extremamente útil pelo seu desempenho e pela sua capacidade de simplificar tarefas complicadas de manipulação de dados. Com a biblioteca instalada, o primeiro a ser feito é a importação: O segundo passo é carregar o dataset em memória. O pandas faz isso de forma muito eficiente, e como esta base está no formato csv basta usar o método read_csv(): no comando acima, mandamos carregar o conteúdo do arquivo para a variável dataset passando o caminho do arquivo e dizendo qual é o separador(sep=’,’) utilizado entre as colunas, que nesse caso é a vírgula. A variável dataset se torna um dataframe. Dataframe é uma estrutura de dados com duas dimensões onde linhas podem ter colunas de tipos diferentes. Veja o tipo da variável com o comando: Os dataframes são objetos extremamentes flexíveis, podemos armazenar listas, vetores e até outros dataframes. Para ver se a base de dados foi carregada corretamente, é interessante imprimir algumas linhas, o método head() nos permite ver as primeiras linhas. ASP-Análise de Sentimento e Processamento de Texto – Página 73 de 101 Se quisermos imprimir todas colunas do nosso dataset, temos o comando: Se quisermos saber quantas linhas tem a base de dados? Use o método count(): Informações como: desvio padrão, média, valor mínimo e máximo de colunas, entre outras usamos o comando: É bem comum em projetos de Data Science ter a necessidade de fazer processamento dos dados, processamento estes tais como, remover colunas de um dataset, adicionar colunas, fazer cálculos, etc, utilizamos o Pandas para nos ajudar. SciKit-Learn Scikit-Learn é uma biblioteca Python para trabalhar com Machine Learning. Com esse framework, já estão implementados diversos métodos, algoritmos e técnicas bem interessantes que simplificam a vida do desenvolvedor. Entre os algoritmos temos algoritmos para classificação, regressão e agrupamento, incluindo máquinas de vetores de suporte, florestas aleatórias, gradient boosting, kmeans. Possui código aberto, comercialmente utilizável. Exemplo de utilização: ASP-Análise de Sentimento e Processamento de Texto – Página 74 de 101 Após importar o módulo vamos carregar o dataset iris com o comando abaixo: A variável iris é basicamente um objeto do tipo dicionário que contém os dados do dataset iris e alguns metadados. Como o dataset iris é rotulado, ou seja, contém os dados de classe para cada instância, podemos visualizar os dados das instâncias e as classes através dos métodos data e target. aplicando o comando target: Observem que conseguimos visualizar os dados ao executar a propriedade data e as classes ao executar a propriedade target que em nosso exemplo as classes são 0, 1 e 2. ASP-Análise de Sentimento e Processamento de Texto – Página 75 de 101 Outra propriedade interessante é a shape: Podemos observar que temos 150 instâncias de dados e 4 atributos e como classes temos apenas um vetor de 150 posições relativos a classe de cada instância. Iremos agora dividir o nosso dataset em uma amostra de treino e teste. Para isso usamos o método train_test_split disponível através do módulo model_selection. O método train_test_split como o nome já diz nos permite dividir o dataset em um porcentual definido: estamos dividindo os dados em uma porcentagem de 40% para teste através do parâmetro test_size, os dados de treino são armazenados nas variáveis X_train e X_test com os dados das instâncias e classes respectivamente. Os dados de teste serão armazenados nas variáveis y_train e y_test: Como dados de treino temos 90 instâncias e como dados de teste temos 60 instâncias. Por fim vamos executar um algoritmo de Machine Learning através do algoritmo e módulo SVM: ASP-Análise de Sentimento e Processamento de Texto – Página 76 de 101 Importamos o método svm que implementa o clássico algoritmo Support Vector Machine. Treinamos nosso modelo através do método fit conforme o código abaixo. Após treinar o nosso modelos medimos o nosso score passando os dados de teste para o algoritmo: 5.3 DialogFlow O Dialogflow é uma plataforma para construir interfaces de conversação para bots, aplicativos e dispositivos. Oferece aos usuários novas maneiras de interação, criando interfaces conversacionais baseadas em voz e texto, como aplicativos de voz e chatbots, com tecnologia de IA. Dialogflow incorpora a experiência e os produtos de aprendizado de máquina do Google, como o Google Cloud Speech-to-Text. O Dialogflow é respaldado pelo Google e executado no Google Cloud Platform. Utiliza processamento de linguagem natural (PLN). O projeto inicial chamava-se API-AI antes de ser comprado pelo Google. ASP-Análise de Sentimento e Processamento de Texto – Página 77 de 101 O api.ai disponibiliza SDK’s em várias linguagens de desenvolvimento. Figura 26: Plataforma de utilização do DialogFlow Uma opção que pode ser bastante explorada, é a implementação de webhook , onde o api.ai permite que sistemas externos recebam notificações de eventos que ocorrem na intenção do usuário, possibilitando que seu serviço execute suas lógicas de negócios ou acesse dados de armazenamento. Diálogos • O api.ai recebe uma query ,que é um texto em linguagem natural ou um nome de evento enviado para plataforma como dados de entrada, sendo transformado em seguida em actionable data e retorna dados de saída. • O processo de transformar a linguagem natural em dados acionáveis como contextos e propriedades de intenções, é chamado Natural Language Understanding (NLU). Agentes • Os agentes podem ser descritos como sendo os módulos NLU. Seu objetivo é transformar o idioma natural do usuário em dados acionáveis. Entidades ASP-Análise de Sentimento e Processamento de Texto – Página 78 de 101 • As entidades representam conceitos e servem como uma poderosa ferramenta para extrair valores de parâmetros de entradas de linguagem natural. Contextos • Contextos são cadeias de caracteres que representam o contexto atual do pedido de um usuário. Parâmetros • As ações podem ter parâmetros para extrair informações das entradas de usuários. Intenções • Uma intenção representa um mapeamento entre o que o usuário diz e quais ações devem ser tomadas pelo seu software. As interfaces de intenção possuem as seguintes seções: • Usuário diz • Ação • Resposta • Contextos ASP-Análise de Sentimento e Processamento de Texto – Página 79 de 101 5.4 NTLK NLTK (Natural language tool kit) é um kit de ferramentas de linguagem natural para se trabalhar em Python A classificação de documentos / textos é uma das tarefas importantes e típicas no aprendizado de máquina supervisionado. Atribuir categorias a documentos, que podem ser uma página web, livro de biblioteca, artigos de mídia, galeria, etc. tem muitos aplicativos como filtragem de spam, roteamento de e-mail, análise de sentimentos. Em contraste com as linguagens artificiais, como as linguagens de programação e as notações matemáticas, as linguagens naturais evoluíram à medida que passam de geração para geração e são difíceis de definir com regras explícitas. Processamento de Linguagem Natural - ou PNL para abreviar - em um sentido amplo vamos abranger como qualquer tipo de manipulação de linguagem natural por computador. Em um extremo, pode ser tão simples quanto contar frequências de palavras para comparar diferentes estilos de escrita, as tecnologias baseadas na PNL estão se tornando cada vez mais difundidas. O NLTK inclui software, dados e documentação extensos, todos podem ser baixados gratuitamente em http://nltk.org. É uma biblioteca de código aberto. Possui um conjunto de bibliotecas de processamento de texto para classificação, tokenização, stemming, tagging, análise e raciocínio semântico. Possui um guia prático que apresenta os fundamentos da programação ao lado de tópicos em lingüística computacional, além da documentação abrangente da API, o NLTK é adequado para lingüistas, engenheiros, estudantes, educadores, pesquisadores e usuários do setor. ASP-Análise de Sentimento e Processamento de Texto – Página 80 de 101 Capítulo 6. Coleta de Dados na web 6.1 Bases de dados para Machine Learning Um conjunto de dados ou "dataset" é uma coleção de dados normalmente tabulados. Por cada elemento (ou indivíduo) se indicam várias características. Cada coluna representa uma variável particular. Cada linha corresponde a um determinado membro do conjunto de dados em questão e cada valor é conhecido como sendo um dado. O conjunto de dados pode incluir dados para um ou mais membros, correspondente ao número de linhas. Conjuntos de dados não tabulares podem assumir a forma de cadeias de caracteres envolvidas por marcações, como em um arquivo XML. UCI Machine Learning Repository - https://archive.ics.uci.edu/ml/datasets.html Um dos sites mais conhecidos que disponibilizam datasets públicos, o repositório da UC Irvine contém centenas de datasets em áreas variadas. Podem ser filtrados por: Área de interesse Tipo de tarefa mais apropriada (classificação, regressão, clustering) Formato das variáveis (categóricas, numéricas) Tipo dos dados (uma ou mais variáveis, séries temporais) Quantidade de variáveis independentes Quantidade de exemplos ASP-Análise de Sentimento e Processamento de Texto – Página 81 de 101 Além disso, ao acessar a página de um dataset em particular, é possível ver detalhes como a fonte, informações sobre o problema, variáveis, e o mais interessante, trabalhos acadêmicos que usam este dataset, que podem ser uma ótima fonte de idéias e aprendizado para tentar reproduzir. Quandl - https://www.quandl.com/ Especializado em dados financeiros e econômicos. Possui uma vasta quantidade de dados macroeconômicos, geopolíticos, demográficos, bem como dados sobre ações, commodities, futuros, empresas de capital aberto, até mesmo sobre bitcoin. Mais de 10 milhões de datasets. Existem os datasets abertos, grátis, porém uma parte premium, que é paga. Kaggle - https://www.kaggle.com/ Uma das melhores formas de trabalhar em casos próximos da realidade é através das competições no Kaggle. Empresas e instituições acadêmicas disponibilizam dados e um objetivo (como, por exemplo, descobrir automaticamente se um anúncio está de acordo com as regras do site). O objetivo aqui não é falar sobre como ganhar uma competição destas, mas tratar o site como uma fonte de dados, e também como um referencial sobre suas habilidades, já que é possível comparar suas soluções com outras de centenas de pessoas. Amazon AWS Datasets - https://registry.opendata.aws/ Repositório de datasets disponibilizado pela Amazon, para usar com o serviço de cloud computing (AWS) da empresa. ASP-Análise de Sentimento e Processamento de Texto – Página 82 de 101 São datasets gigantescos em áreas como processamento de linguagem natural para entender pesquisas em mecanismos de buscas, pesquisas genéticas e dados climáticos. As áreas são variadas, mas o que há em comum é o tamanho dos dados, que claramente não cabem na memória e devem ser analisados utilizando ferramentas específicas para Big Data. http://dados.gov.br/ Temos também o dados.gov, que é “portal brasileiro de dados abertos”. Você encontra datasets sobre diferentes áreas e setores do Brasil, de transportes a saúde. Portal da Transparência - http://www.portaldatransparencia.gov.br/ Ainda no Brasil temos o “Portal da Transparência”. Outro lugar interessante para encontrar datasets brasileiros. Esse site oferece dezenas de informações de investimentos, despesas e receitas a cerca de diversos setores do Brasil. O Portal da Transparência foi criado em 2004 pela Controladoria-Geral da União (CGU) com a intenção de assegurar boa aplicação de recursos. ASP-Análise de Sentimento e Processamento de Texto – Página 83 de 101 6.2 Modelando bases de dados com Pandas e SciKit-Learn Existem diversas formas de modelar uma base de dados de texto. A mais conhecida é chamada de Bag of Words. O modelo baseado em Bag of words utiliza todas as palavras do texto, a frequência de cada palavra e associa isso a classe do treino. A frequência das palavras é usada para treinar um modelo. Imagine as seguintes sentenças: 1. O smartphone é bom, porém não gosto de smartphone grandes , Negativo 2. Gostei bastante desse smartphone, mesmo sendo caro, Positivo O modelo nesse caso, usa todas as palavras da base, ou seja, todas as palavras das duas sentenças. {o, smartphone,é, bom, porém, não, gosto, de, grandes,gostei,bastante,desse,mesmo,sendo,caro} Em seguida é feita a contagem do número de vezes que cada palavra apareceu na sentença. A palavra “smartphone” ficaria com a contagem 2 na primeira sentença. As outras palavras ficaram com a contagem 1 e 0 {o, smartfone, é, bom, porém, não, gosto, de, grandes, gostei, bastante, desse, mesmo, sendo, caro} {1,2,1,1,1,1,1,1,1,0,0,0,0,0,0, Negativo} Para a sentença 2 a frequência seria representada da seguinte forma: {o, smartfone, é, bom, porém, não, gosto, de, grandes, gostei, bastante, desse, mesmo, sendo, caro} {0,1,0,0,0,0,0,0,0,1,1,1,1,1,1, Positivo} ASP-Análise de Sentimento e Processamento de Texto – Página 84 de 101 Primeiramente vamos ler a base de dados e contar quantas linhas contém na base de dados tweets-mg.csv. dataset = pd.read_csv('tweets-mg.csv) dataset.count() Para modelar a base primeiramente é preciso separar os tweets das classes: 1 tweets = dataset['Text'].values 2 classes = dataset['Classificacao'].values Em seguida vamos criar o código que treina o modelo usando a abordagem Bag of Words e o algoritmo Naive Bayes Multinomial. 1 vectorizer = CountVectorizer(analyzer="word") 2 freq_tweets = vectorizer.fit_transform(tweets) 3 modelo = MultinomialNB() 4 modelo.fit(freq_tweets,classes) Na linha 01criamos tipo CountVectorizer chamado vectorizer. um Na linha objeto 2, usamos do o objeto vectorizer para calcular a frequência de todas as palavras da lista de tweets e armazenamos seu retorno em freq_tweets. Em seguida, criamos um objeto chamado modelo do tipo Naive Bayes Multinomial. Na linha 4, treinamos o modelo usando a frequência de palavras (freq_tweets) e as classes de cada instância ASP-Análise de Sentimento e Processamento de Texto – Página 85 de 101 6.3 API do Twitter para coleta de Dados A API do Twitter é dividida em três distintas APIs. As mais utilizadas para análise estatística são a Search API e a Streaming API. A Search API faz um REST URL e pode ser acessada com um simples HTTP GET. Ela pode trabalhar em conjunto com a Streaming API, permitindo assim a coleta de tuítes ao vivo e também a busca no banco de dados do Twitter. Para utilizar a API página https://apps.twitter.com/. precisaremos de uma conta na Com a app que teremos acesso as chaves de segurança para utilizar a API. Figura 27: chaves consumer ASP-Análise de Sentimento e Processamento de Texto – Página 86 de 101 Figura 28: chaves acces from TwitterSearch import * try: ts = TwitterSearch( consumer_key = 'IMJh4kjQLGDzUaT9t1v0RXm5Y', consumer_secret = 'cjt9d684CpvElXof1BxUMgSakNnFBVLDweQTSpGZolzzrnU8JE', access_token = '968521944944529408-oI5NcJVaZellwrsPjhsQkQPDeAZJzKf', access_token_secret = 'hc7bTI65fG97smD3ZEB6iCjLrBzHBxn2Sp6TIaX8fZSJZ' ) tso = TwitterSearchOrder() tso.set_keywords(['iphone']) tso.set_language('pt') for tweet in ts.search_tweets_iterable(tso): print( '@%s tweeted: %s' % ( tweet['user']['screen_name'], tweet['text'] ) ) except TwitterSearchException as e: print(e) No código anterior, iniciamos importando todos os objetos e métodos da biblioteca TwitterSearch com o asterisco. Declaramos as variáveis para a autenticação como um construtor da classe TwitterSearch. ASP-Análise de Sentimento e Processamento de Texto – Página 87 de 101 Instanciamos a classe TwitterSearchOrder que contém os métodos para especificar os termos a serem pesquisados e a linguagem para a consulta, especificamos o termo iphone através do método set_keywords e definimos a linguagem pt (português) com o método set_language. Por fim, simplesmente é feita a consulta e impressa o nome do usuário e tweet, utilizando o método search_tweets_iterable passando nosso objeto tso que contém o termo de busca e a linguagem como parâmetro. 6.4 API do Facebook para coleta de Dados A API gráfica do Facebook é um serviço do tipo RESTful que retorna arquivos do tipo JSON. O processo é feito através do envio de uma solicitação HTTP para iniciar conexão com o Facebook. Isto permite executar métodos GET para retornar dados a serem analisados via linguagem de programação (Java, Python, PHP, etc.), ou mesmo sem programação. Para a extração dos dados desejados, é necessário criar um aplicativo dentro do Facebook. Isto permite que obtenhamos um número ID e uma chave secreta para autorização da rede social. A criação requer o uso de uma conta na rede social. ASP-Análise de Sentimento e Processamento de Texto – Página 88 de 101 Possuindo uma conta no Facebook, entre no endereço http://www.facebook.com/developers e selecione as opções da solicitação para instalar a aplicação. É importante esclarecer nesse ponto que a API do Facebook exige, por questão de segurança, que seu aplicativo seja redirecionado para um servidor que utilize o protocolo HTTPS. Nas opções Canvas URL e Secure Canvas URL é necessário informar uma página HTTPS para que você possa utilizar os dados da rede social que necessitem de autorização de usuários. Após criação do aplicativo acesse-o através do navegador: https://apps.facebook.com/nome_do_seu_aplicativo. Depois de criado o aplicativo de teste, somos capazes de usar o PDI e o método HTTP GET para buscar dados de nossos amigos no Facebook. Tais como: news feed, Sexo, Idade. Figura 29: formatos de saídas que podem ser gerados pela API ASP-Análise de Sentimento e Processamento de Texto – Página 89 de 101 Capítulo 7. Processamento e classificação de Texto 7.1 Introdução Processamento de texto computacional, é uma técnica usada para tirar valiosas informações de bases de dados de textos. Qualquer que seja a manipulação de um texto, string ou palavra, podemos considerar como processamento de texto. Atribuições simples de texto a variáveis, conversão de letras, maiúsculas em minúsculas, tokenização, stemming, todos são exemplos de processamento de texto. Para fazermos manipulações mais elaboradas e principalmente em textos/documentos grandes, precisamos de mais gerenciamento que podemos dizer como técnicas. Bibliotecas, Datasets e scripts Manipulação de Strings Trabalhar com linguagem Natural Pré-Processamento Dicionários Léxicos Sentimentos Partes de Palavras Todas para por exemplo categorizar e/ou classificar por exemplo, informações de jornais automaticamente, principais termos utilizados em um tópico de discussão ASP-Análise de Sentimento e Processamento de Texto – Página 90 de 101 no Facebook, verificar o que as pessoas estão falando de um determinado político em um tópico do Twitter. 7.2 Técnicas de Pré-Processamento Quando estamos trabalhando com textos, normalmente precisamos ter que fazer um pré-processamento nos dados. É quase impossível não fazer pré-processamento de dados quando trabalhamos em algum projeto incluindo Processamento de textos. Podemos usar as expressões regulares para fazer muita coisa. Imagine uma base de textos onde é interessante remover os números por exemplo. Quando você quer apenas os termos da base, números pode ser um problema. expressão regular: 1 import re 2 texto = 'O numero da nossa casa 56, apto 306' 3 re.sub('[-|0-9]',' ', texto) A biblioteca nativa do python chamada “re” ajuda muito para implementarmos as expressões regulares. Outro Pré-processamento muito útil é a remoção de pontuação da base. As pontuações em algumas tarefas como Análise de Sentimentos podem ser interessantes, pois, expressam um sentimento na escrita, Mas em muitos casos, essas pontuações mais atrapalham do que ajudam. Veja o uso da biblioteca “re” novamente, agora para remoção de pontuações: ASP-Análise de Sentimento e Processamento de Texto – Página 91 de 101 import re texto = "i'm back baby!!!, Data Science ??;;;()" re.sub(r'[-./?!,":;()\']',' ',texto) Stemming Uma técnica extremamente útil, é o Stemming, esta consiste na redução da palavra até o seu radical. Isso é possível ao remover seus afixos e vogais temáticas das palavras. Ex.: 1 stemmer = nltk.stem.RSLPStemmer() 2 stemmer.stem('frequentemente') 3 stemmer.stem('copiar') Essa técnica causa uma diminuição das palavras da base de dados, por exemplo, a palavra “copiar” tem seu radical em ‘copi’ o que seria o mesmo no caso de copiou ou copiava, tudo isso seria reduzido a copi, diminuindo o tamanho total da base. Uma vantagem é que um modelo que leva em consideração palavras separadamente, todas as variações de uma palavra poderiam ser tratadas com apenas uma. Outra vantagem, é que se levado em consideração do tempo computacional em algumas tarefas, teremos a diminuição de tempo para processamento. Abaixo uma função que recebe por parâmetro uma frase ou um texto e retorna as palavras já com o stemming aplicado: ASP-Análise de Sentimento e Processamento de Texto – Página 92 de 101 – def Stemming(instancia): – stemmer = nltk.stem.RSLPStemmer() – palavras=[] – for w in instancia.split(): – palavras.append(stemmer.stem(w)) – return (" ".join(palavras)) – Para chamar a função, basta passar a frase: Stemming(‘Estamos trabalhando com texto para aprendizagem de máquina’) 1 StopWords Stopwords são palavras ou artigos muito usados em um texto, como “a”, “de”, “o”, “da” entre outras. Em muitas tarefas envolvendo NLP é comum a remoção dessas palavras, pois, em muitos casos essas palavras não ajudam o modelo. O NLTK já contém um dicionário com as palavras que são consideradas stopwords em português, veja um exemplo: 1 stopwords = nltk.corpus.stopwords.words('portuguese') 2 stopwords Na primeira linha crio uma variável chamada stopwords onde será uma lista das palavras fornecidas pelo nltk ASP-Análise de Sentimento e Processamento de Texto – Página 93 de 101 Na linha seguinte imprimo a variável com as palavras. Podemos fazer uma função para remover as stopwords de um texto ou uma sentença, como fizemos anteriormente: 1 def RemoviStopWords(instancia): 2 instancia = instancia.lower() 3 stopwords = set(nltk.corpus.stopwords.words('portuguese')) 4 palavras = [i for i in instancia.split() if not i in stopwords] 5 return (" ".join(palavras)) A função acima recebe uma instância (uma frase) em seguida transforma a frase em minúsculo e define uma variável chamada stopwords que conterá o conjunto fornecido pela Nltk. Em seguida, faz uma interação em cada palavra da instância e se caso a palavra esteja presente na lista de stopwords esta é removida. Para chamar a função: 1 RemoviStopWords('Olá pessoas, estou trabalhando com textos para o IGTI') Dicionários Léxicos O Wordnet é um grande banco de dados léxico de substantivos, verbos, adjetivos e advérbios que são agrupados em conjuntos de sinônimos, cada um expressando um conceito distinto. Os sinônimos são interligados pelo seu significado semântico conceitual e suas relações léxicas, dessa forma o Wordnet é uma grande rede de conceitos interligados. ASP-Análise de Sentimento e Processamento de Texto – Página 94 de 101 O Wordnet é uma ferramenta amplamente utilizada em pesquisas no mundo todo, principalmente em trabalhos relacionados com linguística. Na industria essa ferramenta também é muita usada em projetos de Mineração de Textos. O NLTK também contém uma interface de acesso ao Wordnet, para começar a trabalhar com esse dicionário: from nltk.corpus import wordnet O comando acima importa o wordnet através do nltk. Para consultar o sinônimo de uma palavra, faça: 1 wordnet.synsets('bike') 7.3 Normalização Normalização é um conjunto de regras que visa, principalmente, a organização de um determinado texto, ou base de dados de texto, para reduzir a redundância de dados, aumentar a integridade de dados e o desempenho. É considerado também como uma técnica de Pré-Processamento. Consiste em transformar os valores dos atributos em sua forma de melhor leitura. Muitos algoritmos possuem a limitação de trabalhar somente com atributos qualitativos. Entretanto, muitos conjuntos de dados possuem atributos quantitativos. Precisamos de métodos que transforme atributos qualitativos em quantitativos para o processamento computacional. Redução de dimensionalidade também é uma Normalização. Normalmente (forma normal), a que melhor se adequa a determinado meio de processamento, o ser humano prefere trabalhar dados complexos de forma ASP-Análise de Sentimento e Processamento de Texto – Página 95 de 101 qualitativa. A forma normal, nada mais é do que atribuição do modelo que melhor se adeque ao seu tipo de processamento. 7.4 Classificação de Textos (algoritmos) Já falamos em classificação de textos por exemplo com Naive Bayes em Análise de Sentimentos. Vamos utilizar um método de classificação cruzada para avaliar. Este método consiste em dividir todo o dado em K partes, essas partes que se chamam folds. Dessas partes uma será separada para teste e as outras restantes serão usadas para treinar o modelo. Isso é feito repetidamente até que o modelo seja treinado e testado com todas as partes (folds). Veja esse exemplo simples: Para k = 10 , imagine que todo nosso dado de treino foi dividido em 10 partes distintas. Assim, o modelo será treinado com 9 partes, e testado com a parte restante. Esse processo é repetido até que o modelo seja treinado e testado com todas as partes do dado. Com essa técnica evitamos problemas de variância nos dados. Para implementar a validação do modelo, vamos usar a função cross_val_predict() também disponível na biblioteca Scikit-Learn: resultados = cross_val_predict(modelo, freq_tweets, classes, cv=10) O comando atribui a variável resultados, a validação usando a técnica Cross Validation com 10 folds. ASP-Análise de Sentimento e Processamento de Texto – Página 96 de 101 A primeira métrica que vamos medir é a Acurácia do modelo. A Acurácia, basicamente é o percentual de acertos que modelo teve: 1 metrics.accuracy_score(classes,resultados) 2 0.8831564824978656 Existem outras métricas que nos dizem mais sobre os resultados. Também conhecida como tabela de contingência, esta é uma matriz simples que apresenta os resultados de um classificador de forma intuitiva. Para entender, imagine que temos 23 instâncias para classificar em nossa base de teste. Dessas, 13 são classes positivas e 10 são classes negativas. Após o teste do modelo, imagine que a nossa Matriz de Confusão seja a tabela dada. Com essa tabela fica fácil ver que para a classe “positivo” o classificador classificou 10 instâncias como positivo e 3 como negativo, ou seja, ele acerto 10 e errou 3 instâncias. Para classe “negativo”, o classificador classificou 4 como positivo e 6 como negativo, ou seja, este acertou 6 e errou 4. Para medir a Precisão, Revocação e Medida F do modelo faça: sentimento=['Positivo','Negativo','Neutro'] print (metrics.classification_report(classes,resultados,sentimento),'') precision recall Positivo 0.95 0.88 f1-score support 0.91 3300 ASP-Análise de Sentimento e Processamento de Texto – Página 97 de 101 Negativo Neutro 0.89 0.93 0.80 avg / total 0.84 0.89 0.91 0.82 0.88 2446 2453 0.88 8199 O pacote metrics exibe as medidas de precisão, revocação e medida F por classe e por fim, a média disso. Isso é útil para investigarmos a eficiência do modelo para classificação de classes específicas. Por exemplo, podemos ver que a precisão e a revocação do modelo para classificar instâncias neutras é bem diferente para as classes positivas e negativas. Para a Matriz de Confusão, vamos gerar esta para o nosso modelo: 1 print (pd.crosstab(classes, resultados, rownames=['Real'], colnames=['Predito'], margins=True), '') 2 3 Predito Negativo Neutro Positivo All 4 Real 5 Negativo 2275 162 9 2446 Neutro 240 2067 146 2453 Positivo 45 356 2899 3300 2560 2585 3054 8199 6 7 8 All 9 ASP-Análise de Sentimento e Processamento de Texto – Página 98 de 101 7.5 Similaridade entre textos com Affinity Propagation A propagação de afinidade (AP) é um algoritmo de clustering baseado no conceito de "passagem de mensagens" entre pontos de dados. [1] Ao contrário dos algoritmos de clustering, como k -means ou k- medoids, a propagação de afinidade não requer que o número de clusters seja determinado ou estimado antes da execução do algoritmo. Semelhante a k- medoids, a propagação de afinidade localiza "exemplares", membros do conjunto de entrada que são representativos de clusters. O objetivo é encontrar entre todas as partições do conjunto de dados, melhor publicação de acordo com alguma medida de qualidade. A propagação de afinidade é um algoritmo de clustering de erro baixo, alta velocidade e flexível. O problema de o armazenamento em cluster pode ser muito útil no domínio de texto, em que os objetos que podem ser clusters podem ter diferentes granularidades tais como documentos, parágrafos, frases ou termos. O armazenamento em cluster é especialmente útil para organizar documentos para melhore a recuperação e suporte a navegação. As iterações são executadas até que os limites do cluster permaneçam inalterados em um número de iterações ou após algum número predeterminado de iterações. Os exemplares são extraídos das matrizes finais como aqueles cuja 'responsabilidade + disponibilidade' para si mesmos seja positiva. A entrada de Propagação de Afinidade é a semelhança de pares entre cada par dos pontos de dados, s [i, j] (i, j = 1, 2, ..., N) 1. Qualquer tipo de semelhança é aceitável, por exemplo, distância euclidiana negativa para real e coeficiente de Jaccard para dados não-métricos, assim Affinity Propagation é amplamente flexível. Dada a matriz de similaridade s [i, j], a Propagação de Afinidade tenta encontrar os exemplares que maximizam a semelhança líquida, ou seja a soma total de semelhanças entre todos os exemplos e seus pontos de dados de membro. O processo ASP-Análise de Sentimento e Processamento de Texto – Página 99 de 101 Propagação de Afinidade pode ser visto como um processo de passagem de mensagens com dois tipos de mensagens trocadas entre os pontos de dados: responsabilidade e disponibilidade. Responsabilidade, r [i, j], é uma mensagem do ponto de dados i a j que reflete a evidência acumulada de quão bem adequado o ponto de dados j é servir como exemplo para o ponto de dados i. Disponibilidade, a [i, j], é uma mensagem do ponto de dados j para i que reflete a evidência acumulada de quanto apropriado seria para o ponto de dados i escolher o ponto de dados j como exemplo. ASP-Análise de Sentimento e Processamento de Texto – Página 100 de 101 Referências [1] Braga, P. D, Carvalho, A. P., Ludermir, T. B., Redes Neurais Artificiais: Teoria e Aplicações, LTC, 2000, RJ. [2] Duda R. O., Hart Peter and Stork David, Pattern Classification, Second Edition, 2009, John Wiley & Sons. [4] Mitchell, T. M. Machine Learning. McGraw-Hill, 1997. [5] Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, pp. 28252830, 2011. [6] Theodoridis S., Koutroumbas K., Pattern Recognition, Fourt Edition, 2009. Elsevier. [7] Bird, S, Klein E., Loper,E., Natural Language Processing with Python, O’Reilly, 2009, EUA. [8] Plas, J. V., Python Data Science Handbook: Essential Tools for Working with Data, First Edition, 2016, O’Reilly [9] Russell, S. J., Norvig , P., Artificial Intelligence: A Modern Approach, New Jersey, Prentice Hall, Second Edition, 2003 [10] Haikyn, S., Redes Neurais: Princípios e Prática, Segunda Edição, Bookman, São Paulo, 2008 [11] Mertz, D., Text Processing in Python, Bookman, Addison-wesley Professional, 2003 ASP-Análise de Sentimento e Processamento de Texto – Página 101 de 101