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.