TextBlob - uma alternativa para o Processamento de Linguagem Natural
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: