Este relatório consiste em iniciar um estudo básico sobre a manipulação de palavras (strings) para conseguir efetuar algumas análises preliminares. Tal área dentro das ciências humanas tem-se tornado cada vez mais proeminente, dado que manipular grande volume de palavras manualmente era um processo extremamente cansativo até inviável. Neste estudo, usar-se-á uma base que contém todos os discursos do Jair Bolsonaro na sua época de deputado pelo rio de janeiro. Tal análise permitirá entender quais assuntos, tópicos o deputado mais pautava na plenária.
O pacote pacman funciona tanto para carregar bibliotecas já instaladas no seu R quanto bibliotecas que não estão. Se nao tiver instalada, o pacman automaticamente instala no seu diretório.
pacman::p_load(rio, tidyverse, janitor, scales, tidytext, tm, abjutils, ggwordcloud)
# especificas para manipular strings
library(tidytext)
library(tm)
library(abjutils)
# nuvem de palabras
library(ggwordcloud)
A base de dados que usaremos possui mais de 2000 discursos do ex-deputado Jair Bolsonaro durante os seus mandatos como deputado. Além de importar a base, veremos que cada observação contém uma quantidade enorme de informações.
# funcao rio para importar a base
base_bozo <- import('discursos_bolsonaro.csv')
# visualizando o data frame
glimpse(base_bozo)
## Rows: 2,288
## Columns: 5
## $ discurso <chr> "http://www.camara.leg.br/internet/sitaqweb/TextoHTML.asp?e…
## $ sumario <chr> NA, NA, NA, NA, NA, "TRIBUNAL SUPERIOR ELEITORAL (TSE)", NA…
## $ orador <chr> "JAIR BOLSONARO, PSL-RJ", "JAIR BOLSONARO, PSL-RJ", "JAIR B…
## $ sumario_1 <chr> "Contestação a matéria publicada pelo jornal Folha de S.Pau…
## $ discurso_1 <chr> "O SR. JAIR BOLSONARO (PSL-RJ. Sem revisão do orador.) - Sr…
# as únicas variaveis importantes é o 'discurso_1'
discursos_bozo <- base_bozo %>%
select(discurso = discurso_1)
Nesse primeiro contato, é vísivel o enorme volume de palavras no data frame. São mais de 2000 observações, nos quais em cada uma é um discurso enorme como demonstrado no último código. Além disso, o fato de ter letras maiusculas, pontuacao e números interfere na análise de string, o que nos motivará a remover esses impecilhos.
# visualizando o data frame
glimpse(base_bozo)
## Rows: 2,288
## Columns: 5
## $ discurso <chr> "http://www.camara.leg.br/internet/sitaqweb/TextoHTML.asp?e…
## $ sumario <chr> NA, NA, NA, NA, NA, "TRIBUNAL SUPERIOR ELEITORAL (TSE)", NA…
## $ orador <chr> "JAIR BOLSONARO, PSL-RJ", "JAIR BOLSONARO, PSL-RJ", "JAIR B…
## $ sumario_1 <chr> "Contestação a matéria publicada pelo jornal Folha de S.Pau…
## $ discurso_1 <chr> "O SR. JAIR BOLSONARO (PSL-RJ. Sem revisão do orador.) - Sr…
# a única variavel importantes é o 'discurso_1'
discursos_bozo <- base_bozo %>%
select(discurso = discurso_1)
# visualizando apenas uma observaão de discurso
# analisando, só o primeiro discurso, fica vísivel a quantidade de informações contidas em somente uma observação, imagine 2000
discursos_bozo %>%
head(1)
## discurso
## 1 O SR. JAIR BOLSONARO (PSL-RJ. Sem revisão do orador.) - Sr. Presidente, quero falar sobre algo que a nossa Folha de S.Paulo, lamentavelmente, divulgou.\tDeputado Alberto Fraga, veja o que acabou de acontecer. Eu, como tinha dois compromissos em São Paulo, fui para o aeroporto. Quando eu já estava na região de embarque, uma senhora, de repente, aparece completamente embriagada - ela nem deveria estar ali nessa condição. Eu estava ao lado do Senador Magno Malta, por coincidência. O que ela fez? Começou a me ofender, a dizer palavrões. Ela chegou a cair no chão! Ela se estabacou, caiu no chão. Fiquei na minha, contemporizando. Ela dizia que votava em mim e que eu tinha que atendê-la. Ela estava com um bafo terrível de cachaça. Foi lamentável a cena! O que eu fiz então? Fui para o banheiro. Eu não ia discutir com uma pessoa embriagada, que nem deveria estar lá dentro.\tO meu filho Eduardo estava comigo. Ligamos para a Polícia Federal, mas não chegou ninguém. Eu fiquei no banheiro aguardando a poeira baixar. Tudo isso foi filmado.\tQuando eu estava dentro do avião, Mônica Bergamo, da Folha de S.Paulo, liga para mim e indaga: ""Deputado, o que aconteceu?"" Eu contei a ela o que tinha acontecido. E o que ela escreveu? Escreveu que Jair Bolsonaro, diferentemente da maneira como é recebido nos aeroportos, fugiu de uma eleitora que queria conversar com ele e que, depois, fugiu também de xingamentos.\tPara o azar da Sra. Mônica Bergamo, está tudo filmado. O filme mostra inclusive aquela senhora caindo de cara no chão! Foi uma cena lamentável. Apesar de ter me ouvido, o que a Mônica Bergamo faz? Conta exatamente o contrário do que aconteceu.\tOlhe, mídia tradicional, acabou essa historinha de escrever o que acha que é verdade e ponto final!\tMeu filho acabou de editar a fita que mostra essa pessoa se estabacando, caindo no chão. Ela tentou entrar no banheiro dos homens, mas foi contida. Ela, de porre, estava caindo no chão.\tEu lamento que a Folha de S.Paulo, mais uma vez, preste um desserviço à informação sadia. Estão colocando agora o vídeo no Facebook. Vai ser divulgado nas mídias sociais o que aconteceu de verdade.\tFolha de S.Paulo, a sua hora vai chegar. É bom já ir se acostumando.\tObrigado, Presidente Manato.\tO SR. PRESIDENTE (Carlos Manato) - Estamos juntos, Presidente. Estamos juntos.\tO SR. ALBERTO FRAGA - Se isso não tivesse sido filmado, Sr. Presidente, iriam dizer que ele tinha dado uma banda nela.\tO SR. PRESIDENTE (Carlos Manato) - Exatamente.\tO SR. ALBERTO FRAGA - Com certeza, iriam dizer que ele a empurrou, etc. (Riso.)
Ao trabalhar com strings, é necessário limpar todos os textos para padronizá-los. Este processo é importante para que o software reconheca igualmente as mesmas palavras independente se tiverem com acento, caixa baixa ou não etc. Por exemplo, a palavra comissão em minúscula, comissao sem acento ou Comissao com início em maiúsculo, o R não iria reconhecer. Assim, todo esse procedimento inicial é importante para eliminar os viéses errados de interpretação.
Primeiro passo, passar para caixa baixa as palavras
discursos_bozo <- discursos_bozo %>%
mutate(discurso = str_to_lower(discurso))
discursos_bozo <- discursos_bozo %>%
mutate(discurso = removePunctuation(discurso),
discurso = rm_accent(discurso))
# removendo numeros
discursos_bozo <- discursos_bozo %>%
mutate(discurso = removeNumbers(discurso))
# visualizando a limpeza feita
discursos_bozo %>%
head(1)
## discurso
## 1 o sr jair bolsonaro pslrj sem revisao do orador sr presidente quero falar sobre algo que a nossa folha de spaulo lamentavelmente divulgou\tdeputado alberto fraga veja o que acabou de acontecer eu como tinha dois compromissos em sao paulo fui para o aeroporto quando eu ja estava na regiao de embarque uma senhora de repente aparece completamente embriagada ela nem deveria estar ali nessa condicao eu estava ao lado do senador magno malta por coincidencia o que ela fez comecou a me ofender a dizer palavroes ela chegou a cair no chao ela se estabacou caiu no chao fiquei na minha contemporizando ela dizia que votava em mim e que eu tinha que atendela ela estava com um bafo terrivel de cachaca foi lamentavel a cena o que eu fiz entao fui para o banheiro eu nao ia discutir com uma pessoa embriagada que nem deveria estar la dentro\to meu filho eduardo estava comigo ligamos para a policia federal mas nao chegou ninguem eu fiquei no banheiro aguardando a poeira baixar tudo isso foi filmado\tquando eu estava dentro do aviao monica bergamo da folha de spaulo liga para mim e indaga deputado o que aconteceu eu contei a ela o que tinha acontecido e o que ela escreveu escreveu que jair bolsonaro diferentemente da maneira como e recebido nos aeroportos fugiu de uma eleitora que queria conversar com ele e que depois fugiu tambem de xingamentos\tpara o azar da sra monica bergamo esta tudo filmado o filme mostra inclusive aquela senhora caindo de cara no chao foi uma cena lamentavel apesar de ter me ouvido o que a monica bergamo faz conta exatamente o contrario do que aconteceu\tolhe midia tradicional acabou essa historinha de escrever o que acha que e verdade e ponto final\tmeu filho acabou de editar a fita que mostra essa pessoa se estabacando caindo no chao ela tentou entrar no banheiro dos homens mas foi contida ela de porre estava caindo no chao\teu lamento que a folha de spaulo mais uma vez preste um desservico a informacao sadia estao colocando agora o video no facebook vai ser divulgado nas midias sociais o que aconteceu de verdade\tfolha de spaulo a sua hora vai chegar e bom ja ir se acostumando\tobrigado presidente manato\to sr presidente carlos manato estamos juntos presidente estamos juntos\to sr alberto fraga se isso nao tivesse sido filmado sr presidente iriam dizer que ele tinha dado uma banda nela\to sr presidente carlos manato exatamente\to sr alberto fraga com certeza iriam dizer que ele a empurrou etc riso
A partir de agora, trabalharemos com um data frame que terá como cada observação uma palavra diferente. Tal ação agilizará o processo de analisar quais palavras mais aparecem nos discursos
Observe que o novo objeto criado possui muito mais observações, já que cada palavra de cada discurso virou uma observação distinta.
# separando as observações por palavras
discursos_bozo_1 <- discursos_bozo %>%
unnest_tokens(word, discurso)
discursos_bozo_1 %>%
slice(1:10)
## word
## 1 o
## 2 sr
## 3 jair
## 4 bolsonaro
## 5 pslrj
## 6 sem
## 7 revisao
## 8 do
## 9 orador
## 10 sr
Observe que as palavras que mais aparecem são stopwords, ou seja, palavras que conectam orações e frase. Esse tipo de palavra não contribui para compreender quais os assuntos mais discutido pelo parlamentar. Logo, nós próximos tópicos iremos remover as stopwords para chegar no conteúdo relevante para a análise.
# primeiro gráfico
discursos_bozo_1 %>%
count(word) %>%
arrange(-n) %>%
slice(1:10) %>%
ggplot(aes(x = reorder(word, n), y = n)) +
geom_bar(stat = 'identity', color = 'black') +
labs(title = 'Discurso com stop words',
x = '',
y = '') +
coord_flip() +
theme_bw()
# usaremos esse objeto no item 6 para comparar os dois gráficos lado a lado
graf_com_stop <- discursos_bozo_1 %>%
count(word) %>%
arrange(-n) %>%
slice(1:10) %>%
ggplot(aes(x = reorder(word, n), y = n)) +
geom_bar(stat = 'identity', color = 'black') +
labs(title = 'Discurso com stop words',
x = '',
y = '') +
coord_flip() +
theme_bw()
Para remover stopwords podemos usar a função ‘stopwords’ da biblioteca ‘tm’. Esse procedimento eliminará apenas algumas stopwords, pois esse pacote é americano e não consegue reconhecer tão bem stopwords do idioma português.
# criando um objeto novo, que agrupe todas as stop words
discursos_bozo_2 <- discursos_bozo_1 %>%
count(word)
# filtrando tudo o que nao for stopwords do portugues
discursos_bozo_2 <- discursos_bozo_2 %>%
filter(!(word %in% stopwords(kind = 'portuguese'))) %>%
arrange(-n)
# veja que eliminou muitas stopwords, porém existem mais algumas para serem eliminadas (sr, aqui, porque)
discursos_bozo_2 %>%
slice(1:10)
## word n
## 1 nao 6630
## 2 sr 3884
## 3 presidente 3399
## 4 deputado 1647
## 5 militares 1561
## 6 aqui 1394
## 7 porque 1346
## 8 bolsonaro 1297
## 9 militar 1217
## 10 jair 1205
Podemos pedir uma lista de stopwords para o chatgpt criar. Iremos pedir uma lista de stopwords pro gpt e criaremos um dataframe a parte. Com isso, usaremos a função ‘anti_join’, que vai eliminar todas as stopwords ainda existentes no objeto.
# criando a lista
stopwords_pt <- c("vamos", "todos", "nós", "eles", "elas", "e", "ou", "mas",
"para", "por", "com", "de", "em", "no", "na", "se",
"que", "como", "quando", "porque", "porquê", "qual", "quem", "onde",
"quando", "ainda", "mais", "menos", "muito", "pouco", "bem", "mal",
"assim", "mesmo", "apenas", "só", "também", "ainda", "agora", "antes",
"depois", "enquanto", "logo", "primeiro", "segundo", "último", "sempre", "nunca",
"jamais", "talvez", "certamente", "provavelmente", "possivelmente", "claro", "óbvio", "absolutamente",
"realmente", "verdadeiramente", "efetivamente", "eficazmente", "basicamente", "principalmente", "especialmente", "particularmente",
"deveríamos", "precisamos", "teremos", "vamos", "devemos", "queremos", "podemos", "iremos",
"será", "seremos", "serão", "estamos", "estaremos", "estão", "estavam", "estiveram",
"havíamos", "haveremos", "haverão", "havia", "haviam", "há", "haverá", "haveriam",
"tínhamos", "teríamos", "teriam", "tinham", "temos", "teremos", "tiveram", "têm",
"tenhamos", "tenham", "teve", "tinha", "tivesse", "tenha", "tenham", "teria",
"tivesse", "teriam", "seja", "sejam", "sejamos", "sejamos", "fosse", "fossem",
"foram", "sejam", "sejamos", "fosse", "fossem", "foram", "sendo", "sido",
"poderia", "poderiam", "poderá", "poderão", "pode", "podem", "pôde", "puderam",
"puder", "pudermos", "puderem", "deve", "devem", "deveria", "deveriam", "deverá",
"deverão", "deveríamos", "devesse", "devessem", "dever", "deveríamos", "faz", "faça",
"façamos", "fazemos", "fizeram", "fazia", "fizeram", "fizerem", "fará", "farão",
"fazer", "fiz", "fizer", "fizeram", "fizera", "fizermos", "fizerem", "fizeria",
"façamos", "haja", "hajam", "hajamos", "hajam", "houve", "houveram", "havemos",
"houvermos", "houvesse", "houvessem", "houvesse", "haver", "haverá", "haveremos", "haverão",
"haveria", "haveriam", "outra", "outras", "outro", "outros", "alguma", "algumas",
"algum", "alguns", "muita", "muitas", "muito", "muitos", "pouca", "poucas",
"pouco", "poucos", "todo", "todos", "toda", "todas", "nenhum", "nenhuma",
"nenhuns", "nenhumas", "cada", "cada um", "cada uma", "várias", "vários",
"várias", "vários", "mesmo", "mesma", "mesmos", "mesmas", "próprio", "própria",
"próprios", "próprias", "tão", "tanta", "tantos", "tantas", "tudo", "nada",
"coisa", "coisas", "qualquer", "quaisquer", "todo mundo", "todos nós", "todos vocês", "cada um de nós",
"cada um de vocês", "ambos", "ambas", "todo o mundo", "nenhuma pessoa", "nenhuma delas", "nenhum de nós",
"quem quer que", "qualquer um", "alguém", "ninguém", 'nao',
'sr', 'presidente', 'aqui', 'orador', 'revisao', 'sao', 'ser',
'quero', 'bolsonaro', 'deputado', 'vai', 'ha', 'obrigado', 'militar')
# gerando um data.frame a partir da lista
stopwords_pt <- as.data.frame(stopwords_pt)
Para usar a função ‘anti_join’, é necessário que a coluna de referencia possua o mesmo nome. No caso, ambas devem ter o nome ‘word’
# aqui renomeei a coluna para word para ficar igual nos dois objetos
stopwords_pt <- stopwords_pt %>%
rename(word = stopwords_pt)
discursos_bozo_2 <- discursos_bozo_2 %>%
anti_join(stopwords_pt, by = 'word')
discursos_bozo_2 <- discursos_bozo_2 %>%
arrange(-n)
discursos_bozo_2 %>%
slice(1:10)
## word n
## 1 militares 1561
## 2 jair 1205
## 3 governo 1192
## 4 <NA> 1184
## 5 casa 1121
## 6 anos 1111
## 7 forcas 1098
## 8 armadas 1001
## 9 tambem 986
## 10 brasil 903
discursos_bozo_2 %>%
filter(!is.na(word)) %>%
slice(1:10) %>%
ggplot(aes(x = reorder(word, n), y = n)) +
geom_bar(stat = 'identity', color = 'black') +
coord_flip() +
theme_bw() +
labs(title = 'Discurso sem stop words',
x = '',
y = '')
# usaremos esse objeto no item 6 para comparar os dois gráficos lado a lado
graf_sem_stop <- discursos_bozo_2 %>%
filter(!is.na(word)) %>%
slice(1:10) %>%
ggplot(aes(x = reorder(word, n), y = n)) +
geom_bar(stat = 'identity', color = 'black') +
coord_flip() +
theme_bw() +
labs(title = 'Discurso sem stop words',
x = '',
y = '')
Analisando ambos os gráficos, fica vísivel como tratar strings é fundamental para conseguir analisar palavras em qualquer software de programação. Nesse caso, usamos funcoes para padronizar todas as palavras e aprendemos dois métodos de remover stopwords da base de dados
# biblioteca para visualizar graficos simultaneamente
library(patchwork)
# 'somando' os gráficos
graf_sem_stop+graf_com_stop
Embora seja limitada para análises quantitativas, a nuvem de palavras permite observar de maneira dinamica quais assuntos mais aparecem no discurso parlamentar. É uma ótima ferramenta para abordar o conteúdo em um seminário por exemplo.
library(ggwordcloud)
discursos_bozo_2 %>%
slice(1:100) %>%
arrange(-n) %>%
ggplot(aes(label = word, size = 2*n, color = word)) +
geom_text_wordcloud(rm_outside = T, shape = 'square') +
theme_bw() +
scale_size_area(max_size = 8)
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_text_wordcloud()`).
Tratar strings é um novo campo da sociais, possibilitando uma série de análises que até então necessitavam de um tempo longo e trabalhoso para ser feito. Tal trabalho foi apenas uma síntese do assunto. Consulte bibliotecas como ‘rslp’ e ‘SnowBallC’ para aprimorar mais no assunto, por exemplo, eliminando palavras com o mesmo radical.