Introducción

Nos encontramos realizando y refinando un diccionario de emociones, y para probar su capacidad para distinguir vocabulario emocional, vamos a analizar los cuentos de cuatro escritores rioplatenses. Los textos se descargaron de www.ciudadseva.com

Cargamos los paquetes y el diccionario. Le agregamos a este último la variable categórica “cuadrante” para dar color y ayudar ver a golpe de vista las características afectivas de los textos.

El diccionario

library(tidyverse)
library(tidytext)
library(ggwordcloud)

palabras_fase_3 <- read.csv("~/R/lista_de_palabras_fase_manual_2 - hecho.csv", header = TRUE, sep = ",", dec = ".", comment.char = "", strip.white = TRUE, stringsAsFactors = FALSE, encoding="UTF-8") %>% filter(lema != "x") %>% 
  filter(valencia != "x") %>% 
  mutate(valencia = as.numeric(valencia),
         valencia_sd = as.numeric(valencia_sd),
         arousal = as.numeric(arousal),
         arousal_sd = as.numeric(arousal_sd))


palabras_fase_3 <- palabras_fase_3 %>% mutate(cuadrante = case_when(
    valencia <= median(palabras_fase_3$valencia) & arousal >= median(palabras_fase_3$arousal) ~ "V- A+",
    valencia >= median(palabras_fase_3$valencia) & arousal >= median(palabras_fase_3$arousal) ~ "V+ A+",
    valencia <= median(palabras_fase_3$valencia) & arousal <= median(palabras_fase_3$arousal) ~ "V- A-",
    valencia >= median(palabras_fase_3$valencia) & arousal <= median(palabras_fase_3$arousal) ~ "V+ A-"))

palabras_fase_3

Datos

Cargamos cada uno de los textos y hacemos algunas estadísticas descriptivas para familiarizarnos con ellos.

benedetti <- read.csv("~/R/cuentos_de_benedetti.csv", header = TRUE, sep = ",", dec = ".", comment.char = "", strip.white = TRUE, stringsAsFactors = FALSE, encoding="UTF-8") %>% 
  mutate(año = str_replace_all(obra_y_año, "[^0-9]", ""),
         autor = "benedetti") %>%
  select(
        autor,
        año,
    cuento= link,
    párrafo = texto,
    obra = obra_y_año)

onetti <- read.csv("~/R/cuentos_de_onetti.csv", header = TRUE, sep = ",", dec = ".", comment.char = "", strip.white = TRUE, stringsAsFactors = FALSE, encoding="UTF-8") %>% mutate(año = str_replace_all(obra_y_año, "[^0-9]", ""),
         autor = "onetti") %>%
  select(
        autor,
        año,
    cuento= link,
    párrafo = texto,
    obra = obra_y_año)

cortazar <- read.csv("~/R/cuentos_de_cortazar.csv", header = TRUE, sep = ",", dec = ".", comment.char = "", strip.white = TRUE, stringsAsFactors = FALSE, encoding="UTF-8") %>% mutate(año = str_replace_all(libro_y_año, "[^0-9]", ""),
         autor = "cortazar") %>%
  select(
        autor,
        año,
    cuento= link,
    párrafo = texto,
    obra = libro_y_año)

borges <- read.csv("~/R/cuentos_de_borges.csv", header = TRUE, sep = ",", dec = ".", comment.char = "", strip.white = TRUE, stringsAsFactors = FALSE, encoding="UTF-8") %>% mutate(año = str_replace_all(libro_y_año, "[^0-9]", ""),
         autor = "borges") %>%
  select(
        autor,
        año,
    cuento= link,
    párrafo = texto,
    obra = libro_y_año)

rioplatenses <- bind_rows(benedetti, onetti, cortazar, borges)


total_palabras_por_autor <- rioplatenses %>% 
  unnest_tokens(word, párrafo, to_lower = T) %>% count(autor) %>% rename(total_palabras = n)

rioplatenses %>% count(cuento, autor) %>% arrange(desc(autor)) %>% 
  group_by(autor) %>% 
  summarise(cuentos = n(),
            párrafos_promedio = round(mean(n), 0)) %>%
  inner_join(total_palabras_por_autor, by = "autor") %>% 
  ggplot(aes(autor, total_palabras)) + 
  geom_col() + 
  coord_flip() + 
  geom_text(aes(label = paste(as.character(cuentos), "cuentos, de", as.character(párrafos_promedio), "párrafos c/u (media),", as.character(total_palabras), "palabras en total"), 
    hjust = 1.01), size = 3) + theme_classic() + 
  labs(title = "Cuentos de cuatro autores rioplatenses", 
       subtitle = "Colección digital de CiudadSeva.com",
       x = "",
       y = "palabras en la totalidad de los cuentos") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5)) +
  theme(legend.position = "none") 

Análisis cuantitativos

Se explora uso del vocabulario emocional en estos autores Se eliminan algunas palabras que generan problemas: “bondad”, “bien”, “soledad”, “santidad”, “gusto”, “querer” y “mal”.

Espacio dimensional: puntos.

# Después de revisión manual, decido sacar algunas palabras que generan ruido
palabras_fase_3 <- palabras_fase_3 %>% filter(!lema %in% c("bondad",
                                                           "bien",
                                                           "soledad",
                                                           "santidad",
                                                           "gusto",
                                                           "querer",
                                                           "mal"
                                                           ))

emociones_rioplatenses <- rioplatenses %>% 
  unnest_tokens(word, párrafo, to_lower = T) %>%
  inner_join(palabras_fase_3) %>% 
  inner_join(total_palabras_por_autor, by = "autor") %>%
  count(lema, autor, valencia, arousal, cuadrante, total_palabras) %>% 
  mutate(prop = n/total_palabras) %>% arrange(desc(prop))

emociones_rioplatenses %>%
  filter(n > 10) %>%
  ggplot(aes(valencia, arousal, size = prop, color = cuadrante)) + 
  geom_point() + 
  theme_minimal() + 
  facet_wrap(~autor) + 
  theme(legend.position = "none") + 
  labs(title = "Vocabulario emocional de escritores rioplatenses", subtitle = "Palabras con al menos 10 menciones") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5)) 

Espacio dimensional: barras.

polaridad_de_voc <- emociones_rioplatenses %>% group_by(autor) %>% count(cuadrante) 

polaridad_de_voc %>% ggplot(aes(cuadrante, n, fill = cuadrante)) + geom_col() + coord_flip() + facet_wrap(~autor) + theme_minimal() +
  theme(legend.position = "none") + 
  labs(title = "Valencia y arousal de los términos") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5)) 

Prueba de hipótesis

¿Hay diferencias de valencia?

autores_rioplatenses <- rioplatenses %>% 
  unnest_tokens(word, párrafo, to_lower = T) %>%
  inner_join(palabras_fase_3)


rioplatenses %>% 
  unnest_tokens(word, párrafo, to_lower = T) %>%
  inner_join(palabras_fase_3) %>% ggplot(aes(autor, valencia)) + geom_boxplot() + theme_minimal() + labs(title = "Valencia del vocabulario emocional utilizado", x = paste("* La prueba Kruskal-Wallis tuvo un p-valor de =", as.character(kruskal.test(valencia ~ autor, data = autores_rioplatenses))[3])) +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5)) 

"Comparación por pares"
## [1] "Comparación por pares"
pairwise.wilcox.test(autores_rioplatenses$valencia, autores_rioplatenses$autor,
                 p.adjust.method = "BH")
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  autores_rioplatenses$valencia and autores_rioplatenses$autor 
## 
##          benedetti borges  cortazar
## borges   2.9e-10   -       -       
## cortazar 2.9e-10   0.85    -       
## onetti   0.19      9.5e-07 4.4e-07 
## 
## P value adjustment method: BH

¿Hay diferencias de arousal?

rioplatenses %>% 
  unnest_tokens(word, párrafo, to_lower = T) %>%
  inner_join(palabras_fase_3) %>% ggplot(aes(autor, arousal)) + geom_boxplot() + theme_minimal() + labs(title = "Arousal del vocabulario emocional utilizado", x = paste("* La prueba Kruskal-Wallis tuvo un p-valor de =", as.character(kruskal.test(arousal ~ autor, data = autores_rioplatenses))[3])) +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5))

"Comparación por pares"
## [1] "Comparación por pares"
pairwise.wilcox.test(autores_rioplatenses$arousal, autores_rioplatenses$autor,
                 p.adjust.method = "BH")
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  autores_rioplatenses$arousal and autores_rioplatenses$autor 
## 
##          benedetti borges cortazar
## borges   0.039     -      -       
## cortazar 6.7e-06   0.049  -       
## onetti   0.013     0.770  0.052   
## 
## P value adjustment method: BH

¿Cómo construye cada autor la afectividad en sus cuentos?

Color=valencia

set.seed(1234)

emociones_rioplatenses %>%
  filter(n > 20) %>%
ggplot(aes(label = lema, 
           size = prop, 
           color = valencia)) + 
  geom_text_wordcloud(area_corr = TRUE, shape = "circle") + 
  scale_size_area(max_size = 9.5) +
      theme_minimal() + labs(x= "") + labs(title = "Vocabulario emocional de cada autor", x = "Palabras con al menos 20 menciones. Color según la valencia del término") + facet_wrap(~autor)

Color=arousal

emociones_rioplatenses %>%
  filter(n > 20) %>%
ggplot(aes(label = lema, 
           size = prop, 
           color = arousal)) + 
  geom_text_wordcloud(area_corr = TRUE, shape = "circle") + 
  scale_size_area(max_size = 9.5) +
      theme_minimal() + labs(x= "") + labs(title = "Vocabulario emocional de cada autor", x = "Palabras con al menos 20 menciones. Color según la activación del término") + facet_wrap(~autor)

Vocabulario frecuente por autor

Vocabulario de Benedetti

emociones_rioplatenses %>%
  filter(n > 10, autor == "benedetti") %>%
  ggplot(aes(valencia, arousal, size = prop, color = cuadrante, label = lema)) + geom_text(check_overlap = TRUE) + theme_classic() + theme(legend.position = "none") + labs(title = "Vocabulario emocional de Benedetti", x = "Palabras con al menos 5 menciones") +
  theme(plot.title = element_text(hjust = 0.5))

Vocabulario de Borges

emociones_rioplatenses %>%
  filter(n > 10, autor == "borges") %>%
  ggplot(aes(valencia, arousal, size = prop, color = cuadrante, label = lema)) + geom_text(check_overlap = TRUE) + theme_classic() + theme(legend.position = "none") + labs(title = "Vocabulario emocional de Borges", x = "Palabras con al menos 5 menciones") +
  theme(plot.title = element_text(hjust = 0.5))

Vocabulario de Cortazar

emociones_rioplatenses %>%
  filter(n > 10, autor == "cortazar") %>%
  ggplot(aes(valencia, arousal, size = prop, color = cuadrante, label = lema)) + geom_text(check_overlap = TRUE) + theme_classic() + theme(legend.position = "none") + labs(title = "Vocabulario emocional de Cortazar", x = "Palabras con al menos 5 menciones") +
  theme(plot.title = element_text(hjust = 0.5))

Vocabulario de Onetti

emociones_rioplatenses %>%
  filter(n > 10, autor == "onetti") %>%
  ggplot(aes(valencia, arousal, size = prop, color = cuadrante, label = lema)) + geom_text(check_overlap = TRUE) + theme_classic() + theme(legend.position = "none") + labs(title = "Vocabulario emocional de Onetti", x = "Palabras con al menos 5 menciones") +
  theme(plot.title = element_text(hjust = 0.5))