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/48654/pg48654.txt"
download.file(url,destfile = "pg48654.txt")
read_lines("pg48654.txt") %>%
  head(20)
##  [1] "The Project Gutenberg eBook of Incesto: novela original"                   
##  [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("pg48654.txt")
# revisando el documento
libro<-read_lines("pg48654.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: 11662  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:  47071 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           los           las           por           con 
##          1111           573           449           421           405 
##           sus           una           del      mercedes           the 
##           339           288           275           234           190 
##          como          para           muy           más           sin 
##           173           158           154           136           120 
##         había       balbina         sobre          doña           era 
##           115           114           105            96            95 
##       roberto           tan           don          ella       project 
##            91            90            85            84            83 
##         aquel          pero           you gómez-urquijo          ojos 
##            77            76            73            71            68 
##           and          todo       aquella        cuando         entre 
##            67            67            61            60            56 
##         joven    gutenberg™       siempre     mercedes,           dos 
##            54            54            53            52            51 
##        carmen         madre          with            tú          this 
##            49            49            47            47            45 
##         todas         mujer           ser         todos        porque 
##            45            44            44            42            41
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 <- 145
linea_final <- 10638
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] " mercedes dió buenas noches salió iba triste pálida "      
## [2] " ojeras violáceas mirada errabunda brillante mujeres"      
## [3] " nerviosas tósigo obsesión impide dormir tranquilas"       
## [4] " dos viejecitos permanecieron sentados contemplándose aire"
## [5] " melancólico"
# Ver las 5 últimas líneas
tail(texto_limpio, n = 5)
## [1] " ley cruel inútil rebelarse vida usted dicho"     
## [2] " novela escribe permítame usted redactar "        
## [3] " quiero aprovechar ilusiones juventud tan hermoso"
## [4] " vuelve ¡quiero ser feliz padre dele usted beso " 
## [5] " madre adiós»"
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: 3981  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:  47071 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")
# 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:  23484 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)
##     mercedes      balbina      roberto gómezurquijo         doña       carmen 
##          317          148          143          101           98           83 
##        aquel        madre        pedro        joven      siempre        mujer 
##           77           77           76           74           69           65 
##      aquella      mujeres          dos        luego        padre         casa 
##           61           57           54           53           53           51 
##         hija       cabeza          voz         bien      después       hombre 
##           49           48           48           48           48           46 
##        todas         vida        tarde       alcalá       libros        calle 
##           45           45           44           43           43           41 
##         años          vez        nobos      grandes        nunca        actor 
##           38           38           38           36           36           35 
##        hacia         amor       pronto        noche       tiempo         bajo 
##           34           33           32           32           31           30 
##     entonces       labios         gran         hora        manos       rostro 
##           30           29           29           29           28           28 
##      nicasia         toda 
##           28           28
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 >=3 )
# 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)
## + 161/161 vertices, named, from 8164bad:
##   [1] doña          balbina       roberto       casa          carmen       
##   [6] pablo         treinta       cabeza        nariz         voz          
##  [11] aquella       día           noche         todas         primera      
##  [16] mercedes      eva           sola          mme           mesonero     
##  [21] libros        anfiteatro    años          mesa          apoyada      
##  [26] muchas        sabiendo      autor         después       hacía        
##  [31] tarde         fuerte        nocturnos     calle         novela       
##  [36] hermanas      primer        luis          tantas        quiero       
##  [41] iglesia       antón         largos        labios        pedro        
##  [46] dónde         quién         hacia         codos         tictac       
## + ... omitted several vertices
# Imprimir las aristas
aristas <- get.edgelist(g)
print(aristas)
##        [,1]           [,2]           
##   [1,] "doña"         "balbina"      
##   [2,] "balbina"      "nobos"        
##   [3,] "roberto"      "alcalá"       
##   [4,] "casa"         "carmen"       
##   [5,] "carmen"       "nicasia"      
##   [6,] "carmen"       "vallejo"      
##   [7,] "pablo"        "ardémiz"      
##   [8,] "treinta"      "años"         
##   [9,] "cabeza"       "mujer"        
##  [10,] "nariz"        "aguileña"     
##  [11,] "voz"          "baja"         
##  [12,] "aquella"      "noche"        
##  [13,] "día"          "siguiente"    
##  [14,] "noche"        "mercedes"     
##  [15,] "todas"        "partes"       
##  [16,] "primera"      "vez"          
##  [17,] "mercedes"     "madre"        
##  [18,] "doña"         "inés"         
##  [19,] "eva"          "cabeza"       
##  [20,] "sola"         "calle"        
##  [21,] "mme"          "relder"       
##  [22,] "mesonero"     "romanos"      
##  [23,] "libros"       "padre"        
##  [24,] "anfiteatro"   "principal"    
##  [25,] "balbina"      "mercedes"     
##  [26,] "años"         "vida"         
##  [27,] "mesa"         "trabajo"      
##  [28,] "apoyada"      "codos"        
##  [29,] "muchas"       "horas"        
##  [30,] "sabiendo"     "cómo"         
##  [31,] "todas"        "mujeres"      
##  [32,] "autor"        "eva"          
##  [33,] "después"      "cenar"        
##  [34,] "hacía"        "tiempo"       
##  [35,] "mercedes"     "volvió"       
##  [36,] "tarde"        "mercedes"     
##  [37,] "fuerte"       "olor"         
##  [38,] "nocturnos"    "chopín"       
##  [39,] "calle"        "mesonero"     
##  [40,] "mercedes"     "casa"         
##  [41,] "novela"       "escribe"      
##  [42,] "hermanas"     "vallejo"      
##  [43,] "primer"       "acto"         
##  [44,] "luis"         "herrera"      
##  [45,] "mercedes"     "roberto"      
##  [46,] "tantas"       "mujeres"      
##  [47,] "quiero"       "feliz"        
##  [48,] "iglesia"      "antón"        
##  [49,] "antón"        "martín"       
##  [50,] "cabeza"       "apostólica"   
##  [51,] "largos"       "años"         
##  [52,] "labios"       "finos"        
##  [53,] "pedro"        "gómezurquijo" 
##  [54,] "dónde"        "va"           
##  [55,] "roberto"      "mercedes"     
##  [56,] "quién"        "sabe"         
##  [57,] "hacia"        "atrás"        
##  [58,] "codos"        "mesa"         
##  [59,] "tictac"       "tictac"       
##  [60,] "grandes"      "hombres"      
##  [61,] "largo"        "rato"         
##  [62,] "varias"       "veces"        
##  [63,] "encogió"      "hombros"      
##  [64,] "finos"        "labios"       
##  [65,] "abrigo"       "pan"          
##  [66,] "salir"        "sola"         
##  [67,] "grandes"      "azules"       
##  [68,] "noches"       "después"      
##  [69,] "dirigiéndose" "hacia"        
##  [70,] "hacia"        "puerta"       
##  [71,] "balbina"      "parecía"      
##  [72,] "momentos"     "después"      
##  [73,] "teatro"       "real"         
##  [74,] "toda"         "alma"         
##  [75,] "bajando"      "voz"          
##  [76,] "vastos"       "solares"      
##  [77,] "mercedes"     "dos"          
##  [78,] "habitaciones" "desamuebladas"
##  [79,] "tardes"       "recibía"      
##  [80,] "misma"        "hora"         
##  [81,] "aquellos"     "paseos"       
##  [82,] "tres"         "jóvenes"      
##  [83,] "mercedes"     "miraba"       
##  [84,] "supo"         "responder"    
##  [85,] "después"      "mercedes"     
##  [86,] "aquella"      "época"        
##  [87,] "vida"         "novela"       
##  [88,] "dos"          "mujeres"      
##  [89,] "eva"          "matilde"      
##  [90,] "lamparilla"   "eléctrica"    
##  [91,] "todas"        "horas"        
##  [92,] "timbre"       "puerta"       
##  [93,] "nicasia"      "carmen"       
##  [94,] "mediana"      "estatura"     
##  [95,] "mercedes"     "dejó"         
##  [96,] "aquella"      "voz"          
##  [97,] "claudio"      "antúnez"      
##  [98,] "mercedes"     "escuchaba"    
##  [99,] "joven"        "actor"        
## [100,] "mercedes"     "comprendió"   
## [101,] "muchas"       "mujeres"      
## [102,] "dos"          "dos"          
## [103,] "hacia"        "calle"        
## [104,] "mercedes"     "retiró"       
## [105,] "aquel"        "momento"      
## [106,] "pueden"       "vernos"       
## [107,] "llegar"       "calle"        
## [108,] "continuó"     "hablando"     
## [109,] "libros"       "enseñaron"    
## [110,] "calle"        "pozas"        
## [111,] "rompió"       "llorar"       
## [112,] "vista"        "fija"         
## [113,] "fija"         "suelo"        
## [114,] "dos"          "amantes"      
## [115,] "cuatro"       "tarde"        
## [116,] "reloj"        "universidad"  
## [117,] "corrió"       "hacia"        
## [118,] "aquel"        "incidente"
# concluciones

# La relación entre "Doña Balbina" y "Roberto" sugiere que la historia puede centrarse en temas familiares como conflictos y secretos dentro de la familia. "Carmen" está vinculada a varios personajes, lo que puede indicar que su personalidad es importante. Puede que haya un misterio a su alrededor.

# Palabras como "posadero" y "anfiteatro" y referencias a "año" y "vida" pueden indicar un contexto histórico o geográfico específico.

#Los aspectos físicos de un personaje, como la "nariz" o los "labios finos", pueden ser importantes para la identidad de un personaje.

#Una novela dentro de una novela  La palabra “novela” y el acto de “escribir” pueden indicar que una obra literaria juega un papel importante en la trama, los personajes pueden enfrentar dilemas personales, como "llorar" o "reaccionar" ante situaciones difíciles.

# Personajes femeninos relevantes Mujeres como ``Doña Inés'', ``Eva'', ``Nicasia'' y ``Mercedes'' pueden desempeñar papeles centrales en la historia.
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 novela Incesto")

sentimientos$score <- sentimientos$total / sum(sentimientos$total)
sentimientos$score
##  [1] 0.06419590 0.07511582 0.04533422 0.06485771 0.09662475 0.07908670
##  [7] 0.10125745 0.20019854 0.18100596 0.09232296
# 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 novela Incesto")

#concluciones

#El texto contiene emociones negativas predominantes: Las emociones de "Ira," "Miedo," "Tristeza," y "Negativo" tienen puntajes más altos en el análisis, lo que sugiere que el texto aborda principalmente temas o situaciones que generan sentimientos negativos.

#La emoción de "Ira" es significativa: El alto puntaje de "Ira" indica que la ira es una emoción destacada en el texto, lo que puede sugerir conflictos o tensiones en la narrativa.

#La emoción de "Miedo" agrega un componente de temor: La presencia de "Miedo" en el texto sugiere que hay elementos que generan inquietud o preocupación en la trama.

#"Tristeza" refleja una carga emocional: La tristeza es una emoción importante en el texto, lo que puede indicar que la historia aborda eventos emotivos o conmovedores.

#Pese a lo negativo, también hay otras emociones presentes: Aunque las emociones negativas dominan, la presencia de otras emociones como "Alegría," "Anticipación," y "Asombro" sugiere un matiz emocional en la narrativa.