Projeto Presidenciáveis

Luísa Mendes Heise
Turing Talks
Published in
5 min readSep 25, 2022

--

Usando tweets para medir a similaridade entre os candidatos

Alguns dos candidatos para o pleito presidencial de 2022

Olá, caro leitor, bem-vindo a mais um Turing Talks. Com as eleições chegando, hoje vamos apresentar o mais novo projeto concluído do Turing USP: o projeto “Presidenciáveis”. A ideia principal do projeto era coletar tweets de candidatos à presidência da República e utilizar algum método para medir as similaridades entre os textos coletados, por tema abordado. Você pode ver o resultado final no site: http://www.presidenciaveis.turingusp.com.br/ (ou, alternativamente https://presidenciaveis-turing-usp.netlify.app/).

Matriz de similaridade de tweets para o tema aposentadoria

Começando pela coleta de dados, nós utilizamos a API do Twitter para uso acadêmico, isso possibilitou a extração de tweets mais antigos dos candidatos. Para esse projeto, nós decidimos coletar tweets escritos desde 2012. O uso da API é relativamente simples e mais detalhes sobre ela podem ser encontrados em sua documentação.

Com os tweets em mãos, começamos nossa análise: desde visualizações mais simples até, de fato, desenvolver a análise que possibilitaria a comparação dos discursos dos presidenciáveis.

Método para comparação de discursos:

Divisão dos temas

O primeiro passo para iniciar a comparação de discursos por tema foi dividir os tweets em temas. A metodologia utilizada para isso foi simples: apenas delimitados alguns tema e, para cada um deles, foram definidas algumas palavras-chave:

  • Aposentadoria: “aposentadoria” e “previdência”;
  • Questões trabalhistas: “CLT”, “emprego”, “trabalhador” e “trabalhadores”;
  • Covid-19: “Covid”, “coronavírus”, “pandemia” e “quarentena”;
  • Educação: “educação” e “ensino”;
  • Fome: “fome”;
  • Gasolina: “gasolina”;
  • LGBT: “gay”, “lésbica”, “homofobia”, “bissexual”, “transsexual”, “transfobia” e “LGBT”;
  • Vacina: “vacina”, “vacinação” e “imunização”.

Com isso feito, essas palavras-chave foram procuradas nos tweets e, caso fossem achadas, isso implicava na classificação daquele tweet com o tema correspondente. Aqui, cabe ressaltar que um único tweet poderia ser classificado com mais de um tema.

Cálculo das similaridades

O cálculo das similaridades foi feito com base no uso de embeddings, mais especificamente, embeddings feitas pelo modelo BERT em português, o BERTimbau, disponível no repositório do HuggingFace.

  • Embeddings

De forma muito genérica, um embedding é uma representação vetorial de uma palavra. Ou seja, uma palavra é traduzida em uma lista de números. Esses números por si só não têm um significado; uma interpretação só pode ser feita ao comparar dois embeddings ou mais entre eles. A forma como esses vetores são obtidos faz com que eles tenham a propriedade de capturar relações semânticas e sintáticas entre as palavras. Isso você pode entender melhor neste texto.

Em específico, o modelo BERT é um dos modelos estado da arte para cálculo de embeddings em português, ele gera embeddings contextualizados, ou seja, uma mesma palavra pode ter representações vetoriais distintas a depender de seu contexto.

  • Embeddings de sentenças

Como já dito anteriormente, os embeddings são fundamentalmente representações de palavras. No entanto, podemos, a partir de vetores de palavras, extrapolar vetores para uma sentença, um texto ou até um conjunto de textos. Isso pode ser feito de muitas maneiras, desde uma concatenação até uma média.

No nosso caso, um embedding de um tweet é a média dos embeddings das palavras contidas nele. E o embedding de um tema é a média dos embeddings do tweets que estão classificados com tal tema.

  • Similaridade de cossenos

Agora que temos nossas representações de temas por candidato, o que resta é comparar esses vetores e chegar à similaridade entre os discursos sobre determinado assunto.

Para tal, utilizamos a similaridade de cossenos, que pode ser definida como um produto interno normalizado entre os vetores. Mais sobre o porquê de utilizar essa métrica pode ser lido no nosso texto sobre embeddings.

Além disso, alguns ajustes foram feitos: para maior consistência do método, foram removidos candidatos em comparações cujo embedding do tema foi feito com o uso de menos de 10 tweets; também, para melhor visualização das diferenças entre os candidatos, uma vez calculadas as similaridades duas a duas, interpolamos esses valores entre 0 e 1, de forma que a menor similaridade correspondeu a 0 e a maior a 1.

Vale ressaltar que, por mais que utilizemos técnicas de Inteligência Artificial para calcular esses valores, eles podem não condizer com a realidade, haja vista que utilizamos apenas palavras chaves escolhidas arbitrariamente para a seleção de tweets. Além disso, os tweets geralmente são administrados não apenas pelo presidenciável que o usa, o que não reflete integralmente sua opinião. Desta forma, algumas opiniões do próprio candidato podem não estar explícitas em seus tweets.

Geração das visualizações

Agora com as similaridades calculadas e interpoladas, elas foram colocadas em uma matriz que as expõe.

Para a produção dos gráficos utilizados ao longo do projeto, usamos a biblioteca Plotly e, após os construirmos, geramos um arquivo html para adicionar ao nosso site.

O site foi feito utilizando o framework ReactJS e optamos por carregar os gráficos em html como um iframe. Vale ressaltar que existe uma implementação de plotly compatível com React, em que podem ser passados jsons com informações sobre o gráfico como props. Esses jsons podem ser gerados em Python com o método .to_json() aplicado à figura.

Com o código do site feito, o app netlify foi utilizado para o deploy do site.

Agradecimentos

Por fim, deixamos aqui nossos agradecimentos a todos os membros do grupo que auxiliaram na construção do projeto:

Rian Pereira Fernandes — rianpf@usp.br

Luísa Mendes Heise — luisa.heise@usp.br

Antonio Cunha Freire Júnior — antoniocunha@usp.br

Daniel Scaramelli — danielscaramelli03@usp.br

Daniel Frozi Brasil da Fonseca daniel.frozi.brasil@usp.br

Felipe Azank dos Santos — felipeazank@usp.br

Gustavo Azevedo Corrêa — guazco@usp.br

Hugo R. V. Angulo — hugovangulo@gmail.com

Igor Augusto — igor.augusto42@usp.br

Isabella Soares Camareli — isacamareli@usp.br

Iryna Miréia Nunes Azevedo — iryna.mireia@usp.br

João Pedro de Freitas Gomes — joaopedrofg@usp.br

Julio Manuel — juliomanuelpamplonaosorio@usp.br

Kauã Fillipe — kauafillipe@usp.br

Lilianne Nakazono — lilianne.nakazono@usp.br

Lucas Leme Santos — lucaslssantos99@usp.br

Maria Fernanda Fernandes Rezende — mariarezende1313@usp.br

Noel Viscome Eliezer — noel.eliezer@usp.br

Raul Granja — raul.granja@usp.br

E por hoje era isso! Se você se interessa por Ciência de Dados, Processamento de Linguagem Natural ou qualquer outra vertente do ramo da Inteligência Artificial, não deixe de ler outros Turing Talks e nos acompanhar em nossas redes sociais, como Facebook, Linkedin, Instagram e, claro, nossos posts do Medium! Entre também em nosso servidor no Discord.

Muito obrigado por chegar até aqui! Bons estudos e até! :)

--

--