Olá pessoal. Recentemente publiquei em meus perfis no Facebook e no Twitter algumas análises dos tweets publicados com a hashtag #QuedaDoPlanalto a qual esteve em primeiro lugar mundial e nacional durante o período conturbado da nomeação do ex-presidente Luíz Inácio Lula da Silva a Ministro da Casa Civil. Este assunto já está sendo amplamente divulgado e acredito ser absolutamente prescindível discutí-lo aqui. Me limitarei a apresentar os códigos usados para realizar a referida análise.

Primeiro, carregamos os pacotes necessários:

library(twitteR)
library(wordcloud)
library(tm)
library(plyr)

É necessário que você tenha uma conta no Twitter como desenvolvedor. Se ainda não possui, consulte este tutorial. Você precisará de quatro chaves: 1) sua consumer key, 2) sua consumer secret, 3) seu access token e 4) seu access secret. Para facilitar a digitação, guarde-os em objetos da seguinte forma:

consumer_key <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
consumer_secret <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
access_token <- "XXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
access_secret <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Para estabelecer uma conexão com o Rest API do Twitter, use:

setup_twitter_oauth(consumer_key,
                    consumer_secret,
                    access_token,
                    access_secret)

Agora, vamos começar a busca. Faremos uma requisição ao API do Twitter por 10.000 tweets que contenham #quedadoplanalto.

tweets <- searchTwitter("#quedadoplanalto", n=10000)

Em seguida, guardaremos os tweets baixados num banco de dados e o salvaremos em um arquivo .csv. Acho essa ação absolutamente importante para que seja possível a replicação das análises. Para usar o código abaixo, substitua [] pelo caminho da pasta onde você deseja salvar o arquivo.

bd <- ldply(tweets, function(t) t$toDataFrame() )
write.table(bd, "C:/.../tweets.csv",
            sep = ";")

Agora, vamos começar a análise. Os tweets fornecidos pelo API vem em formato JSON. Para a análise textual, vamos extrair apenas o texto dos tweets e transformá-lo num corpus de análise no modelo do pacote tm.

text <- sapply(tweets, function(x) x$getText())
corpus <- Corpus(VectorSource(text))
corpus <- Corpus(VectorSource(tweets))

Agora, vamos limpar os textos. Primeiro, como os tweets estarão em português, vamos convertê-lo para o formato “latin1” que aceita acentos para que não haja desconfigurações. Depois vamos colocar todo o texto em letras minúsculas, remover a pontuação e retirar algumas palavras que não são úteis para a análise como preposições, etc (stopwords).

(f <- content_transformer(function(x) iconv(x, to='latin1', sub='byte')))
corpus <- tm_map(corpus, f)
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, function(x)removeWords(x,stopwords("pt")))

Agora, vamos montar uma núvem de palavras com no máximo 100 palavras. Se montarmos uma núvem com palavras demais, a máquina pode não responder de forma satisfatória além de obtermos uma figura ininteligível. Para isso, use o comando

wordcloud(corpus, min.freq = 2, max.words = 100, random.order = F)

Para salientar as palavras por frequência use

library(RColorBrewer)
pal2 <- brewer.pal(8,"Dark2")
wordcloud(corpus, min.freq=2,max.words=100, random.order=F, colors=pal2)

Para a análise classificatória, precisamos montar a matriz Termos-Documentos. Para isso use o comando

tdm <- TermDocumentMatrix(corpus)

Depois disso, vamos retirar as palavras esparsas, e transformar a matriz num banco de dados. É bom olharmos as dimensões do banco de dados para sabermos quantas palavras iremos efetivamente analisar.

tdm <- removeSparseTerms(tdm, sparse = 0.98)
df <- as.data.frame(inspect(tdm))
dim(df)
## [1]   53 9993

Depois disso, calcularemos a distância euclidiana entre as palavras.

df.scale <- scale(df)
d <- dist(df.scale, method = "euclidean")

Por fim, pedidmos uma clusterização hierárquica pelo método da variância mínima de Ward e a plotamos.

fit.ward2 <- hclust(d, method = "ward.D2")
plot(fit.ward2)

Para facilitar a visualização dos grupos formados usamos o comando rect.hclust:

plot(fit.ward2)
rect.hclust(fit.ward2, k=11)

Espero que o post seja útil. Se tiverem dúvidas, críticas ou elogios, por favor comentem no post. Um grande abraço.