Twitter e R (Segundo Post)

1 Contexto Geral

Neste notebook continuarei a discutir algumas fórmulas utilizando o R para realizar pesquisas com o Twitter. Por favor, peço que vá até este post para uma introdução mais geral das funções e objetivos desta sequência de tutoriais.

Por favor, me mande um email, caso precisar de ajuda ou para algum contato de pesquisa. O Script com a função final se encontra no rodapé desta página.

1.1 O que precisamos

Neste post eu imagino que o leitor já tenha:

  1. Consiguido sua autoziração para usar a API do Twitter
  2. Instalado o R e o Rstudio
  3. Instaldo os pacotes já mencionados nste post

2 Pacotes utilizados

Para a análise que realizaremos agora, utilizaremos os seguintes pacores

  • library(twitteR)
    • Para coleta de dados no Twitter
  • library(tm)
    • Para processamento e limpesa do corpus
  • library(readr)
    • Para leitura de CSVs externas
  • library(wordcloud) -Para criação de uma nuvem de palavas

3 Coletando os dados

3.1 Buscando os dados

O primeiro passo é logar-se no Twitter. Configuramos as variáveis de cesso previamente conseguidas. Substitua SEUS_DADOS por suas informações:

## Pacote para coleta
library(twitteR)

##Determinando as Variáveis
consumer_key <- "SEUS_DADOS"
consumer_secret <- "SEUS_DADOS" 
access_token <- "SEUS_DADOS"
access_secret <- "SEUS_DADOS" 

##Entrando na API
setup_twitter_oauth(consumer_key, 
                    consumer_secret, 
                    access_token, access_secret)

Neste tutorial buscaremos os tuítes de um usuário específico, a BBCBrasil.

bbcbr <- userTimeline("bbcbrasil", n=3200)

Agora precisamos transformar esses dados em um “Data Frame”, um dos modelos de dados que o R usa para suas análises.

bbcbr.df <- twListToDF(bbcbr)

Agora vejamos o resultado (solução retirada daqui):

 TextfavoritedfavoriteCountreplyToSNcreatedtruncatedreplyToSIDidreplyToUIDstatusSourcescreenNameretweetCountisRetweetretweetedlongitudelatitude
As cidades que levaram turistas a desenvolver surtos psicóticos https://t.co/zKi1ThRC9D https://t.co/uqg7CUVyVfFALSE9NA2019-06-01 00:08:05FALSENA1.13461254309432E+018NASocialFlowbbcbrasil2FALSEFALSENANA
O que pensam os manifestantes pró-Bolsonaro sobre temas polêmicos do governo https://t.co/tHPOqlN2be https://t.co/tdCc0kyqntFALSE2NA2019-06-01 00:05:02FALSENA1.13461177668176E+018NASocialFlowbbcbrasil1FALSEFALSENANA
Do Won Chang e Jin Sook Chang chegaram aos EUA em 1981 atrás do ‘sonho americano’; Do trabalhou um três empregos si… https://t.co/56g8St0jugFALSE14NA2019-06-01 00:05:01TRUENA1.13461177490337E+018NASocialFlowbbcbrasil0FALSEFALSENANA
Por que tantas pessoas se distanciam de suas famílias? https://t.co/BhOEAqJWpl https://t.co/QmcyaMoeOGFALSE13NA2019-06-01 00:02:03FALSENA1.13461102729807E+018NASocialFlowbbcbrasil4FALSEFALSENANA
EUA: pelo menos 11 pessoas morrem em tiroteio em massa na Virgínia https://t.co/BYCwonz25qFALSE35NA2019-05-31 23:57:31FALSENA1.13460988615795E+018NASocialFlowbbcbrasil13FALSEFALSENANA
Segundo eles, o que está em jogo é o chamado ‘soft power’, termo dado à influência de um país em decisões internaci… https://t.co/bX96i50lzPFALSE42NA2019-05-31 23:37:03TRUENA1.13460473427341E+018NASocialFlowbbcbrasil13FALSEFALSENANA
 

Como podemos perceber, há uma série de informações que podemos utilizar. Entre elas:

  • O texto do tuíte
  • Se alguém o favoritou
  • Se é um réplica
  • Se foi retuitado e quantas vezes isso ocorreu
  • Data do tuíte

3.2 Processando o corpus

A exemplo do post anterior, processaremos os dados dos tuítes

## Carregando o pacote:
library(tm)

#Crirando o corpus
bbcbr.c <- Corpus(VectorSource(bbcbr.df$text))

##Carregando as stowords em português
library(readr)
stop_br <- read_csv("stop_port2.csv")
## Parsed with column specification:
## cols(
##   word = col_character()
## )
stop_br <- as.data.frame(table(unlist(stop_br)))

## Fazendo o processamento e limpesa do corpus

bbcbr.c  <- tm_map(bbcbr.c, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(bbcbr.c, content_transformer(tolower)):
## transformation drops documents
bbcbr.c <- tm_map(bbcbr.c, removeWords, c(stopwords("pt"), stop_br$Var1,". . .", "…", "pode", "após"))
## Warning in tm_map.SimpleCorpus(bbcbr.c, removeWords, c(stopwords("pt"), :
## transformation drops documents
removeURL <- function(x) gsub("http[[:alnum:][:punct:]]*", "", x) 
remove.users <-function(x) gsub("@[[:alnum:][:punct:]]*","",x)
bbcbr.c  <- tm_map(bbcbr.c, content_transformer(removeURL))
## Warning in tm_map.SimpleCorpus(bbcbr.c, content_transformer(removeURL)):
## transformation drops documents
bbcbr.c  <- tm_map(bbcbr.c,content_transformer(remove.users))
## Warning in tm_map.SimpleCorpus(bbcbr.c, content_transformer(remove.users)):
## transformation drops documents
bbcbr.c <- tm_map(bbcbr.c, stripWhitespace)
## Warning in tm_map.SimpleCorpus(bbcbr.c, stripWhitespace): transformation
## drops documents
bbcbr.c  <- tm_map(bbcbr.c, removePunctuation)
## Warning in tm_map.SimpleCorpus(bbcbr.c, removePunctuation): transformation
## drops documents

Agora realizemos uma nuvem de palavras:

library(wordcloud)
wordcloud(bbcbr.c, min.freq = 20, max.words = 100, random.order = F)

Agora realizemos uma nuvem com palavras mais coloridas:

library(RColorBrewer)
pal2 <- brewer.pal(6,"RdBu")
wordcloud(bbcbr.c, min.freq=20,max.words=100, random.order=F, colors=pal2)

3.3 Análise em cluster

Agora tentemos criar um conjutnto de clusters, ou associações de palavras que mais frequentemente co-ocorrem no corpus. Nossa primeira abordagem será criar uma matriz de termos, mostrando para o programa, quais palavras acontecem em cada um dos tuítes. Feito isso, retiraremos as palavras que são esparças a 0.98.

bbc.tdm <- TermDocumentMatrix(bbcbr.c)
bbc.tdm2 <- removeSparseTerms(bbc.tdm, sparse = 0.98)
bbc.tdm.df <- as.data.frame(inspect(bbc.tdm))
## <<TermDocumentMatrix (terms: 5510, documents: 3157)>>
## Non-/sparse entries: 28920/17366150
## Sparsity           : 100%
## Maximal term length: 24
## Weighting          : term frequency (tf)
## Sample             :
##             Docs
## Terms        20 2021 2075 2350 2375 2411 2452 3 36 47
##   …           0    1    1    1    1    1    1 0  0  0
##   anos        0    0    0    0    0    0    0 0  0  0
##   arquivobbc  0    0    0    1    1    0    0 0  0  0
##   bolsonaro   0    1    1    0    0    0    0 0  0  0
##   diz         0    0    0    0    0    0    0 0  0  0
##   eua         0    0    0    0    0    0    0 1  0  1
##   maislidas   0    0    0    0    0    1    1 0  0  0
##   mundo       0    0    0    0    0    0    0 0  0  0
##   ser         0    0    0    0    0    0    0 0  0  0
##   sobre       0    0    0    0    0    0    0 0  0  0

Agora realizaremos a escala e o cáuculo dos clusters, usando a medida Euclidiana e o método Wadrd2

bbc.tdm.df.scale <- scale(bbc.tdm.df)
bbc.tdm.df.scale.d <- dist(bbc.tdm.df.scale , method = "euclidean")
ward2 <- hclust(bbc.tdm.df.scale.d , method = "ward.D2")
plot(ward2)

Esses dados revelam alguns dos tópicos que a BBCBrasil tem tratado nos últimos 3500 tuítes, dados desta amostra.

Twitter 2 - Scripts

 

Twitter 02 - PDF