Neste caderno discutiremos análise de léxico de forma comparativa.
Ele foi produzido de forma a auxiliar colegas que atuam na área de Linguística do Corpus e Linguística Sistêmico Funcional, como forma de utilizar R em suas pesquisas. Ele é parte do meu projeto financiado pelo CNPq e busca tornar ferramentas de corpus e análise de redes acessíveis.
É baseado no livro:
Silge, Julia, and David Robinson. 2017. Text Mining with R: A Tidy Approach. First edition. Beijing/Boston: O’Reilly.
Algumas modificações foram feitas de forma a:
- Possibilitar o uso de ferramentas em português
- Facilitar a navegação pelo público a que se destina.
Este documento é baseado no uso do pacote tidyr. Em outra ocasião, este mesmo processo de pesquisa será realizado com outro pacote e código.
Por favor, me mande um email, caso precisar de ajuda ou para algum contato de pesquisa. O Script com a função final se encontra no rodapé desta página.
Comparando as obras
Neste tutorial utilizaremos as obras de Eça de Queiros diponíveis no Projeto Gutemberg de forma a criar uma comparação entre as diferentes palavras presentes em sua obra.
Carregando pacotes
Para realizar este trabalho, precisamos carregar alguns pacotes principais, entre eles estão, aqui já com o seu output:
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidytext)
library(ggplot2)
library(gutenbergr)
- Os pacotes library(dplyr) e library(tidytext) sõo usados para manipulação de textos
- O pacote library(ggplot2) para visualização
- O pacote library(gutenbergr) para baixar os dados do Projeto Gutemberg
O comando a seguir fará o download dos livros que
eca.bruto <- gutenberg_download(c(40409, 31971, 17515, 42942,16384, 23145),
meta_fields = "title")
## Determining mirror for Project Gutenberg from http://www.gutenberg.org/robot/harvest
## Using mirror http://aleph.gutenberg.org
eca.livros <- eca.bruto %>%
mutate(text=iconv(text, from = "latin1", to = "UTF-8"))
Organização
Os comandos a seguir tem função de organizar as palavras no arquivo a partir de alguns critérios que podem ajudar no levantamento das palavras. Entre estes critérios estão: – Colocar uma palavra por linha: o comando unnest_tokens(word, text) separa uma palavra por linha, a parrit da coluna text que contém as linhas de texto – O comando count(title, word, sort = TRUE) conta as palavras em cada livro, organizando-as – O comando ungroup() separa as palavras por linha
eca.p.1 <- eca.livros %>%
unnest_tokens(word, text) %>%
count(title, word, sort = TRUE) %>%
ungroup()
O comando a seguir cria uma contagem geral de palavras por título, para que tenhamos uma ideia da dimensão
eca.total.p <- eca.p.1 %>%
group_by(title) %>%
summarize(total = sum(n))
Agora, nós vamos agregar o número de palavras à tabela geral. De forma a termos uma lista de palavras.
eca.palavras <- left_join(eca.p.1, eca.total.p)
## Joining, by = "title"
Visualização
Agora, vamos realizar uma visualização dessas palavras. O Pacote ggplot nos ajudará
ggplot(eca.palavras, aes(n/total, fill = title)) +
geom_histogram(show.legend = FALSE) +
xlim(NA, 0.0009) +
facet_wrap(~title, ncol = 2, scales = "free_y")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 707 rows containing non-finite values (stat_bin).
## Warning: Removed 6 rows containing missing values (geom_bar).
Raquenado as palavras
Os gráficos acima comparam as palavras em seu modo absoluto. Seria interessante que estabelecêssemos um ranqueamento estre essas palavras. Isso nos ajudaria a separar as palavras meramente gramaticais daquelas que podem trazer alguma reflexão sobre o conteúdo.
A Formula a sefuis nos ajurará, cauculando sua frequência relativa e atribuindo um valor mais baixo no ranqueamento às palavras mais frequentes
eca.palavras.ranqueadas <- eca.palavras %>%
group_by(title) %>%
mutate(rank = row_number(),
`term frequency` = n/total)
Agora vamos visualizar essas palavras ranqueadas. Usando o ggplot novamente
eca.palavras.ranqueadas %>%
ggplot(aes(rank, `term frequency`, color = title)) +
geom_line(size = 1.1, alpha = 0.8, show.legend = TRUE) +
scale_x_log10() +
scale_y_log10()
Agora vamos calcular a regrressão dessas palavras. Isso nos ajudará a saber se, dentro das repetições que vemos, tais médias são esperadas ou não.
rank_subset <- eca.palavras.ranqueadas %>%
filter(rank < 500,
rank > 10)
lm(log10(`term frequency`) ~ log10(rank), data = rank_subset)
##
## Call:
## lm(formula = log10(`term frequency`) ~ log10(rank), data = rank_subset)
##
## Coefficients:
## (Intercept) log10(rank)
## -0.966 -1.004
Esses resultados são agregados ao nosso léxico. Veja o gráfico.
eca.palavras.ranqueadas %>%
ggplot(aes(rank, `term frequency`, color = title)) +
geom_abline(intercept = -0.966, slope = -1.0004, color = "black", linetype = 1) +
geom_line(size = 1.1, alpha = 0.9, show.legend = TRUE) +
scale_x_log10() +
scale_y_log10()
A linha preta nos dá essa normalidade. Observamos que poucas palavras estão acima ou abaixo dela, com vrariações em cada obra.
Feito isso, vamos calcular a importância que cada uma dessas palavas possuem em nossos textos, para depois viauslizá-la.
eca.palavras.imp <- eca.palavras %>%
bind_tf_idf(word, title, n)
agora o gráfico, considerando as 10 palavras mais importantes:
eca.palavras.imp %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word)))) %>%
group_by(title) %>%
top_n(10) %>%
ungroup %>%
ggplot(aes(word, tf_idf, fill = title)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~title, ncol = 2, scales = "free") +
coord_flip()
## Selecting by tf_idf
Downloads
Comparando Léxico - Scripts
Comparando Léxico-PDF