Conteúdo Mundo API

Como identificar o que um consumidor ou político está sentindo? Aqui um exemplo do Aécio Neves, com a linguagem R.

Aécio Neves é um político importante no Brasil, agora como todos sabem está no centro das atenções. Por muito pouco não foi eleito Presidente da República em 2014 e é certamente um nome bem influente na atualidade. Mas sério, toda vez que eu vejo esse cara falando, não dou a mínima para quem ele é. Eu apenas fico pensando: ‘Por que ele sempre faz tanta cara de dor?’

Pensando nisso, decidi pegar algumas fotos famosas dele e aplicar um algoritmo de Inteligência Artificial para reconhecimento de emoções. Se minha hipótese estiver correta, provavelmente esse algoritmo retornaria emoções como “dor”, “tristeza” ou “descontentamento”.

A API escolhida para essa tarefa foi a Microsoft Emotions API. O motivo por trás da escolha não é nada especial: foi o primeiro resultado que apareceu no Google para mim!

As imagens utilizadas para testar o algoritmo contra minha hipótese são essas aqui:

Obtenção das emoções

Como dito, para utilizar tal API utilizamos a linguagem R e os pacotes carregados para essa análise foram:

library(tidyverse)
 library(httr)
 library(grid)
 library(gridExtra)

Para obter os resultados, foi necessário entrar na página de APIs de visão da Microsoft e obter uma chave de acesso, guardando-a no objeto key. Depois disso, montei a função pegar_emocoes(), que recebe a URL de uma imagem da internet e uma chave de acesso, e retorna uma tibble com as proporções das emoções em cada coluna.

pegar_emocoes <- function(u_img, key) {
   u_api <- 'https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize'
   result <- httr::POST(
     url = u_api,
     httr::content_type('application/json'), 
     httr::add_headers(.headers = c('Ocp-Apim-Subscription-Key' = key)),
     body = list(url = u_img),
     encode = 'json'
   )
   tibble::as_tibble(httr::content(result, 'parsed')[[1]]$scores)
 }

Finalmente, apliquei a função num vetor de links usando o funcional purrr::map_df.

## recomendo adicionar a API key no arquivo ~/.Renviron
 ## EMOTION_API=<sua_key>
 ## (necessário pular linha no final do arquivo)
 key <- Sys.getenv('EMOTION_API')

d_emocoes <- map_df(u_imagens, pegar_emocoes, key = key, .id = 'id')

Resultados

A Figura 1 mostra a média de cada emoção nas seis fotos. Para minha surpresa, a emoção com maior proporção média foi “neutro”, com peso de quase 50%. As emoções seguintes são “felicidade”, “raiva” e “desdém”. A emoção “tristeza”, que achei que seria frequente por conta da cara de dor do Aécio, ficou com uma proporção média de apenas 5,5%.

Figura 1 Média de cada emoção nas seis fotos baixadas.

A Figura 2 mostra os resultados individuais das imagens. O primeiro resultado faz sentido, já que o Aécio está nitidamente rindo. Em todos os casos, é possível interpretar os resultados olhando a imagem. Por exemplo, o caso com “tristeza” mais alto é o que observamos as sobrancelhas mais caídas.

Figura 2 Emoções do Aécio em cada imagem.

Conclusão

Aparentemente minha hipótese estava errada. Aécio é um cara neutro e feliz, com acessos raiva de vez em quando (por favor, não interprete isso seriamente, é uma brincadeira!). Mas, sinceramente, achei que faltou na API uma emoção “cara de dor” para captar perfeitamente a expressão do Aécio. De qualquer forma, foi uma análise rápida e muito divertida de fazer. Se quiser replicá-la para outras imagens, acesse o código fonte no repositório do GitHub que gera esse site.

É isso. Happy coding 😉

Até,

Julio Trecenti  – Bacharel, mestre e doutorando em Estatística pelo IME-USP. Diretor-técnico da Associação Brasileira de Jurimetria (ABJ). Vice-presidente – CONRE-3a Região. Sócio da Erri consultoria – Trabalha com web scraping, consolidação de dados, visualização e modelagem, construindo modelos preditivos, APIs, pacotes em R e dashboards em Shiny.

Comentário

Deixe uma resposta para Carlos Andrade Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *