Exercícios

Análise de Sentimentos n'Os Maias

library(tidyverse)   # instala ggplot2, dplyr, tidyr, readr, purrr, etc.
library(tidytext)    # para análise de textos
library(stringr)     # para manipulação de strings

Este exemplo é adaptado do livro “Tidy Text Mining with R” de Julia Silge e David Robinson.

No nosso caso vamos analisar o texto d'Os Maias de Eça de Queiroz.

os_maias <- readLines("data/senti-pt/eça.queiroz.os.maias.txt")

Conversão do texto em data frame

Vamos converter o ficheiro com o texto original numa data frame, onde cada palavra ocupa uma linha. Para além disso guardamos a que parágrafo e capítulo cada palavra pertence.

os_maias %>% 
  dplyr::data_frame(text=.) %>% 
  dplyr::mutate(paragraph=row_number()) %>%                  # adiciona número parágrafo
  dplyr::mutate(chapter=                                     # adiciona capítulo
    cumsum(str_detect(text, regex("^capítulo [\\divxlcd]", ignore_case = TRUE)))) %>% 
  dplyr::mutate(chapter=as.factor(chapter)) %>%              # capítulo é um valor discreto
  tidytext::unnest_tokens(input=text, output=word, token="words") %>% 
  dplyr::filter(!str_detect(word, "[\\d]+")) %>%             # remove números
  dplyr::mutate(nth_word=row_number()) %>%                   # adiciona numero da palavra
  dplyr::select(nth_word, paragraph, chapter, word) -> df    # reorganiza colunas

df[470:490,]
# A tibble: 21 x 4
   nth_word paragraph chapter        word
      <int>     <int>  <fctr>       <chr>
1       470         6       1        essa
2       471         6       1       gente
3       472         6       1      estava
4       473         6       1 atrapalhada
5       474         7       1       ainda
6       475         7       1         tem
7       476         7       1          um
8       477         7       1      pedaço
9       478         7       1          de
10      479         7       1         pão
# ... with 11 more rows

Remoção de stopwords

As preposições e determinantes, entre outras palavras, são normalmente neutras e podemos retirá-las. Elas costumam chamar-se stopwords.

readLines("data/senti-pt/stopwords_pt_large.txt", encoding="UTF-8") %>% 
  data_frame(word=.) -> stopwords_pt
stopwords_pt
# A tibble: 416 x 1
      word
     <chr>
1        a
2        à
3    adeus
4    agora
5       aí
6    ainda
7     além
8     algo
9  algumas
10  alguns
# ... with 406 more rows

Trajectória sentimental d'Os Maias

Vejamos como decorrem os 18 capítulos do romance.

sentiments_paragraph %>% 
  ggplot(aes(paragraph, overall_sentiment, fill=chapter)) + theme_bw() +
    geom_bar(stat = "identity", show.legend = FALSE) +
    facet_wrap(~chapter, ncol=3, scales="free_x")

Trajectória sentimental d'Os Maias

plot of chunk unnamed-chunk-15

Trajectória sentimental d'Os Maias

E podemos fazer o mesmo para cada capítulo (calculando o sentimento médio por parágrafo):

sentiments_paragraph %>% 
  summarise(chapter_sentiment = mean(overall_sentiment)) %>% 
  ggplot(aes(chapter, chapter_sentiment)) + theme_bw() +
    geom_bar(stat = "identity", show.legend = FALSE) +
    xlab("capítulos") + ylab("sentimento médio")

No capítulo 4, Carlos da Maia forma-se em Medicina e viaja pela Europa. Segundo a análise é o capítulo mais positivo. O capítulo 17 é onde se descobre o segredo trágico da relação entre Carlos e Maria. Este é, sem surpresas, o capítulo mais negativo da obra.

plot of chunk unnamed-chunk-17