Construindo uma nuvem de palavras de tweets relacionados ao assunto: FeminicĂ­dio

Agda Costa

Nuvem de Palavras (WordCloud)

Extração dos Dados

Pacotes necessĂĄrios:

#install.packages("twitteR")
#install.packages("wordcloud")
#install.packages("dplyr")
#install.packages("tidytext")
#install.packages("tm")
#install.packages("readr")
#install.packages("magrittr")
#install.packages("stringi")
#install.packages("stringr")
#install.packages("wordcloud2")
#install.packages("kntnr")
#install.packages("kableExtra")
#install.packages("devtools")
#install.packages("pkload")

library(twitteR)   # Para ter acesso Ă  API do Twitter
library(wordcloud) # Para fazer a nuvem de palavras
library(wordcloud2)# Para fazer a nuvem de palavras com mais personalização
library(dplyr)     # Para tratamento dos dados
library(tidytext)  # Para transformar tweets em palavras
library(tm)        # Para processamento e limpesa do corpus
library(readr)     # Para guardar arquivo
library(magrittr)  # Para usar %>%
library(stringi)   # Para tratamento de acentuação
library(stringr)   # Para formatação de palavras
library(knitr)     # Para criação de tabela
library(kableExtra)# Para Personalização tabela
require(devtools)  
require(pkgload)   

AtravĂ©s das Api Keys, carregamos Mil tweets com o assunto FeminicĂ­dio com nosso idioma portuguĂȘs.

api_key             <- "XXXXXXXXXXX"
api_secret          <- "XXXXXXXXXXX"
access_token        <- "XXXXXXXXXXX"
access_token_secret <- "XXXXXXXXXXX"

setup_twitter_oauth(api_key, api_secret, access_token, access_token_secret)

tweets <- searchTwitter("#feminicidio", n = 1000, locale = 'pt')

Transformação

Vamos agora criar um data frame com os tweets e selecionar apenas as variĂĄveis de interesse.

Em seguida, salvar em um arquivo.

No meu caso, escolhi trabalhar com as variåveis Texto, ID, data de criação e Nome do usuårio e quero apenas os tweets que não são Retweet.

dados = twitteR::twListToDF(tweets)

dados = dados %>%
          filter(isRetweet == FALSE) %>%
            select(text, id,created, screenName) 

write.table(dados,"tweets_feminicidio.csv", append=T, row.names=F, col.names=T,  sep=",")
remove(tweets)

Limpeza dos dados.

dados$text <- gsub("#([a-z|A-Z|0-9|_])*","", dados$text)    # remove hashtags
dados$text <- gsub('@([a-z|A-Z|0-9|_])*', '', dados$text)   # remove palavras com @ (mençÔes)
dados$text <- gsub('https://','', dados$text)               # removes https://
dados$text <- gsub('http://','', dados$text)                # removes http://
dados$text <- gsub('[^[:graph:]]', ' ', dados$text)         # removes graphic characters like emoticons 
dados$text <- gsub('[[:punct:]]', '', dados$text)           # removes punctuation 
dados$text <- gsub('[[:cntrl:]]', '', dados$text)           # removes control characters
dados$text <- gsub("\\w*[0-9]+\\w*\\s*", "", dados$text)    # removes numbers
dados$text <- tolower(dados$text)                           # Caixa baixa
dados$text <- gsub('feminicidio','feminicĂ­dio', dados$text) # Substituindo por palavra com acento

Precisamos criar um corpus, converter em um documento de texto simples

E em seguida retirar as ‘stopwords’, que são palavras irrelevantes para nosso objetivo, como ‘para, que, de..’

palavras = dados$text
corpus = VCorpus(VectorSource(palavras), readerControl = list(reader = readPlain, language = "pt"))
corpus = tm_map(corpus, removeWords, stopwords('pt')) 

AnĂĄlise ExporatĂłria

Matriz de termos frequentes.

freq = TermDocumentMatrix(corpus)                            # Matriz de Palvras frequentes 
matriz = as.matrix(freq)                                     # Transformando a matriz no formato R
matriz = sort(rowSums(matriz), decreasing = T)               # Ordenar de forma decrescente
matriz = data.frame(Palavra = names(matriz), Freq = matriz)  # Transformando em Data Frame
matriz$Palavra = str_to_title(matriz$Palavra)                # Primeira letra maiuscĂșla e demais minuscĂșla
Palavra Freq
FeminicĂ­dio 207
Mulher 35
Sobre 26
VĂ­tima 24
Caso 20
Pra 18
Casos 15
Gente 15
Homem 15
Cara 14

Visualização

Finalmente criamos nossa nuvem de palavras..

wordcloud2(matriz, figPath = "T.png", size = 3, color = "skyblue", backgroundColor = "black")

Tweets

par(bg = "black")
wordcloud(str_to_title(matriz$Palavra), matriz$Freq, random.order=FALSE, 
            colors=brewer.pal(8,"RdBu"), max.words = 100, rot.per = 0.2, scale = c (20,0.5))

Tweets