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.