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