Análise de texto no R - pacote stringr

Fonte de Textos

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")

Funcionalidades do stringr

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.

Nuvem de Palavras

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.