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")