Formação
Acesso à Informação
Help Desk
Como investigar tweets com rtweet e R
O Twitter é uma ótima fonte informações sobre diversos assuntos. E, graças à linguagem de programação R e ao pacote rtweet, você pode criar sua própria ferramenta para baixar tweets. Isso facilita a pesquisa, a classificação e a filtragem. Vamos dar uma olhada, passo a passo, nesse universo.
Este tutorial foi feito pela jornalista Sharon Machlis, editora executiva da InfoWorld e data & analytics do International Data Group (IDG), onde trabalha com ferramentas de análise de dados e editoria interna (no Brasil a IDG publica a revista Computerworld). O livro de Sharon “Practical R for Mass Communication and Journalism” foi publicado em dezembro de 2018.
A Abraji traduziu esse tutorial após a gentil permissão de Sharon. Originalmente, ela fez um texto sobre como procurar no Twitter informações sobre conferências de tecnologia, como a “useR!” e a “RStudio Conference”. Mas, claro, o usuário pode pesquisar qualquer outro assunto com o R. No Github da Abraji há exemplos também do uso da busca da hashtag #jornalismo. Você também pode acompanhar o tutorial com este vídeo (em inglês).
Primeiro, é preciso instalar os pacotes do projeto rtweet: rtweet, reactable, glue, stringr, httpuv e dplyr. Então, para começar, carregue rtweet e dplyr.
# Se você precisar instalar qualquer um destes, desmarque
# install.packages("rtweet")
# install.packages("reactable")
# install.packages("glue")
# install.packages("stringr")
# install.packages("httpuv")
# install.packages("dplyr")
# install.packages("purrr")
library(rtweet)
library(dplyr)
Autorizar a API do Twitter
Para usar o rtweet, você precisa de uma conta no Twitter para autorizá-lo a usar suas credenciais de conta específicas. Isso ocorre porque há um limite para quantos tweets você pode baixar em um período de 15 minutos.
Michael Kearney, que escreveu o rtweet, oferece duas opções aos usuários. A maneira mais fácil é simplesmente solicitar alguns tweets. Se não houver credenciais armazenadas no seu sistema, uma janela do navegador será aberta solicitando a autorização da solicitação. Depois disso, um token de autorização será armazenado no seu arquivo .Renviron, para que você não precise autorizar novamente no futuro.
Você pode ir para rtweet.info para ver o outro método, que envolve a configuração de uma conta de desenvolvedor do Twitter e um novo projeto para gerar credenciais de autorização. Se você usar muito o rtweet, provavelmente vai desejar fazer isso.
No arquivo Github da Abraji deste projeto, é possível conferir também a maneira mais difícil. Um guia para obter todas as chaves da sua conta no Twitter está aqui (em inglês).
Importar tweets
Para procurar tweets com uma hashtag específica (ou frase que não seja uma hashtag), use a função search_tweets(). São necessários vários argumentos, incluindo a consulta, como #rstudioconf ou #rstats; se você deseja incluir retweets; e o número de tweets a retornar. O número padrão é 100.
Embora você possa receber até 18.000 tweets em 15 minutos, há uma restrição importante ao usar a API do Twitter para pesquisar uma palavra ou frase: os resultados da pesquisa retornam apenas de seis a nove dias, a menos que você pague por uma conta premium da API do Twitter. Ao contrário do site do Twitter, você não pode usar o rtweet para procurar tweets de uma conferência no ano passado. Não será possível pesquisar duas semanas após uma conferência para obter esses tweets. Portanto, lembre-se de salvar os tweets recebidos agora, se quiser trabalhar com eles no futuro.
Há mais argumentos que você pode usar para personalizar sua pesquisa, mas vamos começar com uma pesquisa básica: 200 tweets com a hashtag #rstudioconf, sem retuítes.
tweet_df <- search_tweets("#rstudioconf", n = 200,
include_rts = FALSE)
Se você executar esse código e nunca tiver usado o rtweet antes, será solicitado que você autorize um aplicativo do Twitter. Ou, se você tiver colocado no seu script as chaves do Twitter, não será solicitado nada.
Observe que, mesmo que você solicite 200 tweets, poderá receber menos. Um dos motivos é que talvez não haja 200 tweets para sua consulta nos últimos seis a nove dias. Outro é que o Twitter pode realmente ter extraído 200 tweets inicialmente, mas depois de filtrar os retweets, restaram menos.
O quadro de dados tweet_df volta com 90 colunas de dados para cada tweet. As colunas mais interessantes são status_id, created_at, screen_name, text, favorite_count, retweet_count e urls_expanded_url. Você pode querer outras colunas para sua análise; mas, para este tutorial, falaremos apenas dessas colunas.
Pesquise, filtre e analise seus tweets
Existem muitas visualizações e análises interessantes que você pode fazer com os dados do Twitter e com o R. Algumas delas são incorporados diretamente ao rtweet. Mas estou escrevendo este tutorial usando meu chapéu de jornalista de tecnologia. Quero uma maneira fácil de ver coisas novas e legais que talvez eu não conheça.
Os tweets mais curtidos de uma conferência podem ajudar com isso. E se eu usar o rtweet e a API do Twitter, não precisarei confiar no algoritmo "popular" do Twitter. Posso fazer minhas próprias pesquisas e definir meus próprios critérios para "popular". Talvez eu queira pesquisar os principais tweets apenas a partir do dia atual, enquanto uma conferência estiver em andamento, ou filtrar um tópico específico no qual estou interessado, como "shiny" ou "purr" (nomes de outros pacotes do R, que provavelmente foram muito discutidos na conferência RStudio), classificado pela maioria dos likes ou pela maioria dos retweets.
Uma das maneiras mais fáceis de fazer esse tipo de pesquisa e classificação é com uma tabela classificável. DT é um pacote popular para isso. Mas ultimamente tenho experimentado outro: reactable.
O padrão reactable () é uma espécie de blá. Por exemplo:
tweet_table_data <- select(tweet_df, -user_id, -status_id)
library(reactable)
reactable(tweet_table_data)
Este código produz uma tabela que se parece com isso:
E na tela Viewer do RStudio em que a tabela interativa aparece, se você clicar no botão “Show in new window” o conteúdo vai aparecer em um browser, o que torna melhor a visualização.
Mas podemos adicionar algumas personalizações, como:
reactable(tweet_table_data,
filterable = TRUE, searchable = TRUE, bordered = TRUE,
striped = TRUE, highlight = TRUE,
defaultPageSize = 25, showPageSizeOptions = TRUE,
showSortable = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200), defaultSortOrder = "desc",
columns = list(
created_at = colDef(defaultSortOrder = "asc"),
screen_name = colDef(defaultSortOrder = "asc"),
text = colDef(html = TRUE, minWidth = 190, resizable = TRUE),
favorite_count = colDef(filterable = FALSE),
retweet_count = colDef(filterable = FALSE),
urls_expanded_url = colDef(html = TRUE)
)
)
O resultado é uma tabela que se parece com isso:
Configure sua tabela de dados reactable
No pedaço de código acima, o argumento filterable = TRUE adicionou filtros de pesquisa abaixo de cada cabeçalho de coluna e searchable adicionou a caixa de pesquisa geral da tabela no canto superior direito. A ativação de bordered, striped e highlight faz o que você pode esperar: adiciona uma borda da tabela, adiciona “listras” de cores de linha alternada e destaca uma linha se você colocar um cursor nela.
Defino meu default PageSize como 25. O argumento show PageSize Options permite alterar o comprimento da página interativamente e, em seguida, defino as opções de tamanho da página que serão exibidas em um menu suspenso abaixo da tabela (não visível na captura de tela). O argumento showSortable adiciona pequenos ícones de seta ao lado dos nomes das colunas para que os usuários saibam que podem clicar para classificar. E defino o defaultSortOrder de cada coluna como decrescente em vez de ascendente. Portanto, se eu clicar na coluna do número de retweets ou curtidas, verei isso da maior para a menor, da menor para a maioria.
Finalmente, há o argumento das colunas. Essa é uma lista que contém uma definição de coluna para cada coluna. Veja os arquivos de ajuda reactable para obter mais detalhes sobre outras opções disponíveis. Neste exemplo, defino as colunas created_at e screen_name para ter uma ordem de classificação padrão ascendente. Para a coluna de texto, defino-a para exibir HTML como HTML, para que eu possa adicionar links clicáveis. Também defini uma largura mínima da coluna de 190 pixels e a redimensionei - para que os usuários possam clicar e arrastar para torná-la mais larga ou mais estreita.
Também desliguei as caixas de filtro para favorite_count e reply_count. Isso ocorre porque, infelizmente, os filtros reactable não entendem quando as colunas são números e os filtram como cadeias de caracteres. Enquanto as classes reactable numeram as colunas corretamente, as caixas de filtro são problemáticas. Essa é a principal desvantagem do pacote reactable versus o DT: o DT entende os tipos e filtros de colunas de acordo. Mas classificar numericamente é suficiente para mim para esse fim.
Você pode conferir o vídeo na parte superior deste artigo para ver como ele se parece quando você classifica uma coluna ou torna a coluna de texto do tweet mais ampla e mais estreita.
Torne sua tabela de dados mais útil
Algumas coisas tornarão esta tabela mais útil. Este código não exibe imagens ou vídeos incluídos nos tweets. Tudo bem, porque meu objetivo aqui é digitalizar texto, não recriar um aplicativo do Twitter. Mas isso significa que às vezes será útil ver o tweet original para visualizar fotos, vídeos ou comentários.
Acho conveniente adicionar um pequeno item clicável no final do texto de cada tweet no qual você pode clicar para ver o tweet real no Twitter. Eu decidi “>>” embora pudesse ser qualquer caractere.
Para construir uma URL, preciso conhecer o formato de um tweet, que se você olhar para qualquer tweet no site do Twitter, poderá ver: https://twitter.com/username/status/tweetID.
Usando o pacote glue, isso seria renderizado da seguinte maneira:
glue::glue("https://twitter.com/{screen_name}/status/{status_id}")
Se você nunca usou glue antes, é um ótimo pacote para colar texto e valores variáveis. No código acima, qualquer nome de variável entre chaves é avaliado.
Meu código completo para criar uma coluna com um link clicável para o tweet após o texto do tweet:
Tweet = glue::glue("{text} <a href='https://twitter.com/{screen_name}/status/{status_id}'>>> </a>")
E o código para criar um quadro de dados para uma tabela interativa:
tweet_table_data <- tweet_df %>%
select(user_id, status_id, created_at, screen_name, text, favorite_count, retweet_count, urls_expanded_url) %>%
mutate(
Tweet = glue::glue("{text} <a href='https://twitter.com/{screen_name}/status/{status_id}'>>> </a>")
)%>%
select(DateTime = created_at, User = screen_name, Tweet, Likes = favorite_count, RTs = retweet_count, URLs = urls_expanded_url)
Também gostaria de criar links clicáveis na coluna URL, que agora é apenas texto. Isso é um pouco complicado, porque a coluna URL é uma lista porque alguns tweets incluem mais de uma URL.
Tenho certeza de que existe uma maneira mais elegante de criar links clicáveis a partir de uma coluna da lista de URLs em texto sem formatação, mas o código abaixo funciona. Primeiro, crio uma função para gerar o HTML se não houver URLs, uma URL ou duas ou mais:
make_url_html <- function(url) {
if(length(url) < 2) {
if(!is.na(url)) {
as.character(glue("<a title = {url} target = '_new' href = '{url}'>{url}</a>") )
} else {
""
}
} else {
paste0(purrr::map_chr(url, ~ paste0("<a title = '", .x, "' target = '_new' href = '", .x, "'>", .x, "</a>", collapse = ", ")), collapse = ", ")
}
}
Eu executo purrr::map_chr() no valor da URL se houver duas ou mais URLs para que cada URL obtenha seu próprio HTML; depois colo-os e coleciono-os em uma única sequência de caracteres para aparecer na tabela.
Depois que minha função funciona, eu uso purrr::map_chr() novamente para iterar sobre cada item da coluna:
tweet_table_data$URLs <- purrr::map_chr(tweet_table_data$URLs, make_url_html)
Não se preocupe se você não entender esta parte, pois é realmente mais sobre purr e listar colunas do que rtweet e reactable. E não é necessário pesquisar e classificar os tweets; você sempre pode clicar no tweet original e ver links clicáveis lá.
Por fim, posso executar meu código reactable() personalizado nos novos dados da tabela de tweets:
reactable(tweet_table_data,
filterable = TRUE, searchable = TRUE, bordered = TRUE, striped = TRUE, highlight = TRUE,
showSortable = TRUE, defaultSortOrder = "desc", defaultPageSize = 25, showPageSizeOptions = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200),
columns = list(
DateTime = colDef(defaultSortOrder = "asc"),
User = colDef(defaultSortOrder = "asc"),
Tweet = colDef(html = TRUE, minWidth = 190, resizable = TRUE),
Likes = colDef(filterable = FALSE, format = colFormat(separators = TRUE)),
RTs = colDef(filterable = FALSE, format = colFormat(separators = TRUE)),
URLs = colDef(html = TRUE)
)
)
Se você chegou até aqui você deve ter sua própria tabela interativa que pode pesquisar, classificar e filtrar tweets de conferências ou tópicos.
Dicas para colecionadores de tweets
Uma coisa a lembrar: se você estiver seguindo uma hashtag de conferência durante a própria conferência (ou outro tipo de assunto), vai desejar coletar tweets suficientes para abranger toda a conferência.
Portanto, verifique a data mais antiga no seu quadro de dados do tweet. Se essa data for após o início da conferência, solicite mais tweets. Se a hashtag da sua conferência tiver mais de 18.000 tweets (como aconteceu quando eu estava rastreando a CES), você precisará criar algumas estratégias para obter todo o conjunto.
Confira o argumento retryonratelimit para search_tweets () se você quiser coletar um conjunto inteiro de mais de 18.000 tweets de hashtags de conferências com duração de 6 dias ou menos.
Por fim, certifique-se de salvar seus dados em um arquivo local quando a conferência terminar. Uma semana depois, você não terá mais acesso a esses tweets por meio de search_tweets() e da API do Twitter.
E confira o episódio bônus "Faça mais com R" para ver como transformar esse aplicativo de rastreamento do Twitter em um aplicativo shiny e interativo.
Para obter mais dicas sobre R, acesse a página "Faça mais com R" em ou a playlist "Faça mais com R" no canal do IDG TECHtalk no YouTube.
(*) Tradução por Reinaldo Chaves.