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.
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):
Text | favorited | favoriteCount | replyToSN | created | truncated | replyToSID | id | replyToUID | statusSource | screenName | retweetCount | isRetweet | retweeted | longitude | latitude |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
As cidades que levaram turistas a desenvolver surtos psicóticos https://t.co/zKi1ThRC9D https://t.co/uqg7CUVyVf | FALSE | 9 | NA | 2019-06-01 00:08:05 | FALSE | NA | 1.13461254309432E+018 | NA | SocialFlow | bbcbrasil | 2 | FALSE | FALSE | NA | NA |
O que pensam os manifestantes pró-Bolsonaro sobre temas polêmicos do governo https://t.co/tHPOqlN2be https://t.co/tdCc0kyqnt | FALSE | 2 | NA | 2019-06-01 00:05:02 | FALSE | NA | 1.13461177668176E+018 | NA | SocialFlow | bbcbrasil | 1 | FALSE | FALSE | NA | NA |
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/56g8St0jug | FALSE | 14 | NA | 2019-06-01 00:05:01 | TRUE | NA | 1.13461177490337E+018 | NA | SocialFlow | bbcbrasil | 0 | FALSE | FALSE | NA | NA |
Por que tantas pessoas se distanciam de suas famílias? https://t.co/BhOEAqJWpl https://t.co/QmcyaMoeOG | FALSE | 13 | NA | 2019-06-01 00:02:03 | FALSE | NA | 1.13461102729807E+018 | NA | SocialFlow | bbcbrasil | 4 | FALSE | FALSE | NA | NA |
EUA: pelo menos 11 pessoas morrem em tiroteio em massa na Virgínia https://t.co/BYCwonz25q | FALSE | 35 | NA | 2019-05-31 23:57:31 | FALSE | NA | 1.13460988615795E+018 | NA | SocialFlow | bbcbrasil | 13 | FALSE | FALSE | NA | NA |
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/bX96i50lzP | FALSE | 42 | NA | 2019-05-31 23:37:03 | TRUE | NA | 1.13460473427341E+018 | NA | SocialFlow | bbcbrasil | 13 | FALSE | FALSE | NA | NA |
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 02 - PDF