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.