Carga_documento <- function(documento){
#Utiliza la función file, con el parámetro r (de "read", leer)
leer_documento <- file(documento, open = "r")
#Aplica la función readLines para leer las líneas del archivo,
#fíjate que el encoding sea UTF-8
texto_lineas <- readLines(leer_documento, encoding = "UTF-8")
#Junta todas las lineas (párrafos) en uno solo
texto_completo <- paste(texto_lineas, collapse = "\n")
#Retiremos los signos de puntuación
texto_sinSignos <- removePunctuation(texto_completo)
#Vamos a cambiar los "\n" que representan los saltos de linea por espacios en blanco
texto_SinSaltos <- str_replace_all(texto_sinSignos, "\n", " ")
#Vamos a eliminar los espacios en blanco múltiples
texto_SinEspacios <- str_replace_all(texto_SinSaltos, "[\\s]+", " ")
}
Total_palabras <- function(columna, tipo){
#tipo: texto con stopwords (c) o texto sin stopwords (s)
tot_Pal <- sum(columna)
if(tipo == "c"){
paste("En esta canción hay", tot_Pal, "palabras")
}else if(tipo == "s"){
paste("En esta canción hay", tot_Pal, "palabras sin stopwords")
}
}
Analisis_Sentimientos <- function(lista_palabras){
#Aplicamos la función indicando la lista de palabras y el idioma,
#creamos un nuevo data frame llamado sentimeintos
sentimientos <- get_nrc_sentiment(lista_palabras, lang="spanish")
#Transponer el dataframe de sentimientos
sentimientos2 <- data.frame(t(sentimientos))
#Sumamos los puntajes de cada uno de los tweets para cada emocion
sentimientos2 <- data.frame(rowSums(sentimientos2))
#Nombramos la columna de puntajes como cuenta
names(sentimientos2)[1] <- "cuenta"
#Dado que las emociones son los nombres de las filas y no una variable
#transformamos el data frame para incluirlas dentro
sentimientos2 <- cbind("sentimiento" = rownames(sentimientos2),
sentimientos2)
#Quitamos el nombre de las filas
rownames(sentimientos2) <- NULL
#Verificamos el data frame
sentimientos2
}
Carga de las letras de las canciones
#Texto A
castillo <- Carga_documento("Castillos.txt")
#Texto B
violetas <- Carga_documento("RamitoVioletas.txt")
#Texto C
muchacho <- Carga_documento("Muchacho.txt")
#Texto D
rodantes <- Carga_documento("PiedrasRodantes.txt")
#Lista de stopwords en español,
#basada en http://snowball.tartarus.org/algorithms/spanish/stop.txt
stopwords_es <- read.csv("https://bitsandbricks.github.io/data/stopwords_es.csv",
stringsAsFactors = FALSE)
Texto A: “Castillos” - Amanda Miguel
División de la canción
#Para dividir la canción en palabras
#Lista ocupada para la función Analisis_Sentimientos
castillo_palabras <- tokenize_words(castillo)
#Obtén la frecuencia de las letras
castillo_tabla <- table(castillo_palabras[[1]])
#Crea un dataframe con la frecuencia de cada una de las plabras
castillo_df <- tibble(palabra = names(castillo_tabla),
frecuencia = as.numeric(castillo_tabla))
#Acomoda el dataframe en orden descendente
castillo_df <- arrange(castillo_df, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(castillo_df$frecuencia, "c")
[1] "En esta canción hay 159 palabras"
#Grafica de las 10 palabras más usadas
castillo_df[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto A",
x = "Palabras", y = "Número de usos")

#Eliminación de las stopwords
castillo_df2 <- castillo_df %>%
anti_join(stopwords_es, by = c("palabra" = "STOPWORD"))
#Acomoda el dataframe en orden descendente
castillo_df2 <- arrange(castillo_df2, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(castillo_df2$frecuencia, "s")
[1] "En esta canción hay 79 palabras sin stopwords"
#Grafica de las 10 palabras más usadas
castillo_df2[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto A sin stopwords",
x = "Palabras", y = "Número de usos")

Analisis de sentimientos
castillo_sent <- Analisis_Sentimientos(castillo_palabras[[1]])
#Se detallarán las 8 emociones con sus puntajes
ggplot(castillo_sent[1:8,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto A \nOcho emociones",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

#Se muestran los puntajes para la valoración positiva y negativa
ggplot(castillo_sent[9:10,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto A \nValoración positiva o negativa",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

Texto B: “Ramito de Violetas” - Mi Banda el Mexicano
División de la canción
#Para dividir la canción en palabras
#Lista ocupada para la función Analisis_Sentimientos
violetas_palabras <- tokenize_words(violetas)
#Obtén la frecuencia de las letras
violetas_tabla <- table(violetas_palabras[[1]])
#Crea un dataframe con la frecuencia de cada una de las plabras
violetas_df <- tibble(palabra = names(violetas_tabla),
frecuencia = as.numeric(violetas_tabla))
#Acomoda el dataframe en orden descendente
violetas_df <- arrange(violetas_df, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(violetas_df$frecuencia, "c")
[1] "En esta canción hay 265 palabras"
#Grafica de las 10 palabras más usadas
violetas_df[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto B",
x = "Palabras", y = "Número de usos")

#Eliminación de las stopwords
violetas_df2 <- violetas_df %>%
anti_join(stopwords_es, by = c("palabra" = "STOPWORD"))
#Acomoda el dataframe en orden descendente
violetas_df2 <- arrange(violetas_df2, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(violetas_df2$frecuencia, "s")
[1] "En esta canción hay 141 palabras sin stopwords"
#Grafica de las 10 palabras más usadas
violetas_df2[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto B sin stopwords",
x = "Palabras", y = "Número de usos")

Analisis de sentimientos
violetas_sent <- Analisis_Sentimientos(violetas_palabras[[1]])
#Se detallarán las 8 emociones con sus puntajes
ggplot(violetas_sent[1:8,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto B \nOcho emociones",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

#Se muestran los puntajes para la valoración positiva y negativa
ggplot(violetas_sent[9:10,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto B \nValoración positiva o negativa",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

Texto C: “El muchacho de los ojos tristes” - Jeanette
División de la canción
#Para dividir la canción en palabras
#Lista ocupada para la función Analisis_Sentimientos
muchacho_palabras <- tokenize_words(muchacho)
#Obtén la frecuencia de las letras
muchacho_tabla <- table(muchacho_palabras[[1]])
#Crea un dataframe con la frecuencia de cada una de las plabras
muchacho_df <- tibble(palabra = names(muchacho_tabla),
frecuencia = as.numeric(muchacho_tabla))
#Acomoda el dataframe en orden descendente
muchacho_df <- arrange(muchacho_df, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(muchacho_df$frecuencia, "c")
[1] "En esta canción hay 209 palabras"
#Grafica de las 10 palabras más usadas
muchacho_df[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto C",
x = "Palabras", y = "Número de usos")

#Eliminación de las stopwords
muchacho_df2 <- muchacho_df %>%
anti_join(stopwords_es, by = c("palabra" = "STOPWORD"))
#Acomoda el dataframe en orden descendente
muchacho_df2 <- arrange(muchacho_df2, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(muchacho_df2$frecuencia, "s")
[1] "En esta canción hay 109 palabras sin stopwords"
#Grafica de las 10 palabras más usadas
muchacho_df2[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto C sin stopwords",
x = "Palabras", y = "Número de usos")

Analisis de sentimientos
muchacho_sent <- Analisis_Sentimientos(muchacho_palabras[[1]])
#Se detallarán las 8 emociones con sus puntajes
ggplot(muchacho_sent[1:8,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto C \nOcho emociones",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

#Se muestran los puntajes para la valoración positiva y negativa
ggplot(muchacho_sent[9:10,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto C \nValoración positiva o negativa",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

Texto D: “Piedras Rodantes” - El Tri
División de la canción
#Para dividir la canción en palabras
#Lista ocupada para la función Analisis_Sentimientos
rodantes_palabras <- tokenize_words(rodantes)
#Obtén la frecuencia de las letras
rodantes_tabla <- table(rodantes_palabras[[1]])
#Crea un dataframe con la frecuencia de cada una de las plabras
rodantes_df <- tibble(palabra = names(rodantes_tabla),
frecuencia = as.numeric(rodantes_tabla))
#Acomoda el dataframe en orden descendente
rodantes_df <- arrange(rodantes_df, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(rodantes_df$frecuencia, "c")
[1] "En esta canción hay 136 palabras"
#Grafica de las 10 palabras más usadas
rodantes_df[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto D",
x = "Palabras", y = "Número de usos")

#Eliminación de las stopwords
rodantes_df2 <- rodantes_df %>%
anti_join(stopwords_es, by = c("palabra" = "STOPWORD"))
#Eliminación de las palabras que empiecen con ^turu
rodantes_df2 <- rodantes_df2 %>% filter(!(str_detect(palabra, "^turu")))
#Acomoda el dataframe en orden descendente
rodantes_df2 <- arrange(rodantes_df2, desc(frecuencia))
#Cantidad total de palabras
Total_palabras(rodantes_df2$frecuencia, "s")
[1] "En esta canción hay 62 palabras sin stopwords"
#Grafica de las 10 palabras más usadas
rodantes_df2[1:10, ] %>%
ggplot(aes(x = reorder(palabra, frecuencia), y = frecuencia)) +
geom_bar(stat = "identity", fill = "#117A65") +
geom_text(aes(hjust = 1.3, label = frecuencia), color = "white") +
coord_flip() +
labs(title = "Diez palabras más frecuentes del texto D sin stopwords",
x = "Palabras", y = "Número de usos")

Analisis de sentimientos
rodantes_sent <- Analisis_Sentimientos(rodantes_palabras[[1]])
#Se detallarán las 8 emociones con sus puntajes
ggplot(rodantes_sent[1:8,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto D \nOcho emociones",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")

#Se muestran los puntajes para la valoración positiva y negativa
ggplot(rodantes_sent[9:10,], aes(x = sentimiento, y = cuenta, fill = sentimiento)) +
geom_bar(stat = "identity") +
labs(title = "Análisis de sentimiento texto D \nValoración positiva o negativa",
x = "Sentimiento", y = "Frecuencia") +
geom_text(aes(label = cuenta), vjust = 1.5, color = "black",
size = 5) +
theme(legend.position = "none")
