title: “Taller_2_MinText” author: “Esteban Babativa” date: ‘2023-10-19’ output: html_document

options(warn=-1)
# Vamos a cargar las librerias necesarias
library(pdftools)
## Using poppler version 23.08.0
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(stopwords)
library(tidytext)
library(stringi)
library(stringr)
library(ggplot2)
library(scales)
library(tidyr)
library(widyr)
library(ggraph)
library(igraph)
## 
## Attaching package: 'igraph'
## The following object is masked from 'package:tidyr':
## 
##     crossing
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(quanteda)
## Package version: 3.3.1
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.
library(topicmodels)
library(lattice)
library(robustbase)
library(cvTools)
library(syuzhet)
## 
## Attaching package: 'syuzhet'
## The following object is masked from 'package:scales':
## 
##     rescale
library(stringr)
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following objects are masked from 'package:quanteda':
## 
##     meta, meta<-
## The following object is masked from 'package:ggplot2':
## 
##     annotate
## 
## Attaching package: 'tm'
## The following object is masked from 'package:quanteda':
## 
##     stopwords
## The following object is masked from 'package:stopwords':
## 
##     stopwords
library(wordcloud)
## Loading required package: RColorBrewer
library(ggplot2)
library(readr)
## 
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
## 
##     col_factor
# 2. Importando datos

url <- "https://www.gutenberg.org/files/58221/58221-0.txt"
download.file(url,destfile = "pg58221.txt")
read_lines("pg58221.txt") %>%
  head(20)
##  [1] "The Project Gutenberg EBook of La Odisea, by Homer"                               
##  [2] ""                                                                                 
##  [3] "\n"                                                                               
##  [4] ""                                                                                 
##  [5] "\nThis eBook is for the use of anyone anywhere in the United States and most"     
##  [6] ""                                                                                 
##  [7] "\nother parts of the world at no cost and with almost no restrictions"            
##  [8] ""                                                                                 
##  [9] "\nwhatsoever.  You may copy it, give it away or re-use it under the terms of"     
## [10] ""                                                                                 
## [11] "\nthe Project Gutenberg License included with this eBook or online at"            
## [12] ""                                                                                 
## [13] "\nwww.gutenberg.org.  If you are not located in the United States, you'll have"   
## [14] ""                                                                                 
## [15] "\nto check the laws of the country where you are located before using this ebook."
## [16] ""                                                                                 
## [17] "\n"                                                                               
## [18] ""                                                                                 
## [19] "\nTitle: La Odisea"                                                               
## [20] ""
file.show("pg58221.txt")
# revisando el documento
libro<-read_lines("pg58221.txt")
# Análisis Inicial

total_lineas <- length(libro)
cat("El número de líneas que contiene el texto son:", total_lineas ," líneas  \n")
## El número de líneas que contiene el texto son: 36652  líneas
num_palabras <- sum(sapply(libro, function(x) length(unlist(strsplit(as.character(x), "\\s+")))))
cat("El numero de palabras que contiene el texto son: ", num_palabras, "palabras.")
## El numero de palabras que contiene el texto son:  194317 palabras.
coleccion<- libro %>%
  VectorSource()%>%
  Corpus()

wordcloud(coleccion,
          min.freq = 5,
          max.words = num_palabras*0.1,
          random.order = FALSE,
          colors = brewer.pal(name = "Dark2", n=8))

# 5.Frecuencia de palabras
palabras<- coleccion%>%
  TermDocumentMatrix()%>%
  as.matrix()%>%
  rowSums()%>%
  sort(decreasing = T)

palabras%>%
  head(50)
##            que            los            las            con            por 
##           5462           3780           1717           1703           1497 
##            del         ulises           para            una            sus 
##           1232            957            884            776            555 
##           como        ulises,         cuando       telémaco           hijo 
##            519            476            455            442            427 
##           pues            así          todos            más            les 
##            420            406            394            385            358 
##           pero        después           dice            fué        júpiter 
##            312            287            281            272            268 
##            tan            sin  pretendientes         porque            muy 
##            262            254            252            250            250 
##            nos        palacio           esta           casa           gran 
##            244            240            229            228            225 
##          entre       penélope          había           cual          padre 
##            223            221            212            210            206 
##          donde      telémaco,           hija          quien            the 
##            198            196            195            192            188 
## pretendientes,        minerva          ánimo        hombres            mas 
##            185            183            183            180            178
frecuencias <- data.frame(
  palabra=names(palabras),
  frecuencia=palabras
)

#Visualizacion de top 10 palabras:
frecuencias[1:20,]%>%
  ggplot()+
  aes(frecuencia, y=reorder(palabra, frecuencia))+
  geom_bar(stat='identity', color="white", fill="blue")+
  geom_text(aes(label=frecuencia, hjust=1.5), color="white")+
  labs(
    x=NULL,
    y=" 20 Palabras mas usadas en la obra"
  )

# limpieza inicial del texto 
total_lineas <- length(libro)
linea_empieza <- 921
linea_final <- 25724
texto_limpio <- libro[linea_empieza:linea_final]
texto_limpio <- texto_limpio %>% 
  str_replace_all(., "[[:cntrl:]]", " ") %>%
  str_to_lower() %>%
  removePunctuation() %>%
  str_replace_all(., "-", " ")

texto_limpio <- removeWords(texto_limpio, words = stopwords("spanish"))

# Eliminar líneas vacías y líneas que solo contienen espacios en blanco
texto_limpio <- texto_limpio %>%
  str_remove_all("^\n+$") %>%
  str_remove_all("^\\s*$")

texto_limpio <- stripWhitespace(texto_limpio)
texto_limpio <- texto_limpio[texto_limpio != ""]

# Ver las 5 primeras líneas
head(texto_limpio, n = 5)
## [1] " canto primero"                                          
## [2] " concilio diosesexhortación minerva á telémaco"          
## [3] " 1 háblame musa aquel varón multiforme ingenio "         
## [4] " después destruir sacra ciudad troya anduvo peregrinando"
## [5] " larguísimo tiempo vió poblaciones conoció costumbres"
# Ver las 5 últimas líneas
tail(texto_limpio, n = 5)
## [1] " 545 así habló minerva ulises alegre ánimo cumplió "  
## [2] " orden luego hizo juraran paz entrambas partes propia"
## [3] " palas minerva hija júpiter lleva égida tomado"       
## [4] " aspecto voz méntor"                                  
## [5] " fin"
total_lineas <- length(texto_limpio)
cat("El número de líneas que contiene el texto despues de una primera limpieza  son:", total_lineas ," líneas  \n")
## El número de líneas que contiene el texto despues de una primera limpieza  son: 10853  líneas
num_palabras1 <- sum(sapply(texto_limpio, function(x) length(unlist(strsplit(as.character(x), "\\s+")))))
cat("El numero de palabras que contiene el texto despues de la primera limpieza  son: ", num_palabras, "palabras.")
## El numero de palabras que contiene el texto despues de la primera limpieza  son:  194317 palabras.
coleccion<- texto_limpio %>%
  VectorSource()%>%
  Corpus()

wordcloud(coleccion,
          min.freq = 5,
          max.words = num_palabras1*0.1,
          random.order = FALSE,
          colors = brewer.pal(name = "Dark2", n=8))

# 2da limpieza del texto
a_retirar<- c("â€","â€","mã","â¡","mã¡s","â¿","quã©","â¿quã©","â€pues","â€â¡",
              "usted", "don", "tal", "asi","así", "sino", "ser",
              "mismo","pues","dijo","vex", "pues","ojos","fue","alli","tan","mas","fué","dé","don","fui","vi","sé","á","é","ea","oh","oí","ire","fuí","ahí")
# Remover caracteres especiales y limpiar el texto
texto_limpio <- gsub("[^a-zA-ZáéíóúüñÁÉÍÓÚÜÑ\\s]", " ", texto_limpio)
texto_limpio<- removeWords(texto_limpio, words = a_retirar)

num_palabras2 <- sum(sapply(texto_limpio, function(x) length(unlist(strsplit(as.character(x), "\\s+")))))
cat("El numero de palabras que contiene el texto despues de la segunda limpieza  son: ", num_palabras2, "palabras.")
## El numero de palabras que contiene el texto despues de la segunda limpieza  son:  69402 palabras.
coleccion<- texto_limpio %>%
  VectorSource()%>%
  Corpus()

wordcloud(coleccion,
          min.freq = 5,
          max.words = num_palabras2*0.1,
          random.order = FALSE,
          colors = brewer.pal(name = "Dark2", n=8))

#Frecuencia de palabras
palabras1<- coleccion%>%
  TermDocumentMatrix()%>%
  as.matrix()%>%
  rowSums()%>%
  sort(decreasing = T)

palabras1%>%
  head(50)
##        ulises          casa      telémaco       palacio       hombres 
##           678           296           284           279           274 
##        tierra      palabras        dioses pretendientes          hijo 
##           259           249           241           239           238 
##       júpiter       después         padre          gran         ánimo 
##           232           223           223           210           207 
##    compañeros           mar      entonces       divinal          nave 
##           189           183           182           175           175 
##       minerva       corazón          bien         ahora          vino 
##           173           165           162           161           155 
##         habló        patria          allí        muerte          hija 
##           151           146           142           138           135 
##      mientras         cosas         manos        aunque          dios 
##           135           129           128           122           122 
##      penélope        ciudad        suerte       huésped           fin 
##           122           119           118           116           115 
##   respondióle        hombre         madre        pronto        manera 
##           111           109           107           102           101 
##          modo         junto         ponto          mano           sol 
##           101           100            94            93            92
frecuencias1 <- data.frame(
  palabra=names(palabras1),
  frecuencia1=palabras1
)

#Visualizacion de top 10 palabras:
frecuencias1[1:20,]%>%
  ggplot()+
  aes(frecuencia1, y=reorder(palabra, frecuencia1))+
  geom_bar(stat='identity', color="white", fill="red")+
  geom_text(aes(label=frecuencia1, hjust=1.5), color="white")+
  labs(
    x=NULL,
    y=" 20 Palabras mas usadas en la obra"
  )

# Función para crear Bigramas
generar_bigramas <- function(texto){
  tokens <- tokens(texto, what = "word", remove_punct = TRUE, remove_numbers = TRUE, remove_symbols = TRUE)
  bigramas_tokens <- tokens_ngrams(tokens, n = 2)
  bigramas_df <- dfm(bigramas_tokens)
  bigramas_df <- dfm_sort(bigramas_df, decreasing = TRUE)
  
  return(head(bigramas_df, 10))
}
# Aseguramos que texto_limpio1 sea un único string
texto_limpio <- paste(texto_limpio, collapse = " ")

# Generar bigramas
bigramas_df1 <- generar_bigramas(texto_limpio)

# Convertir el objeto dfm a un dataframe
bigramas_df1 <- tidy(bigramas_df1)
# Transformar el dataframe para tener dos columnas: "bigrama" y "n"

# Renombrar las columnas
bigramas_df1 <- bigramas_df1 %>%
  rename(bigrama = term, n = count)
bigramas_df1 <- select(bigramas_df1, -document)
# Separando la columna de bigramas en dos columnas
bigramas_df1 <- bigramas_df1 %>%
  filter(str_count(bigrama, "_") == 1) %>%
  separate(bigrama, into = c("uno", "dos"), sep = "_")
# Filtrando bigramas con frecuencia mayor o igual a 9
bigramas_filtrados1 <- bigramas_df1 %>%
  filter(n >= 10)
# Limitar el número de nodos a mostrar
max_nodos <- 20  # Establece el número máximo de nodos que deseas mostrar
nodos_a_mostrar <- bigramas_filtrados1 %>%
  slice_max(n, n = max_nodos)
# Creando la red semántica
set.seed(123)

g <- graph_from_data_frame(bigramas_filtrados1)
ggraph(g, layout = "with_fr") +
  geom_edge_link(arrow = arrow(type="closed", length = unit(.075, "inches")),color="blue") +
  geom_node_point() +
  geom_node_text(aes(label=name), vjust=1, hjust=1, color="red") +
  theme_void()+
  theme(plot.margin = margin(-10, -10,-10,-10))

# concluciones


# La red semántica incluye una variedad de términos relacionados con el mito y la epopeya de Ulises, como "sagrado", "ingenioso", "Minerva", "dios", "Ulises", "Telémaco" y "Penélope". es. Estos términos sugieren una fuerte conexión con la Odisea de Homero.

#Las palabras "aurora" y "rosa" en la obra recuerdan el amanecer y la belleza de la naturaleza. Estos términos evocan imágenes poéticas y pintorescas.

#La presencia de términos como "hija", "padre", "hijo", "familia" indica la importancia de las relaciones familiares en la trama de la obra. Estos términos pueden estar relacionados con la historia de Odiseo y su viaje a casa.

#Los términos "dios" y "mortal" enfatizan la presencia de dioses en las historias, lo cual es una característica de la mitología griega. Estos seres divinos suelen influir en el destino de los personajes de la obra.

#Esta red también incluye términos como 'barco', 'mar', 'tierra', 'aire' y 'viaje', indicando la importancia de los elementos naturales y los viajes en la epopeya. Estos términos son fundamentales para la trama de la obra cuando Odiseo comienza su largo viaje de regreso a su tierra natal.
resultado <- get_nrc_sentiment(texto_limpio, language ="spanish")

trad_emociones <- function(cadena){
  case_when(
    cadena == "anger"~ "Ira",
    cadena == "anticipation"~ "Anticipacion",
    cadena == "disgust"~ "Aversion",
    cadena == "fear"~ "Miedo",
    cadena == "joy"~ "Alegria",
    cadena == "sadness"~ "Tristeza",
    cadena == "surprise"~ "Asombro",
    cadena == "trust"~ "Confianza",
    cadena == "negative"~ "Negativo",
    cadena == "positive"~ "Positivo",
    TRUE ~ cadena
  )
}

sentimientos <- resultado%>%
  gather(sentimiento, cantidad)%>%
  mutate(sentimiento = trad_emociones(sentimiento))%>%
  group_by(sentimiento)%>%
  summarise(total = sum(cantidad))

index <- sentimientos$sentimiento %in% c("Positivo", "Negativo")

# Visualización de emociones
sentimientos[!index,] %>%
  ggplot()+
  aes(sentimiento, total)+
  geom_bar(aes(fill = sentimiento), stat = "identity") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  xlab(NULL) +
  ylab("Total") +
  ggtitle("Emociones en La Odisea")

# Visualización de si son sentimientos negativos o positivos:

sentimientos[index,] %>%
  ggplot()+
  aes(sentimiento, total)+
  geom_bar(aes(fill = sentimiento), stat = "identity")+
  xlab(NULL)+
  ylab("Total")+
  ggtitle(" Sentimientos en La Odisea")

#concluciones
#Predominio de emociones positivas: El análisis de sentimientos muestra que La Odisea de Homero contiene principalmente emociones positivas, que pueden relacionar la obra con temas de esperanza, alegría y optimismo.

#Diversidad emocional: A pesar del predominio de las emociones positivas, esta obra también contiene una amplia variedad de emociones. Esto sugiere una historia rica y compleja que explora no sólo la felicidad sino también otros aspectos de la experiencia humana.

#Ausencia de emociones negativas significativas: El análisis muestra que casi no hay emociones negativas como ira o tristeza en el texto. Esto puede reflejar la naturaleza de la epopeya, que a menudo se centra en héroes y aventuras más que en conflictos y desgracias personales.

#Énfasis en expectativas: Hay un sentimiento de "expectativa" en el trabajo. Esto sugiere que La Odisea puede contener elementos de expectación y anticipación, quizás relacionados con la trama y los desafíos que enfrentan los personajes.

#Equilibrio emocional: En general, el equilibrio emocional de una obra contribuye a su atractivo al combinar emociones positivas y expectativas sin caer en emociones negativas extremas. Este equilibrio puede ser parte de lo que hace de La Odisea una obra literaria tan influyente.