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.
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
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")
Se explora uso del vocabulario emocional en estos autores Se eliminan algunas palabras que generan problemas: “bondad”, “bien”, “soledad”, “santidad”, “gusto”, “querer” y “mal”.
# 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))
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))
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
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
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)
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)
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))
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))
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))
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))