Conversando com máquinas: processamento de linguagem natural com Python

Neste post vamos falar sobre o processamento de linguagem natural, um dos tópicos mais quentes nos dias de hoje! Primeiramente, vamos abordar seu conceito e, depois, vamos  fazer um tutorial, explicando como conduzir uma análise básica, incluindo a instalação das ferramentas necessárias. Vamos lá?!

Comunicação, linguagem e tecnologia

A comunicação oral é, de longe, a forma mais importante de comunicação entre nós, humanos. Apesar de não sabermos ao certo quando na nossa história (enquanto espécie) começamos a comunicar usando palavras, é certo que esta é uma característica que nos acompanha desde nossos primórdios e é fundamental para a organização das nossas sociedades atuais. Neste exato momento (caso você esteja vindo do futuro, estamos em junho de 2019!), somos aproximadamente 7.7 bilhões de pessoas no mundo. Imagina como seria complicado trocarmos informações no cotidiano sem usar as palavras! E essa nossa necessidade de palavras reflete no número de idiomas registrados até o momento: são cerca de 7.000!

Falando em trocar informações no cotidiano, nas últimas décadas o modo como fazemos isso foi profundamente afetado pelo avanço tecnológico, especificamente pelo avanço das tecnologias computacionais. Já não é nenhuma novidade agendarmos encontros com amigos, reuniões de trabalho ou até mesmo comprarmos o jantar trocando algumas mensagens de texto pelo celular, não é mesmo?! Mas o mais intrigante é que esse avanço tecnológico não afetou apenas a nossa troca de informações uns com os outros, mas também tem afetado progressivamente o modo como trocamos informações com os próprios computadores. Pense bem: nas suas primeiras décadas, nossa interação com essas máquinas era feito através de linhas de comando (aquelas telas pretas que recebem código, que muita gente ainda morre de medo!); posteriormente, interfaces gráficas puderam ser desenvolvidas, melhorando a experiência dos usuários. Mais recentemente, assistimos o nascimento da primeira geração (ou, talvez, das primeiras gerações) dos chatbots e das assistentes virtuais, com os quais os usuários podem interagir conversando diretamente. Ou seja, à medida que as tecnologias computacionais avançam, o modo como nos comunicamos com os computadores aparentemente vai se aproximando do modo que nos comunicamos mais naturalmente.

PLN

O processamento de linguagem natural, ou PLN (ou, ainda, NLP, do inglês Natural Language Processing), é o campo da pesquisa computacional que estuda como poderíamos fazer com que uma máquina consiga entender a linguagem dos humanos, especificamente, a linguagem escrita. Ou seja, o objetivo da PLN é explorar a habilidade dos sistemas computacionais em entender textos. Você pode estar se perguntando: mas isso não é o que a gente já faz usando as linguagens de programação? A resposta está no adjetivo “natural”, em PLN. Nas linguagens de programação, todo o conteúdo de palavras é previamente definido pelos seus criadores. Mais ainda: esse conteúdo de palavras deve ser rigorosamente respeitado. Já no contexto do PLN, a intenção é que o computador consiga, de algum modo, “entender” um texto sem restrições desse tipo.

Como mencionado no início desse post, hoje em dia trocamos muita informação através de mensagens de texto. As estimativas são que, cada dia, novos 2.5 quintilhões de bytes de dados são produzidos. Uma bela fatia desse volume de informações é produzida através de textos. Não é à toa que as grandes empresas de tecnologia têm dedicado esforços de pesquisa e desenvolvimento em PLN. O search engine do Google, os nossos feeds do Facebook, os filtros de spam das nossas contas de e-mail, em todos esses casos encontramos sistemas de PLN.

PLN em Python

Mas será que poderíamos implementar uma aplicação de processamento de linguagem natural usando Python? Sim! No universo pytonico, o módulo (ou library) mais conhecido e amplamente utilizado é o NLTK (Natural Language Toolkit).

Neste post, será apresentado como instalar o NLTK e como implementar uma aplicação básica: entender sobre qual assunto é abordado por uma determinada página da internet. Em posts futuros, mais exemplos de possíveis aplicações serão apresentadas. Não perca!

Instalando NLTK

Para começar, é necessário que você tenha uma versão recente do Python e o pip instalados no seu computador. Com esses requerimentos satisfeitos, podemos instalar o NLTK, digitando no terminal de comandos:

pip install nltk

Completada a instalação, podemos importar o NLTK, dentro do Python:

import nltk

Como este é um módulo que demanda muita informação de referência para poder funcionar, precisamos fazer dowload de alguns pacotes de informação para podermos conduzir as nossas análises. Imagine uma ferramenta que precisa ser capaz de processar textos em português, que possui um léxico de 381.000 palavras e, também, textos em inglês, com um léxico de 171.476! Por isso, usamos nltk.dowload para pegarmos as informações que precisamos. Para o exemplo que implementaremos aqui, utilizaremos as “stopwords”, que são palavras que usamos para construir frases, mas que não carregam a informação primária que está sendo transmitida. Por exemplo, considere a frase “Eu gosto de chocolate com amendoim”. Para uma empresa que vende chocolates, certamente o que importa é que na minha frase apareceram as palavras “chocolate” e “amendoim” (e sem nenhuma negação!). As palavras “Eu”, “de”, “com” poderiam ser retiradas sem prejudicar uma análise de PLN. Sendo assim, vamos fazer o dowload das nossas stopwords:

nltk.download('stopwords')
stopwords = nltk.corpus.stopwords.words('portuguese')

No código acima, fazemos download e definimos nossas stopwords em português. Agora, vamos pegar uma página da internet para analisar seu conteúdo. Para isso, vamos usar a técnica de web scraping, usando os módulos urllib e beautiful soup:

import urllib.request
from bs4 import BeautifulSoup

response = urllib.request.urlopen('https://pt.wikipedia.org/wiki/SpaceX')
html = response.read()

No código acima, definimos que a página que trabalharemos será a da SpaceX no Wikipédia. Prosseguindo:

soup = BeautifulSoup(html,'html5lib')
text = soup.get_text(strip = True)
text = text.lower()

Nessas linhas de código, “raspamos” todo o conteúdo textual da nossa página de interesse. Agora, precisamos “limpar” todo esse texto, retirando acentos, barras, números, etc, usando o módulo re. Nesse exemplo, nos limitaremos a fazer apenas uma limpeza básica. Para mais informações sobre esta etapa do pré-processamento para PLN, veja esta documentação do NLTK.

import re

text = re.sub(r'[^\w\s]', ' ', text)
text = re.sub("\d+", ' ', text)

Feito isso, podemos estruturar todas as palavras em uma lista:

tokens = [t for t in text.split()]

A partir dessa lista, podemos eliminar as “stopwords” e, neste caso, alguns códigos grandes que foram “raspados” do site, junto com o conteúdo textual:

clean_tokens = []

for token in tokens:
    if token not in stopwords and len(token) < 20:
        clean_tokens.append(token)

Para usarmos o NLTK para contar a frequência encontrada de palavras, executamos o seguinte comando:

freq = nltk.FreqDist(clean_tokens)

Para visualizarmos o conteúdo de freq, podemos fazer:

for key,val in freq.items():
    print(str(key) + ':' + str(val))

Nada melhor que um gráfico para visualizar esses resultados. Felizmente, o NLTK adicionou esse método no objeto freq para facilitar a vida da gente:

freq.plot(20, cumulative=False)

Concluindo

Com essa análise, conseguimos avaliar o texto capturado a partir de uma página da internet. A partir dos resultados encontrados, podemos inferir que o conteúdo desse site refere-se à empresa SpaceX. Como sabíamos previamente que a página se referia a esse conteúdo, esperamos que fique demonstrado a capacidade que o processamento de linguagem natural tem a oferecer – mesmo que sejam implementações simples, como a que exemplificamos aqui! Seguindo a mesma linha de raciocínio construída neste post, conversas de chat, postagens de redes sociais e anúncios de lojas online poderiam ser analisados. Por exemplo: dado um conjunto de conversas ou postagens em uma rede social, podemos tentar entender quais são os assuntos mais falados ou, ainda, quais produtos mais mencionados nas conversas.

Que tal botar a mão na massa e realizar alguns experimentos?! Bons estudos!