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/67939/67939-0.txt"
download.file(url,destfile = "pg67939.txt")
read_lines("pg67939.txt") %>%
  head(20)
##  [1] "The Project Gutenberg eBook of El capital, by Carlos Marx"                 
##  [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("pg67939.txt")
# revisando el documento
libro<-read_lines("pg67939.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: 19822  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:  96874 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         del         los         por         las     trabajo 
##        2410        1481        1243        1154         960         830 
##         una        para       valor         más        como         con 
##         817         574         495         482         453         383 
##      fuerza        este     capital  producción        esta    trabajo, 
##         366         330         327         314         301         268 
##        solo         sus capitalista      medios       forma      tiempo 
##         248         242         211         210         209         200 
##        pero       parte         the    cantidad       entre       mismo 
##         197         187         186         177         174         173 
##        cada        sino         ser       puede  supervalía         sin 
##         172         167         162         156         155         151 
##    producto      obrero     jornada    trabajo.       medio         vez 
##         135         135         135         134         130         129 
##         son        todo       pues,  mercancías      precio       desde 
##         128         128         125         113         112         109 
##     salario      decir, 
##         107         106
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 <- 607
linea_final <- 18946
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] " estudio"                                           
## [2] " socialismo científico"                             
## [3] " i"                                                 
## [4] " colectivismo comunismo"                            
## [5] " hace seis años clase obrera repuesta aún espantosa"
# Ver las 5 últimas líneas
tail(texto_limpio, n = 5)
## [1] " supone aniquilamiento propiedad privada basada trabajo"
## [2] " personal base expropiación trabajador pues "           
## [3] " puede disponerse asalariados indispensables sometidos "
## [4] " disciplinados sino pueden trabajar mismos"             
## [5] " poseen medios producción"
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: 7730  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:  96874 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")
# 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:  47248 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)
##     trabajo       valor     capital  producción      fuerza capitalista 
##        1284         625         460         443         410         377 
##        solo      tiempo  supervalía       parte       forma      medios 
##         249         239         237         232         224         210 
##     pesetas    producto    cantidad  mercancías      obrero        cada 
##         195         189         189         186         170         168 
##       puede     jornada   mercancía  trabajador      social      dinero 
##         164         158         156         151         149         149 
##       medio   necesario         vez     obreros     salario      precio 
##         140         139         139         139         138         132 
## acumulación      cambio       horas       decir       menos         dos 
##         131         130         119         114         113         111 
##      número       clase       misma   industria        hace       mayor 
##         110         107         101         101          99          98 
##     máquina      hombre     aumento    relación circulación     sistema 
##          98          97          97          93          93          91 
##     ejemplo      obrera 
##          90          89
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 >= 10)
# 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(-10, -10,-10,-10))

# Imprimir los nodos
nodos <- V(g)
print(nodos)
## + 136/136 vertices, named, from a0e0816:
##   [1] fuerza         medios         jornada        producción     tiempo        
##   [6] trabajo        valor          productividad  punto          clase         
##  [11] división       cada           doce           capital        número        
##  [16] seis           tipo           parte          demanda        horas         
##  [21] cantidad       sistema        kilogramos     precio         grande        
##  [26] circulación    bajo           cierta         fuerzas        gran          
##  [31] valores        acumulación    grado          mercancía      economía      
##  [36] objeto         instrumento    consumo        oro            forma         
##  [41] dos            dinero         medio          prolongación   salario       
##  [46] régimen        oferta         término        social         relación      
## + ... omitted several vertices
# Imprimir las aristas
aristas <- get.edgelist(g)
print(aristas)
##        [,1]             [,2]           
##   [1,] "fuerza"         "trabajo"      
##   [2,] "medios"         "producción"   
##   [3,] "jornada"        "trabajo"      
##   [4,] "producción"     "capitalista"  
##   [5,] "tiempo"         "trabajo"      
##   [6,] "trabajo"        "necesario"    
##   [7,] "valor"          "fuerza"       
##   [8,] "productividad"  "trabajo"      
##   [9,] "punto"          "vista"        
##  [10,] "valor"          "uso"          
##  [11,] "clase"          "obrera"       
##  [12,] "división"       "trabajo"      
##  [13,] "cada"           "vez"          
##  [14,] "doce"           "horas"        
##  [15,] "capital"        "variable"     
##  [16,] "número"         "obreros"      
##  [17,] "fuerza"         "obrera"       
##  [18,] "seis"           "horas"        
##  [19,] "tipo"           "supervalía"   
##  [20,] "parte"          "variable"     
##  [21,] "demanda"        "trabajo"      
##  [22,] "horas"          "trabajo"      
##  [23,] "cantidad"       "trabajo"      
##  [24,] "sistema"        "producción"   
##  [25,] "kilogramos"     "hilados"      
##  [26,] "precio"         "trabajo"      
##  [27,] "trabajo"        "pagado"       
##  [28,] "grande"         "industria"    
##  [29,] "circulación"    "mercancías"   
##  [30,] "valor"          "pesetas"      
##  [31,] "bajo"           "forma"        
##  [32,] "valor"          "producto"     
##  [33,] "cierta"         "cantidad"     
##  [34,] "fuerzas"        "trabajo"      
##  [35,] "gran"           "industria"    
##  [36,] "punto"          "partida"      
##  [37,] "valores"        "uso"          
##  [38,] "medios"         "subsistencia" 
##  [39,] "valor"          "medios"       
##  [40,] "capital"        "adelantado"   
##  [41,] "acumulación"    "primitiva"    
##  [42,] "fuerzas"        "productivas"  
##  [43,] "grado"          "explotación"  
##  [44,] "mercancía"      "dinero"       
##  [45,] "producción"     "supervalía"   
##  [46,] "economía"       "política"     
##  [47,] "capital"        "social"       
##  [48,] "medios"         "trabajo"      
##  [49,] "valor"          "cambio"       
##  [50,] "trabajo"        "productivo"   
##  [51,] "objeto"         "trabajo"      
##  [52,] "parte"          "capital"      
##  [53,] "instrumento"    "trabajo"      
##  [54,] "cada"           "día"          
##  [55,] "consumo"        "individual"   
##  [56,] "tiempo"         "necesario"    
##  [57,] "oro"            "plata"        
##  [58,] "forma"          "moneda"       
##  [59,] "dos"            "escudos"      
##  [60,] "dinero"         "capital"      
##  [61,] "medio"          "trabajo"      
##  [62,] "prolongación"   "jornada"      
##  [63,] "división"       "manufacturera"
##  [64,] "salario"        "destajo"      
##  [65,] "régimen"        "capitalista"  
##  [66,] "oferta"         "demanda"      
##  [67,] "término"        "medio"        
##  [68,] "social"         "trabajo"      
##  [69,] "relación"       "cambio"       
##  [70,] "primera"        "materia"      
##  [71,] "valor"          "diario"       
##  [72,] "parte"          "constante"    
##  [73,] "salario"        "jornal"       
##  [74,] "propiedad"      "privada"      
##  [75,] "modo"           "producción"   
##  [76,] "sufragio"       "universal"    
##  [77,] "primeras"       "materias"     
##  [78,] "valor"          "trabajo"      
##  [79,] "supervalía"     "pesetas"      
##  [80,] "parte"          "jornada"      
##  [81,] "setenta"        "dos"          
##  [82,] "acto"           "producción"   
##  [83,] "trabajo"        "humano"       
##  [84,] "magnitud"       "valor"        
##  [85,] "valor"          "mercancía"    
##  [86,] "aumento"        "productividad"
##  [87,] "trabajo"        "forma"        
##  [88,] "producción"     "mercantil"    
##  [89,] "producción"     "fuerza"       
##  [90,] "dos"            "minutos"      
##  [91,] "producto"       "líquido"      
##  [92,] "sistema"        "capitalista"  
##  [93,] "manufacturera"  "trabajo"      
##  [94,] "necesario"      "producción"   
##  [95,] "ahora"          "bien"         
##  [96,] "si"             "bien"         
##  [97,] "primer"         "lugar"        
##  [98,] "trabajo"        "si"           
##  [99,] "trabajo"        "valor"        
## [100,] "cantidad"       "valor"        
## [101,] "tiempo"         "determinado"  
## [102,] "mayor"          "menor"        
## [103,] "valor"          "mercancías"   
## [104,] "metros"         "tela"         
## [105,] "vez"            "mayor"        
## [106,] "trabajo"        "social"       
## [107,] "dinero"         "mercancía"    
## [108,] "kilogramos"     "algodón"      
## [109,] "diario"         "fuerza"       
## [110,] "produce"        "valor"        
## [111,] "producción"     "consumidos"   
## [112,] "trabajo"        "supervalía"   
## [113,] "horas"          "sobretrabajo" 
## [114,] "capital"        "trabajo"      
## [115,] "mujeres"        "niños"        
## [116,] "trabajo"        "salario"      
## [117,] "forma"          "salario"      
## [118,] "salario"        "cotidiano"    
## [119,] "composición"    "capital"      
## [120,] "cantidad"       "relativa"     
## [121,] "industria"      "mecánica"     
## [122,] "gran"           "parte"        
## [123,] "desarrollo"     "producción"   
## [124,] "duración"       "trabajo"      
## [125,] "obrero"         "trabaja"      
## [126,] "trabajo"        "decir"        
## [127,] "trabajo"        "tiempo"       
## [128,] "trabajo"        "aumenta"      
## [129,] "trabajo"        "hace"         
## [130,] "cuyo"           "valor"        
## [131,] "medio"          "pago"         
## [132,] "transformación" "dinero"       
## [133,] "materias"       "primeras"     
## [134,] "ramos"          "industria"    
## [135,] "propiedad"      "capitalista"  
## [136,] "capital"        "constante"    
## [137,] "necesario"      "sobretrabajo" 
## [138,] "explotación"    "fuerza"       
## [139,] "supervalía"     "relativa"     
## [140,] "trabajador"     "colectivo"    
## [141,] "población"      "obrera"       
## [142,] "acumulación"    "capital"      
## [143,] "acumulación"    "capitalista"  
## [144,] "sobrante"       "población"
# concluciones


# Trabajo y Producción: La red semántica muestra una conexión cercana entre "trabajo" y "producción". Esto refleja la importancia del trabajo en la creación de bienes y servicios en el análisis marxista.

# Valor y Capital: "Valor" y "capital" están conectados en la red, lo que es fundamental en la teoría de Marx. El valor se crea a través del trabajo y se materializa en forma de capital.

# Tiempo y Valor: La relación entre "tiempo" y "valor" destaca la noción de tiempo de trabajo socialmente necesario como una medida del valor de una mercancía, un concepto clave en la crítica marxista.

# Demanda y Trabajo: La relación entre "demanda" y "trabajo" subraya cómo la producción responde a las demandas del mercado. Marx examinó cómo la producción capitalista genera una demanda constante de mano de obra.

# Clase y División: La red muestra una conexión entre "clase" y "división". Esto hace referencia a la división de clases en la sociedad capitalista, un tema central en la obra de Marx.

#Estas conclusiones destacan la relevancia de conceptos clave en la teoría marxista y cómo están interconectados en su análisis del capitalismo.
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 el Capital")

# 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 el Capital")

#concluciones

# Tono emocional neutro: según el análisis de sentimientos, el tono emocional del texto es mayoritariamente neutro. Emociones como la ira, la alegría y el miedo están distribuidas uniformemente, lo que sugiere que el libro se centra principalmente en exponer la teoría económica y social en lugar de provocar fuertes reacciones emocionales en el lector.

# Confianza dominante: La emoción de "confianza" es una de las más destacadas en el análisis. Esto sugiere que el autor Karl Marx escribe con autoridad y confianza en sus ideas y argumentos. Esto puede indicar un alto grado de confianza en la validez de la teoría.

# Ausencia de emociones extremas: El análisis no muestra una gran cantidad de emociones extremas como "enfado" o "asco". Esto puede indicar que el autor está utilizando un lenguaje académico más objetivo en lugar de confiar en tácticas retóricas emocionales para persuadir a los lectores.

# Presencia de miedo y sorpresa: Aunque estas no son emociones primarias, la presencia de "miedo" y "sorpresa" en el análisis indica que Karl Marx está tratando temas como la economía o la sociedad que causan preocupación o sorpresa. en el lector Puede indicar eso. desigualdad.

# Equilibrio entre emociones positivas y negativas: La segunda visualización muestra el equilibrio entre emociones positivas y negativas en el texto. Esto puede reflejar la naturaleza equilibrada y analítica de El Capital, que ofrece tanto una crítica del sistema capitalista como sugerencias para el cambio social.