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/cache/epub/45438/pg45438.txt"
download.file(url,destfile = "pg45438.txt")
read_lines("pg45438.txt") %>%
  head(20)
##  [1] "The Project Gutenberg eBook of La isla del tesoro"                         
##  [2] ""                                                                          
##  [3] "\n    "                                                                    
##  [4] ""                                                                          
##  [5] "\nThis ebook is for the use of anyone anywhere in the United States and"   
##  [6] ""                                                                          
##  [7] "\nmost other 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"  
## [10] ""                                                                          
## [11] "\nof the Project Gutenberg License included with this ebook or online"     
## [12] ""                                                                          
## [13] "\nat www.gutenberg.org. If you are not located in the United States,"      
## [14] ""                                                                          
## [15] "\nyou will have to check the laws of the country where you are located"    
## [16] ""                                                                          
## [17] "\nbefore using this eBook."                                                
## [18] ""                                                                          
## [19] "\n"                                                                        
## [20] ""
file.show("pg45438.txt")
# revisando el documento
libro<-read_lines("pg45438.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: 20998  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:  103418 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))

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

palabras%>%
  head(50)
##     que     con     por     una     los     del    como     más    para     las 
##    3058     989     927     857     822     727     585     547     528     467 
##     era    pero   había   sobre     vd.     muy     sus     sin   aquel  cuando 
##     412     403     374     355     316     306     292     239     235     219 
##     nos    todo  estaba   hasta     the   todos     tan capitán    bien      él 
##     206     200     200     195     189     185     180     171     167     166 
##  hombre    esto    dijo   mismo    este     uno    que,   hacia     fué     mis 
##     165     161     159     158     156     152     142     136     135     133 
##     vez  silver    esta   entre     dos    aquí    gran  doctor    allí aquella 
##     130     127     124     123     122     121     113     109     109     108
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 el libro"
  )

# limpieza inicial del texto 
total_lineas <- length(libro)
linea_empieza <- 363
linea_final <- 19597
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] " parte i"                                    
## [2] " viejo filibustero"                          
## [3] " capítulo i"                                 
## [4] " viejo lobo marino posada almirante benbow"  
## [5] " imposible rehusarme á repetidas instancias "
# Ver las 5 últimas líneas
tail(texto_limpio, n = 5)
## [1] " estrellándose escarpadas costas despierto sudoroso"          
## [2] " lecho tan luego pesadilla hace oir voz aguda "               
## [3] " penetrante capitán flint gritando desesperadamente ¡piezas á"
## [4] " ocho ¡piezas á ocho ¡piezas á ocho"                          
## [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: 7808  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:  103418 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í","etc","aun","ello","iii","ti","iba","hé","ido","ése","ví","nó","vió","dí","tí","veas","vea","dió","fin","aquí","bien","nó","sol","eco","dos","allí","vez","vds")
# 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:  47696 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)
##   capitán    silver     aquel    doctor    hombre     ahora     hacia    tiempo 
##       305       257       241       207       198       148       135       131 
## caballero      mano      gran     hacer   aquella  entonces   todavía     bordo 
##       113       110       109       109       108       106       104       103 
##     luego   hombres     nuevo      lado    cuanto      cosa   momento     punto 
##       102       102       101        99        96        91        91        91 
##   después    verdad     decir      toda      isla     menos       jim     buque 
##        89        88        87        87        84        84        84        84 
##    tierra      casi      cada     parte    cabeza       voz  bastante       ver 
##        83        82        81        80        79        77        75        75 
##       día      agua  aquellos  instante      tres    pronto     hecho    manera 
##        74        74        73        73        72        72        71        71 
##      creo  española 
##        70        70
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 >=7 )
# 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(1, 1,1,1))

# Imprimir los nodos
nodos <- V(g)
print(nodos)
## + 108/108 vertices, named, from 970d6c2:
##   [1] ben          capitán      john         doctor       illustration
##   [6] sr           black        aquel        aquellos     piezas      
##  [11] almirante    caballero    disco        isla         cabe        
##  [16] puede        acto         hacia        replicó      ocho        
##  [21] tres         sola         si           aquella      largo       
##  [26] buena        billy        islote       amigo        viva        
##  [31] bajo         hora         algún        vd           mil         
##  [36] exclamó      quiero       cree         quiere       israel      
##  [41] caballeros   gritó        bahía        jorge        posada      
##  [46] todas        ó            camarada     mayor        pude        
## + ... omitted several vertices
# Imprimir las aristas
aristas <- get.edgelist(g)
print(aristas)
##       [,1]           [,2]          
##  [1,] "ben"          "gunn"        
##  [2,] "capitán"      "smollet"     
##  [3,] "john"         "silver"      
##  [4,] "doctor"       "livesey"     
##  [5,] "illustration" "capítulo"    
##  [6,] "illustration" "illustration"
##  [7,] "sr"           "trelawney"   
##  [8,] "black"        "dog"         
##  [9,] "aquel"        "hombre"      
## [10,] "aquel"        "instante"    
## [11,] "aquel"        "momento"     
## [12,] "aquellos"     "hombres"     
## [13,] "capitán"      "flint"       
## [14,] "piezas"       "ocho"        
## [15,] "almirante"    "benbow"      
## [16,] "caballero"    "trelawney"   
## [17,] "disco"        "negro"       
## [18,] "aquellos"     "momentos"    
## [19,] "isla"         "tesoro"      
## [20,] "cabe"         "duda"        
## [21,] "puede"        "vd"          
## [22,] "acto"         "continuo"    
## [23,] "doctor"       "vd"          
## [24,] "hacia"        "abajo"       
## [25,] "aquel"        "punto"       
## [26,] "replicó"      "capitán"     
## [27,] "ocho"         "piezas"      
## [28,] "tres"         "años"        
## [29,] "sola"         "pierna"      
## [30,] "si"           "alguna"      
## [31,] "si"           "vd"          
## [32,] "aquella"      "noche"       
## [33,] "largo"        "tiempo"      
## [34,] "buena"        "suerte"      
## [35,] "billy"        "bones"       
## [36,] "replicó"      "doctor"      
## [37,] "islote"       "esqueleto"   
## [38,] "amigo"        "hands"       
## [39,] "viva"         "rom"         
## [40,] "hacia"        "playa"       
## [41,] "bajo"         "brazo"       
## [42,] "hora"         "buena"       
## [43,] "algún"        "rato"        
## [44,] "vd"           "capitán"     
## [45,] "mil"          "diablos"     
## [46,] "caballero"    "doctor"      
## [47,] "exclamó"      "caballero"   
## [48,] "exclamó"      "silver"      
## [49,] "quiero"       "decir"       
## [50,] "cree"         "vd"          
## [51,] "quiere"       "vd"          
## [52,] "israel"       "hands"       
## [53,] "caballeros"   "fortuna"     
## [54,] "gritó"        "capitán"     
## [55,] "bahía"        "norte"       
## [56,] "jorge"        "merry"       
## [57,] "posada"       "almirante"   
## [58,] "todas"        "fuerzas"     
## [59,] "ó"            "tres"        
## [60,] "camarada"     "bill"        
## [61,] "ó"            "si"          
## [62,] "sola"         "palabra"     
## [63,] "mayor"        "parte"       
## [64,] "pude"         "ver"         
## [65,] "aquel"        "día"         
## [66,] "primera"      "ojeada"      
## [67,] "toda"         "prisa"       
## [68,] "ve"           "vd"          
## [69,] "bordo"        "española"    
## [70,] "señor"        "contestó"    
## [71,] "pobre"        "tom"         
## [72,] "caballero"    "capitán"     
## [73,] "contestó"     "silver"      
## [74,] "vd"           "si"          
## [75,] "gritó"        "silver"      
## [76,] "recinto"      "estacada"    
## [77,] "capitán"      "silver"      
## [78,] "vela"         "mayor"
# concluciones

# La red muestra que "Ben," "Capitán," "John," y "Doctor" son personajes principales en la historia. Sus nombres aparecen conectados entre sí, lo que sugiere que desempeñan un papel importante en la trama.

#  La relación entre "Isla" y "Tesoro" destaca que la búsqueda del tesoro en la isla es un tema central en la historia. Esto podría implicar aventuras y desafíos emocionantes en la isla.

# La conexión entre "Capitán" y "Flint" sugiere que el Capitán Flint, un legendario pirata, podría ser un elemento importante en la trama, lo que agrega un toque de misterio y peligro a la historia.

#  Las palabras "gritó" y "exclamó" vinculadas a los personajes principales, como el "Capitán" y "Silver," indican escenas de alta tensión y emociones fuertes en la narrativa.

#  La red contiene palabras como "tres" y "años," lo que sugiere la existencia de referencias temporales en la historia, y "aquellos" y "momentos" podrían señalar momentos significativos.

# En resumen, los personajes principales en la historia podrían ser Ben, el Capitán, John, el Doctor y posiblemente el misterioso Capitán Flint. La búsqueda del tesoro en la isla parece ser el eje central de la trama, con emocionantes momentos de tensión y aventura a lo largo de la h
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 Isla del Tesoro")

sentimientos$score <- sentimientos$total / sum(sentimientos$total)
sentimientos$score
##  [1] 0.05579285 0.06620395 0.04137747 0.06380139 0.09343300 0.08889482
##  [7] 0.11452216 0.21729845 0.16924720 0.08942872
# 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 Isla del Tesoro")

#concluciones

# Basado en el análisis de sentimientos, el texto parece tener un tono general negativo. Las emociones negativas superan a las emociones positivas en términos de cantidad, lo que sugiere que la historia podría ser más sombría y llena de desafíos.

#  La preponderancia de emociones negativas, como "Ira," "Aversión" y "Miedo," sugiere que los personajes pueden enfrentar situaciones difíciles, conflictos y obstáculos en la trama.

# La emoción "Tristeza" es notable en el análisis, lo que podría indicar que los personajes experimentan pérdidas o situaciones emocionales difíciles a lo largo de la historia.

#  Aunque las emociones negativas son predominantes, la diversidad de emociones representa una narrativa rica y compleja en la que los personajes experimentan una variedad de sentimientos.

#  La presencia de emociones negativas puede agregar profundidad y realismo a la historia