Vamos abrir um arquivo do R (.rds) que contém discursos de um parlamentar na Câmara dos deputados para trabalharmos com os diferentes pacotes de mineração de texto.
url <- "https://github.com/JonnyPhillips/FLS6397_2019/raw/master/data/discursos.txt"
download.file(url, destfile="discursos.txt")
discursos <- readLines("discursos.txt")
Qual é o tamanho de cada discurso? Vamos aplicar str_length para descobrir. Seu uso é semelhante ao da função nchar:
library(stringr)
len_discursos <- str_length(discursos)
len_discursos
Vamos agora observar quais são os discursos nos quais a deputada menciona “Constituição”. Para tanto, usamos str_detect
str_detect(discursos, "Constituição")
Poderíamos usar o vetor lógico resultante para gerar um subconjunto dos discursos, apenas com aqueles nos quais a palavra “Constituição” é mencionada. Mais simples, porém, é utilizar a função str_subset, que funciona tal qual str_detect, mas resulta num subconjunto em lugar de um vetor lógico:
discursos_constituicao <- str_subset(discursos, "Constituição")
Se quisessemos apenas a posição no vetor dos discursos que contêm “Constituição”, str_which faria o trabalho:
str_which(discursos, "Constituição")
Voltando ao vetor completo, quantas vezes “Constituição” é mencionada em cada discursos? Qual é o máximo de menções a “Constituição” em um único discurso?
str_count(discursos, "Constituição")
max(str_count(discursos, "Constituição"))
Vamos fazer uma substituição nos discursos. No lugar de “Constituição” colocaremos a expressão “Constituição, aquele pedaço de papel que não vale nada,”. Podemos fazer a substituição com str_replace ou com str_replace_all. A diferença entre ambas é que str_replace substitui apenas a primeira ocorrênca encontrada, enquanto str_replace_all substitui todas as ocorrências.
str_replace(discursos_constituicao, "Constituição", "Constituição, aquele pedaço de papel que não vale nada,")
str_replace_all(discursos_constituicao, "Constituição", "Constituição, aquele pedaço de papel que não vale nada,")
Em vez de substituir, queremos conhecer a posição das ocorrências de “Constituição”. Com str_locate e str_locate_all, respectivamente para a primeira ocorrência em cada documento e todas as ocorrências, obtemos a posição de começo e fim do padrão buscado:
str_locate(discursos_constituicao, "Constituição")
str_locate_all(discursos_constituicao, "Constituição")
Finalmente, notemos que os discursos começam sempre mais ou menos da mesma forma. Vamos retirar os 100 primeiros caracteres de cada discurso para observá-los. Usamos a função str_sub, semelhante à função substr, para extrair um padaço de uma string:
str_sub(discursos, 1, 100)
As posições para extração de exerto podem ser variáveis. Por exemplo, vamos usar “len_discursos” que criamos acima para extrair os 50 últimos caracteres de cada discurso:
str_sub(discursos, (len_discursos - 50), len_discursos)
Note que alguns discursos começam e terminam com espaços. Para nos livrarmos deles (apenas daqueles no começo e fim da string), utilizamos str_trim:
str_trim(discursos)
Infelizmente, não há tempo suficiente para entrarmos neste tutorial em um tema extremamante útil: expressões regulares. Expressões regulares, como podemos deduzir pelo nome, são expressões que nos permite localizar – e, portanto, substituir, extrair, parear, etc – sequências de caracteres com determinadas caraterísticas – por exemplo, “quaisquer caracteres entre parênteses”, ou “qualquer sequência entre espaços que comece com 3 letras e termine com 4 números” (placa de automóvel).
Você pode ler um pouco sobre expressões regulares no R aqui se tiver tempo em sala de aula. Com o uso de expressões regulares, outros dois pares de funções são bastante úteis str_extract, str_extract_all, str_match e str_match_all.
Com a função wordcloud do pacote de mesmo nome, podemos rapidamente visualizar as palavras discursadas tendo o tamanho como função da frequência (vamos limitar a 50 palavras):
library(wordcloud)
wordcloud(discursos, max.words = 50)
Não muito bonita. Voltaremos a fazer nuvem de palavras depois de aprendermos outra maneiras de trabalharmos com texto como dado no R.