Introdução ao Processamento de Linguagem Natural com Baco Exu do Blues

Luísa Mendes Heise
Turing Talks
Published in
9 min readMay 10, 2020

--

Texto escrito por Julia Miho Ichikawa Pocciotti e Luísa Mendes Heise.

Fala, pessoal, tudo bem? Pra quem curtiu o texto do Fernando Pessoa, agora mais um texto sobre processamento de linguagem natural!

Eu não gosto de você, sorrio ao te ver
Não quero não te ver jamais
Eu pareço com você, no espelho está você
Não me enlouqueça mais

O que é Processamento de Linguagem Natural?

Processamento de Linguagem Natural é a área da ciência da computação focada na geração e compreensão das línguas humanas. Como a comunicação entre nós, humanos, fica restrita praticamente ao uso das línguas naturais, muitas são as tarefas que envolvem PLN (ou NLP em inglês). Hoje, já é possível detectar várias atividades do cotidiano das pessoas que envolvem essa área, seja através do uso de assistentes pessoais em celulares, filtros de spam na caixa de emails, tradutores automáticos e corretores ortográficos, por exemplo.

Neste Turing Talks, iremos introduzir os primeiros passos com Processamento de Linguagem Natural. Para isso, estaremos analisando as músicas coletadas na internet do artista Baco Exu do Blues.

O Artista

Baco Exu do Blues é um cantor, compositor e rapper brasileiro. Em 2017, Baco lançou o seu primeiro disco solo, Esú, muito elogiado pela crítica. As músicas são pautadas fortemente em temas sociais, mas abordando também outras temáticas.

Entre as músicas mais conhecidas, estão “Girassóis de Van Gogh”, “Me Desculpa Jay Z”, “Te amo desgraça” e “Flamingos”.

Nesse texto, vamos utilizar ferramentas básicas de PLN para analisar a composição lexical das letras das canções do artista.

Foto do artista Baco Exu do Blues

Aquisição dos dados

Antes de iniciar a análise em si, precisamos adquirir os dados. Para isso, nós extraímos as letras do Baco Exu do Blues disponibilizadas pelo site vagalume. Você pode fazer isso com web scrapping (que foi o que fizemos) ou utilizando a API do vagalume.

Pré-processamento

Agora que temos os nossos dados coletados, precisamos organizá-los antes de partirmos para a nossa análise. Com os pré-processamentos, conseguimos reduzir o tamanho do nosso vocabulário e simplificar algumas formas lexicais, garantindo, assim, que o nosso algoritmo consiga extrair informações relevantes e que de fato representam o nosso artista.

Expressões regulares

Expressões regulares podem ser consideradas uma sequência de caracteres utilizada para encontrar ou substituir padrões em uma string. Nesta etapa inicial, usaremos deste recurso para manter apenas os caracteres que representam letras do alfabeto.

Para trabalhar com Expressões Regulares em Python, vamos importar a biblioteca re e utilizar o método .findall(). Nele, passamos o padrão a ser procurado e a string em que ele deve buscar esta informação. Neste post não entraremos em detalhe sobre a sintaxe de expressões regulares, mas você pode encontrar mais informações sobre elas aqui.

Como em Python palavras como “oi” e “Oi” são interpretadas como palavras diferentes pelo sistema, nesta etapa também transformamos o texto para que ele contenha apenas letras minúsculas usando o método .lower().

Tokenização

Outra etapa frequente em pré-processamentos de PLN é a tokenização. Tokenização significa pegar cada uma das palavras do texto (tokens) e armazená-las em uma lista. Para fazer isso, poderíamos ter usado tokenizadores de bibliotecas como NLTK , entretanto, o método .findall() já nos retorna uma lista com as palavras do texto. Por isso, iremos pular esta etapa.

Stopwords

Stopwords são palavras que, apesar de muito frequentes, carregam pouca relevância semântica. Entre elas, podemos encontrar artigos como “o” e “uma”, ou preposições como “de” e “em”, entre outras palavras frequentes no idioma. Para removê-las do texto, utilizamos uma lista de stopwords em português disponível na biblioteca NLTK.

Em português, não encontramos nessa lista algumas formas contraídas de verbos ou preposições, como “tá” e “pra”. Sendo assim, adicionamos manualmente esses exemplos.

Lematização

Nesta etapa, iremos passar o texto por uma simplificação lexical. Para isso, há dois processos possíveis: Stemização e Lematização. O primeiro refere-se ao processo de reduzir as palavras flexionadas à sua raiz. O segundo é responsável por representar as palavras através do infinitivo para os verbos, e do masculino singular no caso de substantivos e adjetivos.

No caso da Stemização, por retornar apenas a raiz da palavra, é possível que o resultado seja uma forma não dicionarizada desta. Como iremos utilizar as palavras para a nossa análise, escolhemos usar a Lematização.

Para esta tarefa, utilizaremos o lematizador da biblioteca spaCy. Entretanto, ainda existem formas verbais que não são detectadas por essa ferramenta em português. Sendo assim, adicionamos manualmente também uma lista com alguns desses verbos.

Agora, criaremos a função limpar_texto para compilar todas as etapas que descrevemos acima:

Frequência lexical

Todos os passos anteriores de limpeza dos dados são essenciais para que a análise agora seja feita da melhor forma possível.

Nosso objetivo é analisar as escolhas de vocabulário do Baco Exu do Blues em suas letras. Para isso, utilizamos técnicas de análise lexical. Mas o que é léxico? Bom, o léxico pode ser definido como um conjunto de palavras existente em uma língua. Assim, o vocabulário de cada um é um recorte dentro do léxico possível para aquele idioma.

Plots de frequência

Frequência lexical é nada mais nada menos do que avaliar quantas vezes uma dada palavra aparece dentro de um corpus (ou corpora). Na linguística, um corpus (plural corpora) de um texto é um conjunto de “subtextos” menores, geralmente armazenados e processados ​para análises ou predições. Para realizar uma análise de frequência lexical correta, nós precisamos fazer os devidos pré-processamentos, já que não é desejável que conjugações distintas de um mesmo verbo sejam contabilizadas como palavras diferentes. Também não queremos que stopwords constem na nossa amostra, pois certamente constariam entre as palavras mais usadas sem que isso nos acrescentasse na análise.

Para o código vamos utilizar a função .FreqDist() do nltk. Nela passamos como parâmetro o texto que estamos analisando. Na hora de plotar, passamos o número de palavras mais frequentes que queremos representar.

Assim, obtemos o seguinte plot, com as 30 palavras mais frequentes das músicas:

Podemos fazer a mesma análise segmentada por álbum. Para isso, basta filtrar as letras de dado album, fazer a limpeza e passar para a função a string com as canções deste. Para fazer esse filtro vamos utilizar métodos do pandas.

Obtemos, então, os seguintes plots:

Para o álbum Esú

Distribution Plot do álbum Esú

Para o álbum Bluesman:

Distribution Plot do álbum Bluesman

Para o álbum OldMonkey:

Distribution Plot do album OldMonkey

Wordclouds

Wordcloud, ou “nuvem de palavras” é uma outra forma (mais visual e mais legal rsrs) de representar frequência lexical. Você já deve ter se deparado com alguma wordcloud na sua vida, mas você sabia que você pode usar o Python para gerar a sua?

Para criar nossa nuvem de palavras, utilizamos a biblioteca wordcloud, que recebe uma string com todo o nosso texto e partir disso gera a figura. Dentro dessa biblioteca, teoricamente, já estão implementados pré-processamentos de stopwords. O problema aqui (e com muitas outras coisas em PLN) é que as coisas estão principalmente implementadas para o inglês, então nós precisamos fazer o nosso próprio pré processamento e concatenar nossos tokens em português em uma grande string para gerar a wordcloud.

Assim, obtemos a seguinte nuvem de palavras:

Essa função tem uma quantidade incrível de parâmetros que você pode utilizar para embelezar a sua nuvem de palavras. Para ver todos eles basta usar o comando ?WordCloud.

Brincando um pouco com a função, utilizamos os parâmetros mask, colormap e font_path para criar uma máscara (um desenho) para conter nossas palavras, as cores delas e a fonte.

Para fazer a máscara a partir da foto do Baco, utilizamos o seguinte código:

O colormap escolhido foi o “copper”, você pode ver outros aqui. Para o font_path, basta você referenciar um arquivo no seu computador com a extensão .ttf .

O resultado final fica assim:

Concordância e similaridade

Nessa seção, a tradução livre dos termos não joga muito a nosso favor. Quando você lê a palavra “concordância”, talvez se lembre de uma longínqua aula de gramática em que tinha que verificar se um texto era coerente na escolha das pessoas verbais e seus pronomes ou na conjugação dos verbos.

Aqui o conceito passa bem longe disso. No contexto de PLN, concordância (do inglês concordance) de uma palavra é, em geral, um método que nos retornará os vários contextos que essa palavra aparece no corpus deste texto.

Entender o contexto e a distribuição das palavras em um dado texto é uma tarefa que se provou extremamente útil dentro do escopo de PLN. Ilustremos o porque disso:

Você pode pensar em várias formas de definir o significado de uma palavra. O jeito que nos vem de forma mais óbvia é o mesmo procedimento adotado por um dicionário. Formas parecidas com essa, dentro de PLN, são as abordagens com semântica denotativa (do inglês denotational semantics), em que se utilizam sinônimos/relações semânticas dadas para definir o significado de uma palavra. Esse tipo de abordagem é adotada nas chamadas wordnets, que são bases de dados de léxicos de um dado idioma que estabelecem essas relações.

Exemplo de relações semânticas em uma wordnet. Fonte: https://www.cs.princeton.edu/courses/archive/spr13/cos226/assignments/wordnet.html

Uma Wordnet em inglês de Princeton. Wordnet em português (USP de São Carlos)

As wordnets foram por muito tempo a melhor maneira que tínhamos de estabelecer computacionalmente relações entre as palavras. Entretanto, uma abordagem que superou as wordnets e se mostrou extremamente eficaz em estabelecer significado (e a partir daí implicar relações semânticas entre as palavras) foi a de analisar os contextos. Essa ideia vem de uma área chamada Semântica distribucional (do inglês distributional semantics) e deu origem a algoritmos como o word2vec (que provavelmente será abordado em um post futuro).

Agora que entendemos porque é tão importante avaliar as palavras no contexto que aparecem, vamos fazer essa análise dentro da obra do Baco Exu do Blues.

Para isso, vamos utilizar dois métodos da biblioteca nltk. O primeiro deles, já explicado acima, é o concordance(), que nos retornará uma lista de contextos diferentes em que uma dada palavra aparece. O segundo é o similar() que nos retorna quais palavras mais aparecem no mesmo contexto que uma dada palavra.

Vamos utilizar as palavras “mulher” e “dinheiro”.

Esse código nos retorna:

Para a palavra “dinheiro”, a função nos retorna:

Agora, uma parte bem interessante é ver quais as palavras que mais aparecem no mesmo contexto que essas. Vamos usar então o método similar() para isso.

O código acima nos retorna:

Para a palavra “mulher”, temos:

Isso significa que dentro do contexto dessa obra, as ideias entre essas palavras costumam aparecer no mesmo contexto. O que pode nos dizer muito sobre as críticas e problemáticas que Baco Exu do Blues aborda em suas músicas.

Conclusão

Em conclusão, as ferramentas básicas de processamento de linguagem natural são muito úteis para uma primeira análise de textos. Não somente, elas podem ajudar muito na performance de modelos de machine learning em PLN (assunto para um próximo Turing Talks).

Esperamos que vocês tenham gostado do texto! Se quiserem conhecer um pouco mais sobre o que fazemos no grupo, não deixem de seguir as nossas redes sociais: Facebook, Instagram, LinkedIn e, claro, acompanhar nossos posts no Medium.

Até a próxima!

--

--