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/65165/65165-0.txt"
download.file(url,destfile = "pg65165.txt")
read_lines("pg65165.txt") %>%
  head(20)
##  [1] "The Project Gutenberg eBook of Vida de Jesús, by Ernesto Renán"            
##  [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 at"  
## [12] ""                                                                          
## [13] "\nwww.gutenberg.org. If you are not located in the United States, you"     
## [14] ""                                                                          
## [15] "\nwill have to check the laws of the country where you are located before" 
## [16] ""                                                                          
## [17] "\nusing this eBook."                                                       
## [18] ""                                                                          
## [19] "\n"                                                                        
## [20] ""
file.show("pg65165.txt")
# revisando el documento
libro<-read_lines("pg65165.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: 26486  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:  133059 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    del    las    por    una  jesús    con   como    sus    más 
##   3402   2283   1364   1242    954    863    654    632    542    540    512 
##   para math.,  luc.,    era    sin   pero  juan, marc.,  sobre   sino  habia 
##    401    398    359    356    334    323    319    249    248    237    237 
##  sig.;    muy    fué     él   sig.    the  aquel   todo jesús,  hasta   iii, 
##    229    209    209    208    197    190    190    182    178    164    163 
##  entre    ser    ii,    dos    ix,   vida  reino   cual  todos   este  mismo 
##    160    157    153    152    149    148    148    147    144    138    138 
##    tan  mundo    vi,    ese   gran   dios 
##    137    134    132    129    129    128
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 <- 2413
linea_final <- 18522
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] " capítulo primero"                                    
## [2] " rango jesús historia mundo"                          
## [3] " revolucion medio pasaron nobles porciones"           
## [4] " humanidad antiguas religiones comprendidas bajo vago"
## [5] " nombre paganismo á religion fundada unidad divina"
# Ver las 5 últimas líneas
tail(texto_limpio, n = 5)
## [1] " incesantemente leyenda provocará lágrimas cuento martirio"
## [2] " enternecerá mejores corazones siglos proclamarán"         
## [3] " hijos hombres nacido ninguno pueda"                       
## [4] " comparársele"                                             
## [5] " fin vida jesú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: 7495  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:  133059 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:  48898 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)
##      jesús       dios      habia      mundo      aquel      reino     hombre 
##        776        260        222        206        171        160        155 
## discípulos       vida       juan     tiempo       gran   entónces     muerte 
##        151        144        134        120        120        118        117 
##    siempre       bien       idea    aquella       hijo    hombres        dos 
##        116        111        110        110        109        109         99 
##  jerusalen        dia     parece    tambien    despues    maestro      veces 
##         98         95         94         94         93         87         86 
##      debia      padre   aquellos        ley      todas        fin        vez 
##         85         85         84         83         83         80         80 
##     judíos      punto       toda      segun     pueblo   aquellas      ideas 
##         79         78         78         77         76         76         76 
##  humanidad       duda       cada   espíritu    grandes       allí      ménos 
##         75         75         75         74         73         73         72 
##    especie 
##         72
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)
## + 98/98 vertices, named, from 3ab1950:
##  [1] reino        hijo         muerte       despues      aquella     
##  [6] ó            cierto       juan         hoy          pueblo      
## [11] habia        igual        tiempo       muchas       jesús       
## [16] casi         algun        parece       vida         género      
## [21] cada         segun        discípulos   dios         gran        
## [26] bien         todas        punto        edad         júdas       
## [31] padre        libro        heródes      aquel        san         
## [36] bajo         cristianismo mar          diez         rey         
## [41] título       jóven        áun          grandes      antiguo     
## [46] jerusalen    habian       mejor        antiguos     francisco   
## + ... omitted several vertices
# Imprimir las aristas
aristas <- get.edgelist(g)
print(aristas)
##       [,1]           [,2]        
##  [1,] "reino"        "dios"      
##  [2,] "hijo"         "hombre"    
##  [3,] "muerte"       "jesús"     
##  [4,] "despues"      "muerte"    
##  [5,] "hijo"         "dios"      
##  [6,] "aquella"      "época"     
##  [7,] "ó"            "ménos"     
##  [8,] "cierto"       "punto"     
##  [9,] "juan"         "bautista"  
## [10,] "ó"            "bien"      
## [11,] "hoy"          "dia"       
## [12,] "pueblo"       "judío"     
## [13,] "cierto"       "modo"      
## [14,] "habia"        "hecho"     
## [15,] "igual"        "manera"    
## [16,] "habia"        "llegado"   
## [17,] "tiempo"       "jesús"     
## [18,] "muchas"       "veces"     
## [19,] "jesús"        "habia"     
## [20,] "hijo"         "david"     
## [21,] "casi"         "siempre"   
## [22,] "algun"        "tiempo"    
## [23,] "parece"       "haber"     
## [24,] "vida"         "jesús"     
## [25,] "género"       "humano"    
## [26,] "cada"         "vez"       
## [27,] "segun"        "parece"    
## [28,] "discípulos"   "jesús"     
## [29,] "ó"            "mejor"     
## [30,] "dios"         "jesús"     
## [31,] "gran"         "sacerdote" 
## [32,] "bien"         "pronto"    
## [33,] "todas"        "partes"    
## [34,] "punto"        "vista"     
## [35,] "edad"         "media"     
## [36,] "júdas"        "gaulonita" 
## [37,] "padre"        "celestial" 
## [38,] "jesús"        "hijo"      
## [39,] "libro"        "daniel"    
## [40,] "heródes"      "grande"    
## [41,] "cada"         "paso"      
## [42,] "aquel"        "momento"   
## [43,] "san"          "pablo"     
## [44,] "bajo"         "punto"     
## [45,] "igual"        "modo"      
## [46,] "jesús"        "parece"    
## [47,] "cristianismo" "naciente"  
## [48,] "mar"          "muerto"    
## [49,] "muerte"       "juan"      
## [50,] "diez"         "ocho"      
## [51,] "despues"      "haber"     
## [52,] "rey"          "judíos"    
## [53,] "cada"         "dia"       
## [54,] "título"       "hijo"      
## [55,] "jóven"        "maestro"   
## [56,] "áun"          "hoy"       
## [57,] "grandes"      "cosas"     
## [58,] "antiguo"      "testamento"
## [59,] "todas"        "aquellas"  
## [60,] "jerusalen"    "jesús"     
## [61,] "habian"       "llegado"   
## [62,] "mejor"        "dicho"     
## [63,] "antiguos"     "profetas"  
## [64,] "reino"        "cielo"     
## [65,] "francisco"    "asís"      
## [66,] "dios"         "ó"         
## [67,] "profeta"      "nazareth"  
## [68,] "buena"        "nueva"     
## [69,] "dos"          "hijos"     
## [70,] "misma"        "manera"    
## [71,] "jesús"        "hallaba"
# concluciones


# Jesús y su Mensaje: Esta red muestra la fuerte conexión entre Jesús y Dios. Esto enfatiza el papel central de Jesús como figura divina y cómo su mensaje y enseñanzas estaban estrechamente vinculados a su relación con Dios.

# Muerte de Jesús: "Muerte" y "Jesús" son un nudo interconectado que sugiere la importancia de la cruz de Jesús en la historia. Su muerte se considera un acontecimiento importante en el cristianismo, ya que simboliza la salvación y la redención.

#Creyentes y Discípulos: La relación entre los "discípulos" y "Jesús" resalta el importante papel que los creyentes, como los apóstoles, desempeñaron en la difusión de la vida y el mensaje de Jesús.

#Reino de Dios: La relación entre "reino" y "cielo" muestra que Jesús enfatizó el concepto de "reino de Dios". Sus enseñanzas se centraron en la venida del reino de Dios a la tierra y cómo las personas podrían participar en él.

#Mensaje profético: La relación entre "profeta" y "Nazaret" sugiere que Jesús es considerado un profeta y que su ciudad natal de Nazaret es un punto clave en su historia. Esto enfatiza cómo su mensaje apareció dentro de un contexto profético.

#Estas conclusiones se basan en las conexiones semánticas de la red y la importancia de Jesús como figura divina con un mensaje poderoso y la relevancia de su muerte y sus seguidores en la historia cristiana, refleja el género.
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 vida de Jesus")

# 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 vida de Jesus")

#concluciones

# Diversidad Emocional: El análisis de sentimientos revela una variedad de emociones presentes en el relato de la vida de Jesús. Esto sugiere que la narración abarca una amplia gama de experiencias humanas, desde momentos de alegría y amor hasta episodios que provocan ira o descontento.

# La presencia de la emoción "Ira" en el texto sugiere que hay conflictos o situaciones desafiantes dentro de la historia de Jesús. Estos conflictos pueden ser importantes para el desarrollo de la vida de Jesus 

#  La coexistencia de emociones positivas y negativas, como "Alegria" y "Ira", señala la complejidad de la historia de Jesús. Esto refleja la realidad humana, experimentamos una amplia gama de sentimientos en diferentes momentos.

#Exploración de la Humanidad: La aparición de emociones humanas como la ira en la narrativa de Jesús sugiere que el relato se centra en la humanidad y las experiencias terrenales de los personajes. Esto puede hacer que la historia sea más relatable y significativa para los lectores.

#Caracterización Profunda: Las emociones, incluida la ira, pueden proporcionar una caracterización más profunda de los personajes. Los momentos en que los personajes experimentan ira pueden ofrecer información sobre sus motivaciones, luchas internas y relaciones con otros.