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.
A continuación se presenta el análisis realizado en el curso de ´Técnicas de Exploración de Datos´
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
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")
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()
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)
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:
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)
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
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
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
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)
sentimientos_valencia <- (sentimientos_df2$negative *-1) + sentimientos_df2$positive
simple_plot(sentimientos_valencia)