TextBlob - uma alternativa para o Processamento de Linguagem Natural

TextBlob - uma alternativa para o Processamento de Linguagem Natural
Pedro Henrique Campagna Moura da Silva
Pedro Henrique Campagna Moura da Silva

Compartilhe

Quando falamos em Processamento de Linguagem Natural (PLN) ou Natural Language Processing (NLP) e em processamento de dados textuais, as bibliotecas são grandes aliadas nas resoluções dos problemas dessa área. Elas oferecem funções prontas e ferramentas para trabalhar de diversas formas com textos.

Algumas das mais conhecidas são: a NLTK (Natural Language Toolkit), a Pattern e a spaCy. Elas apresentam desde formas de decompor o texto em palavras, frases, tipo gramatical até realizar análises mais complexas, como a de sentimento. Entretanto, essas bibliotecas podem não ser tão amigáveis para quem está iniciando na área, seja por sua complexidade, quantidade de termos e técnicas, ou pela própria documentação.

Para solucionar este problema, existem outras bibliotecas que podem facilitar o processo de adaptação ou mesmo entregar aquela função desejada de forma mais simples. Este artigo vai explorar uma delas: a TextBlob.

Conhecendo a TextBlob

Segundo a documentação, a TextBlob é uma biblioteca Python voltada para o processamento de dados textuais, o principal objeto de estudo do NLP. Além disso, ela tem a missão de simplificar alguns processos importantes, usando - por baixo dos panos - as bibliotecas NLTK e Pattern.

Vale ressaltar que, ao contrário de ferramentas como a NLTK, a TextBlob só possui suporte para a língua inglesa. Vamos explorar um pouco do que a TextBlob pode nos oferecer passando por algumas das principais funcionalidades oferecidas e quais problemas ela nos ajuda a resolver.

Como usar a TextBlob

Para instalar a biblioteca, basta digitar o comando pip install textblob no terminal. A primeira coisa que precisamos fazer para usá-la é criar um objeto TextBlob que recebe, como parâmetro, o texto com o qual vamos trabalhar. Nesse caso, usaremos a frase "Brazil is an amazing country! I love bossa nova.".

import textblob
exemplo = textblob.TextBlob("Brazil is an amazing country! I love bossa nova.")

O objeto TextBlob nos permite trabalhar como se fosse uma string em python, aplicando funções como strip(), upper(), lower() e com diversos métodos voltados para o processamento de texto.

Antes de usar algumas funções dessa biblioteca, será necessário importar e instalar alguns pacotes que pertencem à NLTK. Se você ainda não possui a NLTK instalada, basta fazer o download via pip:

pip install nltk

Vamos importar a NLTK e baixar os pacotes necessários.

import nltk
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('averaged_perceptron_tagger')
nltk.download('brown')

Observação: usando a TextBlob, não é necessário saber quais os pacotes da NLTK deverão ser instalados. Quando tentamos rodar uma função que tem como pré-requisito um pacote, ela retorna um erro que indica qual pacote baixar e o código para baixá-lo.

Agora, vamos começar a explorar um pouco mais desse objeto que criamos. A partir dele, podemos fazer a decomposição do texto que é extremamente importante em NLP. Esse processo de decomposição também é conhecido como tokenização. Existem diversas formas de tokenizar um texto como retirar pontuação e palavras que não são tão importantes. Mas vamos iniciar com algo mais simples.

Dominando o básico

Partindo do objeto TextBlob, podemos extrair as sentenças do texto usando o comando:

exemplo.sentences

Que retorna uma lista de sentenças (objetos Sentence):

[Sentence("Brazil is an amazing country!"), Sentence("I love bossa nova.")]

Além disso, é possível quebrar o texto em palavras da seguinte forma:

zen_blob.words

Que retorna um objeto WordList contendo todas as palavras do texto sem pontuação:

WordList(['Brazil', 'is', 'an', 'amazing', 'country', 'I', 'love', 'bossa', 'nova'])

Uma outra função que o objeto TextBlob nos oferece é a de extração de frases nominais. Estas apresentam mais de uma palavra, mas com um sentido único. Um bom exemplo disso é o termo Fake News que é composto de duas palavras, mas tem um significado específico.

Identificar esses termos pode ser um pouco complicado quando estamos trabalhando PNL, mas a TextBlob faz de uma maneira muito simples.

exemplo.noun_phrases

Que retorna:

WordList(['brazil', 'amazing country', 'bossa nova'])

A partir disso, podemos tratar bossa nova como uma construção única e não perder o sentido da frase.

Classificação

Dos desafios clássicos, quando lidamos com problemas de NLP, dois deles têm destaque na TextBlob: a classificação de palavras e a lematização.

A classificação de palavras nos ajuda a entender a morfologia dos elementos de uma frase, sejam eles substantivos, artigos, etc. Essa classificação pode facilitar, por exemplo, a compreensão de quais são os temas do texto a partir da avaliação dos substantivos.

Para realizar a classificação, basta acessar o atributo tags do nosso objeto TextBlob:

exemplo.tags

Que retorna a classificação gramatical de cada palavra no texto:

[('Brazil', 'NNP'),
 ('is', 'VBZ'),
 ('an', 'DT'),
 ('amazing', 'JJ'),
 ('country', 'NN'),
 ('I', 'PRP'),
 ('love', 'VBP'),
 ('bossa', 'JJ'),
 ('nova', 'NN')]

NNP, que é a tag da palavra Brazil, refere-se a um substantivo próprio no singular, enquanto JJ está relacionado ao adjetivo amazing. Se você deseja conhecer as outras tags, pode consultar a tabela disponível aqui.

Lematização

Agora, vamos para mais uma função que brilha na biblioteca: a lematização. De maneira geral, ela reduz uma palavra à sua base, retirando flexões, prefixos e sufixos. Por exemplo, a palavra regiões, quando lematizada, torna-se região. Se quiser saber mais sobre o assunto, indico o artigo: Lemmatization vs. stemming: quando usar cada uma?.

Para exemplificar o trabalho com a lematização na Textblob, vamos usar a frase "The documents are under the tables" e uma list comprehension para utilizar a função lemmatize() em cada uma das palavras na nossa frase:

lemmatized = [word.lemmatize() for word in teste.words]

Que vai retornar uma lista de palavras lematizadas:

['The', 'document', 'are', 'under', 'the', 'table']

Perceba que as palavras que antes estavam no plural agora estão sem flexão.

Análise de sentimentos

Existem diversos métodos para fazer análise de sentimentos, seja avaliando se em uma frase há um sentimento como tristeza, alegria, nostalgia; ou, de uma forma mais simples, se as frases denotam sentimentos negativos ou positivos. Vamos trabalhar com esse segundo método na biblioteca.

Para isso, basta acessar o atributo sentiment do objeto TextBlob. Esse atributo retorna um objeto Sentiment que possui 2 valores. O primeiro refere-se à polaridade da frase, que vai desde a mais negativa (-1) à mais positiva (1). Já o segundo valor está relacionado à subjetividade/objetividade da frase. Esse valor varia de 0 a 1 e quanto mais próximo de 1, mais subjetiva é a frase.

exemplo = textblob.TextBlob("Brazil is an amazing country! I love bossa nova.")
exemplo.sentiment

Que retorna: Sentiment(polarity=0.625, subjectivity=0.75)

Ao comparar apenas com a primeira sentença "Brazil is an amazing country!", temos:

exemplo_2 = textblob.TextBlob("Brazil is an amazing country!")
exemplo_2.sentiment

Que retorna Sentiment(polarity=0.750, subjectivity=0.9). Perceba que a segunda frase possui uma subjetividade maior em relação à anterior.

Por fim, vamos à um exemplo negativo:

textblob.TextBlob('My experience in Brazil was terrible').sentiment

Que retorna: Sentiment(polarity=-1.0, subjectivity=1.0). Essa frase apresenta uma conotação negativa e uma alta subjetividade.

Essa forma de análise de sentimentos é do tipo não-supervisionada, o que significa que não precisamos passar uma base de frases positivas e negativas para fazer a classificação, sendo uma ferramenta bastante poderosa e de fácil uso.

Conclusão

A TextBlob mostra-se uma excelente biblioteca que oferece algumas ferramentas de forma mais simples em comparação às outras. Em destaque, os processos de análise de sentimentos não-supervisionados, de lematização de palavras e de extração de frases nominais são excelentes e podem nos fazer ganhar tempo quando estamos trabalhando com dados textuais.

Por outro lado, a biblioteca não é tão completa quanto às outras dedicadas para a NLP. Ela possui diversas dependências, como os pacotes internos da NLTK, o que pode ser citado como um ponto negativo.

De maneira geral, a biblioteca oferece simplicidade e eficiência em alguns processos caros relacionados ao processamento de linguagem natural. É especialmente recomendada a quem está iniciando na área, a quem busca funções pontuais e pode "quebrar o galho" em projetos de pequeno porte.

Gostou desse artigo e se interessou pela área de Processamento de Linguagem Natural?

Venha conhecer os cursos da Alura:

Pedro Henrique Campagna Moura da Silva
Pedro Henrique Campagna Moura da Silva

Técnico em Informática e Analista de Relações Internacionais, trabalhou com desenvolvimento de software e ciência de dados voltados para pesquisa. Atualmente estuda governança de dados e tenta sempre construir pontes entre a tecnologia e o internacional.

Veja outros artigos sobre Data Science