title: “Taller_2_MinText” author: “Esteban Babativa” date: ‘2023-10-19’ output: pdf_document
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/58221/58221-0.txt"
download.file(url,destfile = "pg58221.txt")
read_lines("pg58221.txt") %>%
head(20)
## [1] "The Project Gutenberg EBook of La Odisea, by Homer"
## [2] ""
## [3] "\n"
## [4] ""
## [5] "\nThis eBook is for the use of anyone anywhere in the United States and most"
## [6] ""
## [7] "\nother 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 of"
## [10] ""
## [11] "\nthe 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'll have"
## [14] ""
## [15] "\nto check the laws of the country where you are located before using this ebook."
## [16] ""
## [17] "\n"
## [18] ""
## [19] "\nTitle: La Odisea"
## [20] ""
file.show("pg58221.txt")
# revisando el documento
libro<-read_lines("pg58221.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: 36652 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: 194317 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))
# 5.Frecuencia de palabras
palabras<- coleccion%>%
TermDocumentMatrix()%>%
as.matrix()%>%
rowSums()%>%
sort(decreasing = T)
palabras%>%
head(50)
## que los las con por
## 5462 3780 1717 1703 1497
## del ulises para una sus
## 1232 957 884 776 555
## como ulises, cuando telémaco hijo
## 519 476 455 442 427
## pues así todos más les
## 420 406 394 385 358
## pero después dice fué júpiter
## 312 287 281 272 268
## tan sin pretendientes porque muy
## 262 254 252 250 250
## nos palacio esta casa gran
## 244 240 229 228 225
## entre penélope había cual padre
## 223 221 212 210 206
## donde telémaco, hija quien the
## 198 196 195 192 188
## pretendientes, minerva ánimo hombres mas
## 185 183 183 180 178
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 la obra"
)
# limpieza inicial del texto
total_lineas <- length(libro)
linea_empieza <- 921
linea_final <- 25724
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] " canto primero"
## [2] " concilio diosesexhortación minerva á telémaco"
## [3] " 1 háblame musa aquel varón multiforme ingenio "
## [4] " después destruir sacra ciudad troya anduvo peregrinando"
## [5] " larguísimo tiempo vió poblaciones conoció costumbres"
# Ver las 5 últimas líneas
tail(texto_limpio, n = 5)
## [1] " 545 así habló minerva ulises alegre ánimo cumplió "
## [2] " orden luego hizo juraran paz entrambas partes propia"
## [3] " palas minerva hija júpiter lleva égida tomado"
## [4] " aspecto voz méntor"
## [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: 10853 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: 194317 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í")
# 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: 69402 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)
## ulises casa telémaco palacio hombres
## 678 296 284 279 274
## tierra palabras dioses pretendientes hijo
## 259 249 241 239 238
## júpiter después padre gran ánimo
## 232 223 223 210 207
## compañeros mar entonces divinal nave
## 189 183 182 175 175
## minerva corazón bien ahora vino
## 173 165 162 161 155
## habló patria allí muerte hija
## 151 146 142 138 135
## mientras cosas manos aunque dios
## 135 129 128 122 122
## penélope ciudad suerte huésped fin
## 122 119 118 116 115
## respondióle hombre madre pronto manera
## 111 109 107 102 101
## modo junto ponto mano sol
## 101 100 94 93 92
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 >= 8)
# Limitar el número de nodos a mostrar
max_nodos <- 10 # 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()
# concluciones
# La red semántica incluye una variedad de términos relacionados con el mito y la epopeya de Ulises, como "sagrado", "ingenioso", "Minerva", "dios", "Ulises", "Telémaco" y "Penélope". es. Estos términos sugieren una fuerte conexión con la Odisea de Homero.
#Las palabras "aurora" y "rosa" en la obra recuerdan el amanecer y la belleza de la naturaleza. Estos términos evocan imágenes poéticas y pintorescas.
#La presencia de términos como "hija", "padre", "hijo", "familia" indica la importancia de las relaciones familiares en la trama de la obra. Estos términos pueden estar relacionados con la historia de Odiseo y su viaje a casa.
#Los términos "dios" y "mortal" enfatizan la presencia de dioses en las historias, lo cual es una característica de la mitología griega. Estos seres divinos suelen influir en el destino de los personajes de la obra.
#Esta red también incluye términos como 'barco', 'mar', 'tierra', 'aire' y 'viaje', indicando la importancia de los elementos naturales y los viajes en la epopeya. Estos términos son fundamentales para la trama de la obra cuando Odiseo comienza su largo viaje de regreso a su tierra natal.
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 Odisea")
# 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 Odisea")
#concluciones
#Predominio de emociones positivas: El análisis de sentimientos muestra que La Odisea de Homero contiene principalmente emociones positivas, que pueden relacionar la obra con temas de esperanza, alegría y optimismo.
#Diversidad emocional: A pesar del predominio de las emociones positivas, esta obra también contiene una amplia variedad de emociones. Esto sugiere una historia rica y compleja que explora no sólo la felicidad sino también otros aspectos de la experiencia humana.
#Ausencia de emociones negativas significativas: El análisis muestra que casi no hay emociones negativas como ira o tristeza en el texto. Esto puede reflejar la naturaleza de la epopeya, que a menudo se centra en héroes y aventuras más que en conflictos y desgracias personales.
#Énfasis en expectativas: Hay un sentimiento de "expectativa" en el trabajo. Esto sugiere que La Odisea puede contener elementos de expectación y anticipación, quizás relacionados con la trama y los desafíos que enfrentan los personajes.
#Equilibrio emocional: En general, el equilibrio emocional de una obra contribuye a su atractivo al combinar emociones positivas y expectativas sin caer en emociones negativas extremas. Este equilibrio puede ser parte de lo que hace de La Odisea una obra literaria tan influyente.