En esta oportunidad probaremos 2 maneras para analizar sentimientos, la primera es la que aprendimos en el curso de Técnicas de exploración de datos y la segunda es a partir del paquete “Syuzhet”

1 Análisis usando lo aprendido en el curso “Técnicas de exploración de Datos”

1.1 ¿Qué palabra es más frecuente en IT?

texto_frecuencias %>% 
  top_n(8) %>% 
  ggplot() + 
  aes(x = fct_reorder(Token, n), y = n, fill = Token) + 
  geom_col() +
  labs(x = NULL, y = "Frecuencia", 
       title = "Analisis de texto de la novela It"
       ) +
  theme_minimal() + 
  theme(legend.position = "none") + scale_fill_brewer(palette = "Paired") +
  coord_flip()

1.2 ¿Qué sentimiento predomina en IT?

texto_sentimientos <- texto %>% inner_join(sentimientos, by = c("Token" = "palabra"))

texto_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 IT",
       x = "Sentimientos",
       y = "Frecuencia") +
  theme_bw() + scale_fill_brewer(palette = "Spectral")

1.3 ¿Qué palabras predominan por sentimiento?

contar_palabras1 <- texto %>% 
  inner_join(sentimientos,
             by = c("Token" = "palabra")) %>%
  filter(sentimiento %in% c("tristeza","miedo","negativo","positivo","confianza","ira","premonición","disgusto","asombro","alegría")) %>%
  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() + scale_fill_manual(values = c("green1","violet","orange2","lightgreen","red3","skyblue","black","green4","grey64","purple4"))

1.4 wordcloud de palabras frecuentes

texto_frecuencias2 <- texto_frecuencias %>% filter(n > 150)

wordcloud2(texto_frecuencias2,
           size = 0.3,
           shape = 'triangle-forward')
wordcloud(words = texto_frecuencias2$Token,
          freq  = texto_frecuencias2$n,
          max.words = 100,
          random.order = FALSE,
          min.freq = 2,
          colors = brewer.pal(8, "Dark2"),
          scale = c(2.5, 0.5),
          rot.per = 0.3)

2 Análisis usando el paquete “Syuzhet”

2.1 Barplot de sentimientos

barplot(
  colSums(prop.table(misu1[, 1:8])),
  space = 0.2,
  horiz = FALSE,
  las = 1,
  cex.names = 0.7,
  col = brewer.pal(n = 8, name = "Spectral"),
  main = "Analisis de sentimientos de la novela IT",
  sub = "Emociones",
  ylab = NULL)

2.2 Usando el “wordcloud” de este paquete

nube_emociones_vector <- c(
  paste(texto_por_palabras[misu1$joy> 0], collapse = " "),
  paste(texto_por_palabras[misu1$sadness > 0], collapse = " "),
  paste(texto_por_palabras[misu1$anger > 0], collapse = " "),
  paste(texto_por_palabras[misu1$trust > 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('felicidad', 'tristeza', 'enfado', 'confianza')

set.seed(777)
comparison.cloud(nube_tdm, random.order = FALSE,
                 colors = c("skyblue", "#00CD00", "#FF7F50", "purple"),
                 title.size = 1.5, max.words = 75, scale = c(1.5, 0.5), rot.per = 0.4)

2.3 ¿Cómo avanzan las emociones durante el texto?

2.3.1 Primera parte de la novela

plot(
  syuzhet_vector1, 
  type="l", 
  main="Trayectoria emocional", 
  xlab = "Tiempo de narrativa", 
  ylab= "Valencia emocional"
)

mean(syuzhet_vector1)
## [1] -0.03181231

2.3.2 Segunda parte de la novela

plot(
  syuzhet_vector2, 
  type="l", 
  main="Trayectoria emocional", 
  xlab = "Tiempo de narrativa", 
  ylab= "Valencia emocional"
)

mean(syuzhet_vector2)
## [1] -0.03629088

2.3.3 Tercera parte de la novela

plot(
  syuzhet_vector3, 
  type="l", 
  main="Trayectoria emocional", 
  xlab = "Tiempo de narrativa", 
  ylab= "Valencia emocional"
)

mean(syuzhet_vector3)
## [1] -0.03233296

2.3.4 Cuarta parte de la novela

plot(
  syuzhet_vector4, 
  type="l", 
  main="Trayectoria emocional", 
  xlab = "Tiempo de narrativa", 
  ylab= "Valencia emocional"
)

mean(syuzhet_vector4)
## [1] -0.03532754

2.3.5 Quinta parte de la novela

plot(
  syuzhet_vector5, 
  type="l", 
  main="Trayectoria emocional", 
  xlab = "Tiempo de narrativa", 
  ylab= "Valencia emocional"
)

mean(syuzhet_vector5)
## [1] -0.03192421

2.4 Barplot de sentimientos

barplot(
  sort(colSums(prop.table(misu1[, 1:8]))), 
  horiz = TRUE, 
  cex.names = 0.7, 
  las = 1, 
  main = "Emociones en IT", xlab="Porcentaje",
  col = brewer.pal(n = 8, name = "Spectral")
  )

2.5 Graficando en base al porcentaje de progreso de la obra

plot(poa_list$x, 
     poa_list$z, 
     type="l", 
     col="blue", 
     xlab="Narrative Time", 
     ylab="Emotional Valence")

Se aprecia que la obra empieza con emociones medianamente positivas pero conforme avanza va disminuyendo significativamente para luego aumentar pero sin llegar a ser 1 (positivo) y continua en 0 hasta antes del final de la obra que es donde mas emociones positivas se concentran terminando con emociones por debajo de 0, es decir, emociones negativas

2.6 Graficando de forma muestrada

poa_sample <- seq(1, length(poa_list$x), by=round(length(poa_list$x)/100))
plot(poa_list$x[poa_sample], 
     poa_list$z[poa_sample], 
     type="l", 
     col="blue",
     xlab="Tiempo de narrativa (muestrada)", 
     ylab="Valencia emocional"
     )

Se divide la cantidad de oraciones en 100 muestras, se trazan los puntos muestrados y el resultado de esto es que se construye una linea de 100 puntos en el eje X (sirve para comparar textos con diferentes cantidades de palabras u oraciones)