1 Presentación de resultados obtenidos al utilizar la minería de textos para analizar los sentimientos en la novela “El Silencio de los inocentes”

En esta ocasión tengo el honor de presentar el reporte de text mining usados para analizar una novela. Con el uso de dos paquetes diferentes para poder comparar qué es lo que nos comunican cada uno de estos.

1.1 Método usado en el curso de TED

A continuación se presenta el análisis realizado en el curso de ´Técnicas de Exploración de Datos´

1.1.1 ¿Cuáles fueron las palabras más repetidas del libro?

A continuación el top de las 10 palabras más repetidas del libro

libro_frecuencias %>% 
  top_n(10) %>% 
  ggplot() + 
  aes(x = fct_reorder(Token, n), y = n, fill = Token) + 
  geom_col() +
  labs(x = NULL, y = "Frecuencia", 
       title = "Palabras más repetidas en 'El Silencio de los Inocentes'" ) +
  theme_minimal() + scale_fill_brewer(palette = "Set3") +
  theme(legend.position = "none") +
  coord_flip()
## Selecting by n

1.1.2 ¿Cuáles fueron los sentimientos más predominantes en el libro?

En el libro en general, estos fueron los sentimientos más predominantes:

sentimientos <- read.delim("sentimientos_2.txt")
sentimientos <- as.tibble(sentimientos)
sentimientos <- distinct(sentimientos)


libro_sentimientos <- libro %>% inner_join(sentimientos, by = c("Token" = "palabra"))

libro_sentimientos %>% dplyr::count(sentimiento) %>% 
  ggplot() + aes(x = fct_reorder(sentimiento, n),
                 y = n,
                 fill = sentimiento) + 
  geom_col(show.legend = F) + coord_flip() +
  labs(title ="Análisis de sentimientos de la novela 'El Silencio de los Inocentes'",
       x = "Sentimientos",
       y = "Frecuencia") +
  theme_bw() + scale_fill_brewer(palette = "Set3")

1.1.3 Palabras asociadas a los sentimientos del libro

contar_palabras1 <- libro %>% 
  inner_join(sentimientos,
             by = c("Token" = "palabra")) %>%
  filter(sentimiento %in% c("positivo","negativo","confianza","miedo","premonición","tristeza")) %>%
  dplyr::count(Token, sentimiento) %>% 
  group_by(sentimiento) %>% 
  top_n(5, n)

ggplot(contar_palabras1) + 
  aes(x = fct_reorder(Token, n),
      y = n,
      fill = sentimiento) +
  geom_col(show.legend = FALSE) +
  facet_wrap( ~ sentimiento, scales = "free", ncol = 3) +
  labs(title = "Gráfico de palabras por sentimiento",
       x = "Palabras", y = "Frecuencia") + 
  theme_bw() +
  coord_flip() 

1.1.4 Wordcloud de las palabras más repetidas

libro_frecuencias2 <- libro_frecuencias %>% filter(n > 35)
wordcloud2(libro_frecuencias2,
           size = 0.5,
           shape = 'pentagon')
wordcloud(words = libro_frecuencias2$Token,
          freq  = libro_frecuencias2$n,
          max.words = 110,
          random.order = FALSE,
          min.freq = 2,
          colors = brewer.pal(8, "Dark2"),
          scale = c(5, 0.1),
          rot.per = 0.3)

1.2 Método usando el paquete ‘Syuzhet’

A continuación, se uso también la minería de textos para analizar los sentimientos del mismo libro ‘El Silencio de los Inocentes’, pero esta vez se usó el paquete ‘Syuzhet’ con el diccionario de sentimientos NRC y analizar los resultados:

1.2.1 ¿Qué sentimientos predominan a través del libro?

barplot(
  colSums(prop.table(sentimientos_df2[, 2:9])),
  space = 0.2,
  horiz = FALSE,
  las = 1,
  cex.names = 0.7,
  col = brewer.pal(n = 8, name = "Set3"),
  main = "Sentimientos en 'El Silencio de los Inocentes'",
  xlab="emociones", ylab = NULL)

1.2.2 FRECUENCIA DE PALABRAS DE SENTIMIENTOS MÁS PREDOMINANTES

1.2.2.1 CONFIANZA

palabras_confianza <- libro_palabras[sentimientos_df2$trust> 0]
palabras_confianza_orden <- sort(table(unlist(palabras_confianza)), decreasing = TRUE)
head(palabras_confianza_orden, n = 12)
## 
##  cabeza    cara hallaba   mujer persona  agente cristal   fondo    hora  muerte 
##      10       7       6       5       5       4       4       4       4       4 
##   noche    peso 
##       4       4

1.2.2.2 MIEDO

palabras_miedo <- libro_palabras[sentimientos_df2$fear> 0]
palabras_miedo_orden <- sort(table(unlist(palabras_miedo)), decreasing = TRUE)
head(palabras_miedo_orden, n = 12)
## 
##        mundo      hallaba         boca       cabeza      cadáver         caso 
##            7            6            5            5            5            5 
##         cara        pared      policía psiquiátrico    vestíbulo         alas 
##            4            4            4            4            4            3

1.2.2.3 TRISTEZA

palabras_tristeza <- libro_palabras[sentimientos_df2$sadness> 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n = 12)
## 
##      boca    cabeza   cadáver      cara   policía vestíbulo     bolsa     brazo 
##         4         4         4         4         4         4         3         3 
##      caso   cuidado      edad  espaldas 
##         3         3         3         3

1.2.3 Wordcloud

nube_emociones_vector <- c(
  paste(libro_palabras[sentimientos_df2$sadness> 0], collapse = " "),
  paste(libro_palabras[sentimientos_df2$trust > 0], collapse = " "),
  paste(libro_palabras[sentimientos_df2$fear > 0], collapse = " "),
  paste(libro_palabras[sentimientos_df2$anticipation > 0], collapse = " "))
nube_emociones_vector <- iconv(nube_emociones_vector, "latin1", "UTF-8")
nube_corpus <- Corpus(VectorSource(nube_emociones_vector))
nube_tdm <- TermDocumentMatrix(nube_corpus)
nube_tdm <- as.matrix(nube_tdm)
colnames(nube_tdm) <- c('tristeza', 'confianza', 'miedo', 'premonición')
set.seed(757) # puede ser cualquier número
comparison.cloud(nube_tdm, random.order = FALSE,
                 colors = c("green", "red", "orange", "blue"),
                 title.size = 1, max.words = 100, scale = c(1, 2), rot.per = 0.5)

1.2.4 Syuzhet Plot

sentimientos_valencia <- (sentimientos_df2$negative *-1) + sentimientos_df2$positive
simple_plot(sentimientos_valencia)