Análise de Sentimentos no Twitter Sobre o Governo Bolsonaro
Por meio do Twitter, mostramos como é possível analisar os sentimentos predominantes na população sobre o atual governo.
Nota: Este artigo não tem como objetivo apresentar uma visão política, mas apenas explorar por meio de técnicas computacionais o sentimento da população nas redes sociais sobre o atual governo.
A nálise de Sentimentos consiste em classificar automaticamente, desde palavras até textos inteiros, o sentimento predominante em um documento. Por exemplo: na frase “hoje eu estou feliz” o sentimento predominante é positivo.
Essa técnica possui grande apelo comercial, podendo ser utilizada por empresas para verificar o sentimento geral dos seus consumidores em redes sociais sobre um novo produto e assim definir estratégias de marketing. O mesmo vale para um governo, que pode se utilizar de algoritmos para medir a satisfação geral da população de acordo com suas políticas ou escândalos.
Felizmente, hoje em dia temos ferramentas que nos permitem fazer uma Análise de Sentimentos em poucos minutos: Redes Sociais e a linguagem de programação Python com algumas bibliotecas: Tweepy e TextBlob. Em Redes Sociais como Twitter e Facebook as pessoas divulgam a todo momento a sua opinião sobre diversos assuntos atuais e conseguimos ter acesso a esses dados quase que em tempo real por meio do Python (cuidado com sua — falta de — privacidade!).
Vamos neste artigo, portanto, aproveitar de um assunto da moda, o governo Bolsonaro, verificar centenas de posts no Twitter com #bolsonaro e perguntar: afinal, as pessoas estão falando bem ou mal de Bolsonaro em suas redes sociais?
Neste artigo, você irá aprender:
- Como baixar tweets usando Python?
- Como traduzir textos do português para o Inglês em Python?
- Como usar a biblioteca TextBlob para fazer Análise de Sentimentos?
- Afinal, o que as pessoas estão falando sobre o governo Bolsonaro?
Iniciando…
Em primeiro lugar, precisamos preparar o nosso ambiente de programação. Como isso não é o foco deste artigo, vou deixar uma lista de links que explicam o passo-a-passo para você começar a programar.
Precisamos da linguagem de programação Python instalada (como fazer aqui), bem como também as bibliotecas Tweepy (como fazer aqui) e TextBlob (como fazer aqui), bem como também configurar o Twitter para podermos baixar seus dados (como fazer aqui).
Essas etapas preliminares não são difíceis de serem realizadas, demorando no máximo 30 minutos para fazer tudo e deixar nosso ambiente pronto. Quaisquer dúvidas, deixe nos comentários.
Mãos à massa!
Primeiramente, vamos realizar nossas importações de bibliotecas.
import tweepyfrom textblob import TextBlobfrom googletrans import Translatorfrom unidecode import unidecode
Uma vez que a nossa conta no Twitter está pronta, podemos nos autenticar e realizar os downloads de tweets. A autenticação é feita fornecendo os tokens de acesso consumer_key, consumer_secret, access_token, access_token_secret. Se houver dúvidas quanto a esses valores, sugiro retornar aos tutoriais apresentados na seção anterior.
#Tokens de acessoconsumer_key= ''consumer_secret= ''access_token=''access_token_secret=''#Autenticandoauth = tweepy.OAuthHandler(consumer_key, consumer_secret)auth.set_access_token(access_token, access_token_secret)api = tweepy.API(auth,wait_on_rate_limit=True)
Vamos também manter algumas variáveis auxiliares para estatísticas simples: a quantidade do número de tweets positivos e negativos, além da quantidade total de tweets.
#ContadoresnumPos = 0numNeg = 0total = 0
Depois de autenticado, estamos prontos para rodar a nossa busca no Twitter. Essa busca retornará uma lista de tweets, os quais serão percorridos para realizarmos o nosso processamento principal: a Análise de Sentimentos. Note que a nossa busca está indicada por q=”#bolsonaro”. Ou seja, caso deseje realizar uma Análise de Sentimentos sobre qualquer outro tema, você já sabe onde deve mudar o código!
Ainda, fazemos questão que nossos tweets analisados sejam em português e durante o dia 22/02/2019 e limitamos o nosso experimento a 100 tweets. Para uma análise mais completa, esse número pode ser aumentado indefinidamente, bem como também o prazo da análise pode ser bem maior. A API do Twitter apresenta algumas limitações que serão discutidas em um artigo posterior.
#Buscando tweets
for tweet in tweepy.Cursor(api.search,q="#bolsonaro", since = '2019-02-22',lang="pt").items(100):
#Texto do Tweet
textPT = unidecode(tweet.text) #Traduzindo para o Inglês
textEN = Translator().translate(textPT) #Calculando o sentimento...
sentiment = TextBlob(textEN.text)
Nesse ponto, cabe explicar como que a biblioteca TextBlob funciona: simplificadamente, ela conta o número de palavras positivas e negativas em uma sentença, calculando a média e determinando se a sentença é positiva ou negativa. No entanto, ela apenas funciona para o inglês. Então, antes de realizar a Análise de Sentimentos, vamos traduzir nossa sentença usando a biblioteca Translator, que acessa o servidor do Google por baixo dos panos. Obviamente, essa etapa pode inserir algum erro no nosso trabalho porque a tradução automática nunca é perfeita, e existem técnicas avançadas de Aprendizado de Máquina que contornam isso, mas fica além do escopo deste artigo.
Em seguida, para testar exibimos os tweets em português, o tweet traduzido para o Inglês (repare em alguns erros de tradução) e o valor do sentimento calculado pela biblioteca. Os sentimentos variam de -1 (negativo) a +1 (positivo).
(for...)
#Exibindo...
print("[PT-BR] "+textPT)
print("[EN] "+textEN.text)
print("[Sent.] "+str(sentiment.polarity)+"\n")
Como exemplo, veja dois tweets, um positivo e um negativo, e suas respectivas saídas em português, inglês e sentimento calculado.
Positivo
[PT-BR] #BOLSONARO eu confio cada vez mais. Nossa ultima oportunidade de um pais melhor.
[EN] #BOLSONARO I trust more and more. Our last chance for a better country.
[Sent.] 0.375
Negativo
[PT-BR] RT @ZeRenato_OSLima: A educacao brasileira foi entregue ao que ha de pior, gente desajustada, baixa formacao moral sim relembrando o deles...
[EN] RT @ZeRenato_OSLima: The Brazilian education was delivered to the worst, people misfit, low moral formation yes remembering theirs ...
[Sent.] -0.333
Aqui, contamos o total de tweets que baixamos, o número de tweets positivos e o número de tweets negativos.
(for...)
#Estatísticas
total += 1
if sentiment.polarity > 0:
numPos += 1
elif sentiment.polarity < 0:
numNeg += 1
Para encerrar, calculamos o sentimento geral dos tweets analisados e os exibimos.
#Sentimento geral
mediaPos = numPos/total
mediaNeg = numNeg/totalprint('Porcentagem de comentários positivos: '+str(mediaPos))
print('Porcentagem de comentários negativos: '+str(mediaNeg))
A saída do código apresentado é mostrada a seguir.
Porcentagem de comentários positivos: 0.4
Porcentagem de comentários negativos: 0.6
Com isso, podemos ver que o sentimento geral da população na nossa pequena amostra de tweets analisados sobre o governo Bolsonaro é negativa. Provavelmente, isso se deve a escândalos que podem ter ocorrido no período, como o caso do ministro Bebiano, crise com a ditadura Venezuelana e outros fatores, sendo impossível desvincular nossa Análise de Sentimentos do período político ao qual o país está passando.
No entanto, vale a pena destacar que a quantidade de tweets analisada é baixa, cabendo, portanto, a um futuro trabalho analisar mais a fundo essa questão., bem como também o conteúdo de cada tweet classificado como positivo ou negativo.
Segue o código completo.
import tweepy
from textblob import TextBlob
from googletrans import Translator
from unidecode import unidecode#Tokens de acesso
consumer_key= ''
consumer_secret= ''
access_token=''
access_token_secret=''#Autenticando
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)#Contadores
numPos = 0
numNeg = 0
total = 0#Buscando tweets
for tweet in tweepy.Cursor(api.search,q="#bolsonaro", since = '2019-02-22',lang="pt").items(100):
#Texto do Tweet
textPT = unidecode(tweet.text)
#Traduzindo para o Inglês
textEN = Translator().translate(textPT)
sentiment = TextBlob(textEN.text)
#Exibindo...
print("[PT-BR] "+textPT)
print("[EN] "+textEN.text)
print("[Sent.] "+str(sentiment.polarity)+"\n")
#Estatísticas
total += 1
if sentiment.polarity > 0:
numPos += 1
elif sentiment.polarity < 0:
numNeg += 1
#Sentimento geral
mediaPos = numPos/total
mediaNeg = numNeg/totalprint('Porcentagem de comentários positivos: '+str(mediaPos))
print('Porcentagem de comentários negativos: '+str(mediaNeg))
Conclusão
Mostramos neste curto artigo como é possível fazer uso de ferramentas simples na linguagem de programação Python para realizar uma Análise de Sentimentos sobre o governo Bolsonaro. Mostramos que, para uma amostra pequena de tweets, o sentimento geral captado foi negativo, cabendo aqui uma análise posterior do conteúdo de cada tweet e da técnica empregada. Muito espaço para inovação e aprimoramento é possível nesse sentido.
Limitações
Novamente, é necessário enfatizar que existem taxas de erros no processo de Análise de Sentimentos, seja pela técnica empregada pela biblioteca TextBlob seja pelo nosso processo extra inserido de tradução do português para o inglês. Análise de Sentimentos é uma técnica muito estudada em Processamento de Linguagem Natural e em Aprendizado de Máquina, possuindo complexidade que vai muito além deste artigo introdutório.
E depois?
Como trabalhos futuros, poderíamos aumentar a quantidade de dados analisados, assim como também o período analisado. Além disso, também se faz necessário uma avaliação das classificações realizadas por meio da biblioteca TextBlob para verificar se esta é a técnica mais adequada para Análise de Sentimentos nesse contexto.
Outro trabalho interessante seria a aplicação dessa técnica no período eleitoral que passamos em 2018. Acredito que muita coisa interessante poderia ter saído das Redes Sociais na época. Além disso, poderíamos colocar em um gráfico a evolução do sentimento a respeito do governo Bolsonaro ao longo do tempo para uma análise mais profunda. Idéias não faltam.
Um abraço a todos e obrigado pela leitura!