*Este código (noticias 2022-23) se utilizó para ambas fuentes (es el mismo para todas las fuentes), para todos los años únicamnete modificando el nombre de las variables.
###NOTICIAS 2022-2023
Este chunk se centra en la obtención, procesamiento y análisis de textos provenientes de diversas noticias del año 2022-2023. Aquí hay una explicación paso a paso:
Cargar bibliotecas: Las bibliotecas tm y rvest se cargan para trabajar con texto y realizar scraping web, respectivamente. Definir URLs de noticias: Se especifica un conjunto de URLs correspondientes a noticias de interés. Iterar y descargar textos: Se recorre cada URL, se descarga el contenido de las noticias, y se guarda cada noticia como un archivo de texto con un nombre derivado de la URL. Limpiar el texto: Se define una función limpiar_texton2223 que toma un archivo de texto como entrada y realiza diversas operaciones de limpieza, como convertir a minúsculas, eliminar enlaces, etiquetas HTML, puntuaciones, números, y palabras comunes en español (stopwords). Aplicar limpieza a los archivos: La función de limpieza se aplica a cada archivo descargado, y los textos resultantes se almacenan en la lista textos_limpiosn2223. Crear un corpus: Utilizando la biblioteca tm, se crea un corpus con los textos limpios. Matriz de términos y documentos (DTM): Se genera una matriz de términos y documentos (DTM) utilizando la función DocumentTermMatrix. La DTM muestra la frecuencia de cada término en cada documento. Inspeccionar la DTM: La función inspect se utiliza para visualizar la DTM, lo que permite examinar la estructura y frecuencia de términos en los documentos.
# Cargar la biblioteca tm
library(tm)
## Loading required package: NLP
# Cargar la biblioteca rvest
library(rvest)
# Archivos a procesar
n2223 <- c(
"https://www.animalpolitico.com/sociedad/personas-discapacidad-trabajo-empleos-dignos",
"https://www.eluniversal.com.mx/opinion/roxana-munoz-hernandez/las-mujeres-con-discapacidad-en-las-organizaciones-incluyentes/",
"https://www.eluniversal.com.mx/cartera/excluye-sector-financiero-a-personas-discapacitadas/",
"https://elpais.com/economia/formacion/2023-06-30/la-ardua-inclusion-laboral-de-las-personas-con-discapacidad.html",
"https://www.infobae.com/sociedad/2023/07/06/el-75-de-las-personas-con-discapacidad-no-consigue-empleo-una-campana-hecha-con-ia-muestra-como-si-pueden-trabajar/",
"https://www.animalpolitico.com/2022/06/personas-discapacidad-sin-empleo-mujeres-vulnerables",
"https://www.eluniversal.com.mx/opinion/margarita-luna-ramos/personas-con-discapacidad-su-derecho-una-vida-autonoma-e-independiente",
"https://www.eluniversal.com.mx/nacion/mexico-inicia-sustentacion-de-informes-periodicos-ante-comite-de-derechos-humanos-de-personas-de-discapacidad",
"https://www.eluniversal.com.mx/nacion/aprueba-senado-mas-oportunidades-laborales-para-discapacitados",
"https://elpais.com/economia/negocios/2022-09-28/no-pienso-tirar-la-toalla-asi-se-abren-paso-los-jovenes-con-discapacidad-en-el-mercado-laboral.html"
)
# Iterar a través de las URLs y descargar los textos
archivosn2223 <- character(0)
for (url in n2223) {
paginan2223 <- read_html(url)
parrafos.notician2223 <- html_elements(paginan2223, "p")
text_contentn2223 <- html_text(parrafos.notician2223)
nombre_archivon2223 <- gsub("https://www.|/", "", url)
nombre_archivon2223 <- paste0(nombre_archivon2223, ".txt")
writeLines(text_contentn2223, nombre_archivon2223)
archivosn2223 <- c(archivosn2223, nombre_archivon2223)
cat("Archivo descargado y guardado como", nombre_archivon2223, "\n")
}
## Archivo descargado y guardado como animalpolitico.comsociedadpersonas-discapacidad-trabajo-empleos-dignos.txt
## Archivo descargado y guardado como eluniversal.com.mxopinionroxana-munoz-hernandezlas-mujeres-con-discapacidad-en-las-organizaciones-incluyentes.txt
## Archivo descargado y guardado como eluniversal.com.mxcarteraexcluye-sector-financiero-a-personas-discapacitadas.txt
## Archivo descargado y guardado como https:elpais.comeconomiaformacion2023-06-30la-ardua-inclusion-laboral-de-las-personas-con-discapacidad.html.txt
## Archivo descargado y guardado como infobae.comsociedad20230706el-75-de-las-personas-con-discapacidad-no-consigue-empleo-una-campana-hecha-con-ia-muestra-como-si-pueden-trabajar.txt
## Archivo descargado y guardado como animalpolitico.com202206personas-discapacidad-sin-empleo-mujeres-vulnerables.txt
## Archivo descargado y guardado como eluniversal.com.mxopinionmargarita-luna-ramospersonas-con-discapacidad-su-derecho-una-vida-autonoma-e-independiente.txt
## Archivo descargado y guardado como eluniversal.com.mxnacionmexico-inicia-sustentacion-de-informes-periodicos-ante-comite-de-derechos-humanos-de-personas-de-discapacidad.txt
## Archivo descargado y guardado como eluniversal.com.mxnacionaprueba-senado-mas-oportunidades-laborales-para-discapacitados.txt
## Archivo descargado y guardado como https:elpais.comeconomianegocios2022-09-28no-pienso-tirar-la-toalla-asi-se-abren-paso-los-jovenes-con-discapacidad-en-el-mercado-laboral.html.txt
# Función para limpiar el texto
limpiar_texton2223 <- function(archivo) {
texto <- readLines(archivo, warn = FALSE)
texto <- paste(texto, collapse = " ")
texton2223 <- tolower(texto)
texton2223 <- gsub("http\\S+|www\\.\\S+", "", texton2223 )
texton2223 <- gsub("<.*?>", "", texton2223)
texton2223 <- gsub("[[:punct:]]", "", texton2223 )
texton2223 <- gsub("\\d+", "", texton2223)
texton2223 <- gsub("\\s+", " ", texton2223 )
texton2223 <- gsub("<img [^>]*>", "", texton2223 )
texton2223 <- removeWords(texton2223, stopwords("es"))
return(texton2223 )
}
# Aplicar la función de limpieza solo a los archivos de la lista n23
textos_limpiosn2223 <- lapply(archivosn2223 , limpiar_texton2223 )
# Corpus con textos limpios
corpusn2223 <- Corpus(VectorSource(textos_limpiosn2223 ))
# Document Term Matrix
dtmn2223 <- DocumentTermMatrix(corpusn2223 )
# Ver la Matriz
inspect(dtmn2223 )
## <<DocumentTermMatrix (documents: 10, terms: 2017)>>
## Non-/sparse entries: 3059/17111
## Sparsity : 85%
## Maximal term length: 20
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs años derechos discapacidad empleo inclusión laboral mujeres personas
## 1 0 0 0 0 0 0 0 0
## 10 8 1 20 10 3 7 2 11
## 2 5 4 49 2 10 4 18 25
## 3 0 1 7 0 1 0 0 5
## 4 1 0 18 9 6 7 0 18
## 5 8 5 17 10 10 11 2 20
## 6 1 1 21 4 1 5 4 15
## 7 1 2 6 0 1 0 0 6
## 8 4 5 6 0 0 0 0 9
## 9 0 1 8 1 1 2 0 10
## Terms
## Docs población trabajo
## 1 0 0
## 10 3 6
## 2 5 18
## 3 5 1
## 4 0 1
## 5 6 17
## 6 0 1
## 7 0 0
## 8 1 1
## 9 3 7
En este chunk de código, se unen todos los textos limpios. Unir todos los textos limpios: Se concatenan todos los textos limpios previamente obtenidos en un solo vector llamado vectorn2223. Conteo total de cada término: Se calcula el conteo total de cada término sumando las columnas de la matriz de términos y documentos (DTM) utilizando colSums. Ordenar y mostrar términos más comunes: Los términos se ordenan en orden descendente según su frecuencia total en todos los documentos. Los 50 términos más comunes se muestran utilizando head y se almacenan en la variable terminos_comunes_limpion2223.
# Unir todos los textos limpios en un solo vector
vectorn2223 <- unlist(textos_limpiosn2223)
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_limpion2223 <- colSums(as.matrix(dtmn2223))
# Ordenar y mostrar los términos más comunes
terminos_comunes_limpion2223 <- sort(conteo_total_limpion2223, decreasing = TRUE)
head(terminos_comunes_limpion2223, 50)
## discapacidad personas trabajo empleo laboral
## 152 119 52 36 36
## inclusión años mujeres población derechos
## 33 28 26 23 20
## organizaciones social vida cuenta persona
## 20 20 17 16 16
## barreras datos educación mayor nacional
## 15 15 15 15 15
## acceso empresas discriminación trabajadores así
## 14 14 13 13 12
## méxico personal según tener universal
## 12 12 12 12 12
## colectivo falta grupo hacer menos
## 12 11 11 11 11
## parte políticas sociales formación condiciones
## 11 11 11 11 10
## fundación tasa mercado sector además
## 10 10 9 9 9
## accesibilidad aún bien condición cualquier
## 8 8 8 8 8
En este apartado, se utiliza la biblioteca wordcloud en R para crear una nube de palabras a partir de los términos más comunes previamente calculados. Primero, carga la biblioteca wordcloud necesaria para crear nubes de palabras. Names(terminos_comunes_limpio_di): Se utilizan los nombres de los términos más comunes como las palabras para la nube de palabras.
library(wordcloud)
## Loading required package: RColorBrewer
wordcloud(names(terminos_comunes_limpion2223), terminos_comunes_limpion2223, min.freq = 8, max.words = 200, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(10, "Paired"))
## Warning in wordcloud(names(terminos_comunes_limpion2223),
## terminos_comunes_limpion2223, : personas could not be fit on page. It will not
## be plotted.
Este bloque de código en R realiza una serie de acciones para refinar aún más el análisis del corpus de textos. Después, se eliminan las palabras específicas y stopwords en español: - palabras_eliminar_di: Una lista de palabras específicas que se quieren eliminar del corpus. - corpus2__di: Aplica la eliminación de palabras específicas al corpus original. - corpus3__di: Luego, elimina las stopwords en español del corpus resultante.
Se crea un nuevo Document-Term Matrix (DTM) y se suman las columnas del nuevo DTM para obtener el conteo total de cada término. Se ordenan y muestran los términos más comunes después de la limpieza adicional. Después, se crea una tabla de frecuencias de los términos después de la limpieza adicional y se crea un dataframe resultados_di que contiene los términos más comunes y sus frecuencias. Luego, se muestran las primeras 100 filas de este dataframe.
# Eliminar palabras específicas. ETAPA 1
palabras_eliminarn2223 <- c("null","gtagset","function","var","pagetype", "presidente", "interlocutor", "ramírez", "reyes","erika", "vcrowvccolumnvccolumntext", "docs","embargo","correo","ser", "vez","hacer","sólo","conocer","además","así","cada","través","mayo","aunque","tener","aún","busca","cuenta","aquí","menor","puedes","puede","pueden","parte","años","docs","día","villa","electrónico","mundo","puedan","situación","puertas","primer","dentro","agradecemos","potosí","mayor","número","forma","provisión","nacobre","centro","mayor","contamos","general","cuales","celaya","muchas","llevó","gran","hoy","evento","todas","san","número","obtener","lic","pas","dar","paso","cabo","seguir","san","manera","mismo","luis","sector","mejor","director","vida","aspace","equipo","compartida","wework","solo", "encuentran", "falta", "personal", "menos", "historias", "menores", "mayores", "historias", "grupo", "universal", "pais", "país", "queda", "cualquier", "oit", "según", "datos", "artículo", "bien", "nacional", "bienes", "tasa", "sociedad", "condiciones")
corpus2_n2223 <- tm_map(corpusn2223, removeWords, palabras_eliminarn2223)
## Warning in tm_map.SimpleCorpus(corpusn2223, removeWords,
## palabras_eliminarn2223): transformation drops documents
# Eliminar stopwords en español
corpus3_n2223 <- tm_map(corpus2_n2223, removeWords, stopwords("es"))
## Warning in tm_map.SimpleCorpus(corpus2_n2223, removeWords, stopwords("es")):
## transformation drops documents
# Repetimos el análisis y comparamos los términos y la nube
# Creamos nuevo dtm
dtm2_n2223 <- DocumentTermMatrix(corpus3_n2223)
#Ver matriz
inspect(dtm2_n2223)
## <<DocumentTermMatrix (documents: 10, terms: 1945)>>
## Non-/sparse entries: 2783/16667
## Sparsity : 86%
## Maximal term length: 20
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs derechos discapacidad empleo inclusión laboral mujeres organizaciones
## 1 0 0 0 0 0 0 0
## 10 1 20 10 3 7 2 0
## 2 4 49 2 10 4 18 17
## 3 1 7 0 1 0 0 0
## 4 0 18 9 6 7 0 1
## 5 5 17 10 10 11 2 2
## 6 1 21 4 1 5 4 0
## 7 2 6 0 1 0 0 0
## 8 5 6 0 0 0 0 0
## 9 1 8 1 1 2 0 0
## Terms
## Docs personas población trabajo
## 1 0 0 0
## 10 11 3 6
## 2 25 5 18
## 3 5 5 1
## 4 18 0 1
## 5 20 6 17
## 6 15 0 1
## 7 6 0 0
## 8 9 1 1
## 9 10 3 7
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_n2223 <- colSums(as.matrix(dtm2_n2223))
# Ordenar y mostrar los términos más comúnes
terminos_comunes_n2223 <- sort(conteo_total_n2223, decreasing = TRUE)
head(terminos_comunes_n2223)
## discapacidad personas trabajo empleo laboral inclusión
## 152 119 52 36 36 33
# Función para limpiar el texto
limpiar_texton2223 <- function(archivo) {
texton2223 <- readLines(archivosn2223, warn = FALSE)
texton2223 <- paste(texton2223, collapse = " ")
# Eliminar puntuación
texton2223 <- gsub("[[:punct:]]", "", texton2223)
# Eliminar preposiciones y superlativos
palabrasn2223 <- unlist(strsplit(texto, " "))
palabras_filtradasn2223 <- palabras[!(palabras %in% c(preposiciones, superlativos))]
# Volver a unir las palabras filtradas
#texto_filtrado <- paste(palabras_filtradas, collapse = " ")
}
# Obtener la tabla de frecuencias de los términos
tabla_frecuenciasn2223 <- table(conteo_total_n2223)
# Mostrar los términos más comunes junto con sus frecuencias
resultadosn2223 <- data.frame(Termino = names(terminos_comunes_n2223),
Frecuencia = terminos_comunes_n2223)
#Total = tabla_frecuenciasn2223[names(terminos_comunes_n2223)])
# Se despliega las primeras 100 palabras con mayor frecuencia
head(resultadosn2223, 100)
## Termino Frecuencia
## discapacidad discapacidad 152
## personas personas 119
## trabajo trabajo 52
## empleo empleo 36
## laboral laboral 36
## inclusión inclusión 33
## mujeres mujeres 26
## población población 23
## derechos derechos 20
## organizaciones organizaciones 20
## social social 20
## persona persona 16
## barreras barreras 15
## educación educación 15
## acceso acceso 14
## empresas empresas 14
## discriminación discriminación 13
## trabajadores trabajadores 13
## méxico méxico 12
## colectivo colectivo 12
## políticas políticas 11
## sociales sociales 11
## formación formación 11
## fundación fundación 10
## mercado mercado 9
## accesibilidad accesibilidad 8
## condición condición 8
## desarrollo desarrollo 8
## enfrentan enfrentan 8
## ley ley 8
## motriz motriz 8
## organización organización 8
## públicas públicas 8
## centros centros 7
## derecho derecho 7
## mujer mujer 7
## onu onu 7
## puestos puestos 7
## apoyo apoyo 7
## laborales laborales 7
## mesonero mesonero 7
## salud salud 7
## veces veces 7
## apoyos apoyos 7
## bienestar bienestar 7
## bajo bajo 6
## capacidad capacidad 6
## compañía compañía 6
## contar contar 6
## diversos diversos 6
## edición edición 6
## establece establece 6
## estrategias estrategias 6
## hombres hombres 6
## participación participación 6
## porcentaje porcentaje 6
## superior superior 6
## uso uso 6
## visual visual 6
## momento momento 6
## contratación contratación 6
## contratos contratos 6
## nivel nivel 6
## pobreza pobreza 6
## trabaja trabaja 6
## acciones acciones 5
## acepto acepto 5
## acontecer acontecer 5
## actividades actividades 5
## ajustes ajustes 5
## alguna alguna 5
## américa américa 5
## arrancar arrancar 5
## atender atender 5
## autorización autorización 5
## comprender comprender 5
## contenidos contenidos 5
## contratar contratar 5
## copyright copyright 5
## diarios diarios 5
## diseño diseño 5
## estudio estudio 5
## existir existir 5
## expresamente expresamente 5
## física física 5
## guía guía 5
## igual igual 5
## incluyentes incluyentes 5
## ingreso ingreso 5
## ingresos ingresos 5
## instalaciones instalaciones 5
## instituciones instituciones 5
## intelectual intelectual 5
## leer leer 5
## miembro miembro 5
## millones millones 5
## negoceos negoceos 5
## noticioso noticioso 5
## objetivo objetivo 5
## periodística periodística 5
Se crean una nueva nube de palabras limpia, ya que posteriormente se hizo nuevamente una limpieza de palabras manualmente. Se utiliza la biblioteca wordcloud en R para crear una nube de palabras a partir de los términos más comunes previamente calculados. Esta limpieza manual se hizo para obtener unicamente aquellas palabras que nos ayudarán a realizar un análisis y obtener hallazgos.
wordcloud(names(terminos_comunes_n2223),
terminos_comunes_n2223,
min.freq = 7, # frecuencia minima de las palabras
max.words = 100, # cuantas palabras caben en la nube
random.order = FALSE,
rot.per = 0.35,
#brewer.pal es una paleta de colores
colors = brewer.pal(10, "Paired"))
Este código en R realiza un análisis de tópicos y sentimiento en un
conjunto de datos de transcripciones (almacenado en el objeto n2223).
Comienza calculando el análisis de sentimiento de las transcripciones y
luego procede a construir un modelo de tópicos utilizando el algoritmo
Latent Dirichlet Allocation (LDA). Se visualizan los términos más
relevantes de cada tópico mediante un gráfico de barras utilizando
ggplot2. El resultado final es un conjunto de términos clave por tópico,
almacenados en el dataframe terms_topn2223. Este código es útil para
explorar y entender la estructura temática de las transcripciones, así
como para identificar términos importantes en cada tópico.
# Carga paquetes necesarios
library(tidyverse) # Conjunto de paquetes para manipulación y visualización de datos
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::annotate() masks NLP::annotate()
## ✖ dplyr::filter() masks stats::filter()
## ✖ readr::guess_encoding() masks rvest::guess_encoding()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidytext)# Herramientas para trabajar con texto en formato tidy
library(dplyr)# Paquete para manipulación de datos
library(sentimentr)# Herramientas para análisis de sentimiento
library(topicmodels)# Modelos de tópicos
library(tm)# Text Mining
library(ggplot2) # Creación de gráficos
# Leer el archivo txt
transcriptionn2223 <- n2223
# Analizar el sentimiento
sentimentn2223 <- sentiment_by(transcriptionn2223)
# Convert dtm2_n2223 to a matrix
dtm2_n2223 <- as.matrix(dtm2_n2223)
# Remove rows with all zeros
dtm2_n2223 <- dtm2_n2223[rowSums(dtm2_n2223) > 0, ]
# Remove columns with all zeros
dtm2_n2223 <- dtm2_n2223[, colSums(dtm2_n2223) > 0]
# Generar un modelo de topic models
ldan2223 <- LDA(dtm2_n2223, k = 3)
# Obtener los términos más importantes de cada tópico
termsn2223 <- tidy(ldan2223, matrix = "beta") %>%
group_by(topic) %>%
top_n(7, wt = beta) %>%
ungroup()
# Generar el gráfico
ggplot(termsn2223, aes(x = reorder_within(term, beta, topic), y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 3, scales = "free_y") +
theme(strip.text = element_text(size = 8)) +
labs(x = "Beta", y = "Term") +
scale_x_reordered()
# Obtener los términos más importantes de cada tópico en un dataframe
terms_topn2223 <- termsn2223 %>%
select(topic, term, beta)
Este código en R utiliza las bibliotecas syuzhet, RColorBrewer y tm para realizar un análisis de sentimientos en un conjunto de textos representados por el objeto resultadosn2223. Primero, se concatenan los textos limpios en un solo vector llamado texto_palabrasn2223. Luego, se utiliza la función get_nrc_sentiment de la biblioteca syuzhet para obtener un análisis de sentimientos basado en el diccionario NRC. Se crea un diccionario de traducción de emociones para cambiar los nombres de las columnas en el dataframe resultante (sentimientos_df_n2223). Finalmente, se genera un gráfico de barras horizontales para visualizar la distribución de las emociones en los textos, con etiquetas de emociones rotadas para mejorar la legibilidad. El resultado es un análisis visual de las emociones presentes en los textos analizados.
# Cargar las bibliotecas necesarias
library(syuzhet)
##
## Attaching package: 'syuzhet'
## The following object is masked from 'package:sentimentr':
##
## get_sentences
library(RColorBrewer)
library(tm)
# Concatenar los textos limpios en un solo vector
texto_palabrasn2223<- unlist(resultadosn2223)
# Obtener el análisis de sentimientos con syuzhet
sentimientos_df_n2223 <- get_nrc_sentiment(texto_palabrasn2223 , lang = "spanish")
# Crear un diccionario de traducción de emociones
diccionario_emociones_n2223 <- c(
"anger" = "enojo",
"anticipation" = "anticipación",
"disgust" = "asco",
"fear" = "miedo",
"joy" = "alegría",
"sadness" = "tristeza",
"surprise" = "sorpresa",
"trust" = "confianza",
"negative" = "negativo",
"positive" = "positivo"
)
# Cambiar los nombres de las emociones en sentimientos_df
colnames(sentimientos_df_n2223) <- diccionario_emociones_n2223
# Mostrar los resultados
head(sentimientos_df_n2223)
## enojo anticipación asco miedo alegría tristeza sorpresa confianza negativo
## 1 0 0 0 0 0 1 0 0 2
## 2 0 0 0 0 0 0 0 0 0
## 3 0 1 0 0 1 0 1 1 0
## 4 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0
## positivo
## 1 0
## 2 0
## 3 2
## 4 0
## 5 1
## 6 0
summary(sentimientos_df_n2223)
## enojo anticipación asco miedo
## Min. :0.000000 Min. :0.00000 Min. :0.000000 Min. :0.00000
## 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.00000
## Median :0.000000 Median :0.00000 Median :0.000000 Median :0.00000
## Mean :0.007455 Mean :0.01465 Mean :0.006941 Mean :0.01337
## 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.00000
## Max. :2.000000 Max. :2.00000 Max. :2.000000 Max. :4.00000
## alegría tristeza sorpresa confianza
## Min. :0.00000 Min. :0.00000 Min. :0.000000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.000000 Median :0.00000
## Mean :0.01131 Mean :0.01542 Mean :0.005913 Mean :0.03136
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.00000
## Max. :2.00000 Max. :5.00000 Max. :1.000000 Max. :3.00000
## negativo positivo
## Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000
## Mean :0.02802 Mean :0.04447
## 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :5.00000 Max. :4.00000
# Ajustar parámetros para mejorar la legibilidad y rotar las etiquetas
par(mar = c(5, 5, 4, 2) + 0.1)
# Crear un gráfico de barras con etiquetas rotadas
barplot(
colSums(sentimientos_df_n2223),
space = 0.2,
horiz = FALSE,
las = 2, # Rotar las etiquetas
cex.names = 0.7,
col = brewer.pal(n = ncol(sentimientos_df_n2223), name = "Set3"),
main = "Análisis de Sentimientos noticias 2022-2023",
xlab = "Emociones",
ylab = NULL
)
###ASC 2019
Repitiendo el mismo procedimiento que en noticias, se cargaron ambas librerías, se hizo la descarga de los datos sólo de aquellos links que nos fueran de utilidad. En este chunk, se están realizando acciones similares a las anteriores, específicamente para un conjunto diferente de URLs relacionadas con noticias en el sitio web “www.juntos.org.mx”. Este bloque de código realiza la limpieza y procesamiento de texto para un conjunto específico de noticias, generando una matriz de términos y documentos que puede ser utilizada para análisis posteriores. Aquí está una explicación paso a paso:
Cargar bibliotecas y URLs: Se cargan las bibliotecas tm y rvest, y se definen las URLs de las noticias en el vector asc19. Iterar y descargar textos: Se itera sobre las URLs, se descargan los textos de las noticias y se almacenan en archivos de texto. Los nombres de los archivos se generan a partir de las URL y se guardan en el vector archivosasc19. Función para limpiar el texto: Se define la función limpiar_textoasc19 para limpiar el texto de los archivos. Esta función convierte el texto a minúsculas, elimina enlaces, etiquetas HTML, signos de puntuación, números, espacios adicionales y palabras comunes en español (stopwords). Aplicar la función de limpieza: Se aplica la función de limpieza a los archivos descargados, y los textos limpios se almacenan en textos_limpiosasc19. Crear Corpus y Document Term Matrix (DTM): Se crea un corpus con los textos limpios y, a partir de este corpus, se genera una matriz de términos y documentos (DTM) utilizando DocumentTermMatrix. Ver la Matriz: Se utiliza la función inspect para ver la matriz resultante dtmasc19.
# Cargar la biblioteca tm
library(tm)
# Cargar la biblioteca rvest
library(rvest)
# Archivos a procesar
asc19 <- c(
"https://www.juntos.org.mx/2019/04/proximamente-empodera-en-villa-de-reyes/",
"https://www.juntos.org.mx/2019/03/33-personas-con-discapacidad-listos-para-comenzar-a-trabajar/",
"https://www.juntos.org.mx/2019/05/inicia-la-18va-generacion-empodera-en-villa-de-reyes/",
"https://www.juntos.org.mx/2019/05/inclusion-laboral-de-mujeres-con-discapacidad/",
"https://www.juntos.org.mx/2019/06/el-ejercito-aplica-inclusion-laboral-dentro-de-sus-filas/",
"https://www.juntos.org.mx/2019/06/cynthia-molano-primera-diputada-de-talla-baja-en-mexico-video/",
"https://www.juntos.org.mx/2019/06/un-estudio-sobre-la-realidad-laboral-de-las-personas-con-paralisis-cerebral/",
"https://www.juntos.org.mx/2019/07/sabias-que-cinepolis-ha-contratado-a-400-personas-con-discapacidad/",
"https://www.juntos.org.mx/2019/10/seguridad-laboral-para-personas-con-discapacidad/",
"https://www.juntos.org.mx/2019/06/empodera-18va-generacion-24-personas-con-discapacidad-listas-para-trabajar/",
"https://www.juntos.org.mx/2019/06/como-preparase-para-recibir-a-una-persona-con-discapacidad-en-la-empresa/",
"https://www.juntos.org.mx/2019/07/27-personas-con-discapacidad-listas-para-la-vida-laboral-empodera/",
"https://www.juntos.org.mx/2019/07/que-hacer-si-tengo-una-discapacidad-y-busco-trabajo/"
)
# Iterar a través de las URLs y descargar los textos
archivosasc19 <- character(0)
for (url in asc19 ) {
paginaasc19 <- read_html(url)
parrafos.noticiaasc19 <- html_elements(paginaasc19 , "p")
text_contentasc19 <- html_text(parrafos.noticiaasc19 )
nombre_archivoasc19 <- gsub("https://www.juntos.org.mx/|/", "", url)
nombre_archivoasc19 <- paste0(nombre_archivoasc19, ".txt")
writeLines(text_contentasc19 , nombre_archivoasc19 )
archivosasc19 <- c(archivosasc19 , nombre_archivoasc19 )
cat("Archivo descargado y guardado como", nombre_archivoasc19 , "\n")
}
## Archivo descargado y guardado como 201904proximamente-empodera-en-villa-de-reyes.txt
## Archivo descargado y guardado como 20190333-personas-con-discapacidad-listos-para-comenzar-a-trabajar.txt
## Archivo descargado y guardado como 201905inicia-la-18va-generacion-empodera-en-villa-de-reyes.txt
## Archivo descargado y guardado como 201905inclusion-laboral-de-mujeres-con-discapacidad.txt
## Archivo descargado y guardado como 201906el-ejercito-aplica-inclusion-laboral-dentro-de-sus-filas.txt
## Archivo descargado y guardado como 201906cynthia-molano-primera-diputada-de-talla-baja-en-mexico-video.txt
## Archivo descargado y guardado como 201906un-estudio-sobre-la-realidad-laboral-de-las-personas-con-paralisis-cerebral.txt
## Archivo descargado y guardado como 201907sabias-que-cinepolis-ha-contratado-a-400-personas-con-discapacidad.txt
## Archivo descargado y guardado como 201910seguridad-laboral-para-personas-con-discapacidad.txt
## Archivo descargado y guardado como 201906empodera-18va-generacion-24-personas-con-discapacidad-listas-para-trabajar.txt
## Archivo descargado y guardado como 201906como-preparase-para-recibir-a-una-persona-con-discapacidad-en-la-empresa.txt
## Archivo descargado y guardado como 20190727-personas-con-discapacidad-listas-para-la-vida-laboral-empodera.txt
## Archivo descargado y guardado como 201907que-hacer-si-tengo-una-discapacidad-y-busco-trabajo.txt
# Función para limpiar el texto
limpiar_textoasc19 <- function(archivo) {
texto <- readLines(archivo, warn = FALSE)
texto <- paste(texto, collapse = " ")
textoasc19 <- tolower(texto)
textoasc19 <- gsub("http\\S+|www\\.\\S+", "", textoasc19 )
textoasc19 <- gsub("<.*?>", "", textoasc19 )
textoasc19 <- gsub("[[:punct:]]", "", textoasc19 )
textoasc19 <- gsub("\\d+", "", textoasc19 )
textoasc19 <- gsub("\\s+", " ", textoasc19 )
textoasc19 <- gsub("<img [^>]*>", "", textoasc19 )
textoasc19 <- removeWords(textoasc19, stopwords("es"))
return(textoasc19 )
}
# Aplicar la función de limpieza solo a los archivos de la lista n23
textos_limpiosasc19 <- lapply(archivosasc19 , limpiar_textoasc19 )
# Corpus con textos limpios
corpusasc19 <- Corpus(VectorSource(textos_limpiosasc19 ))
# Document Term Matrix
dtmasc19 <- DocumentTermMatrix(corpusasc19 )
# Ver la Matriz
inspect(dtmasc19 )
## <<DocumentTermMatrix (documents: 13, terms: 1342)>>
## Non-/sparse entries: 1955/15491
## Sparsity : 89%
## Maximal term length: 53
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs discapacidad empodera empresa inclusión juntos laboral personas programa
## 10 2 3 0 0 1 2 2 3
## 11 4 0 3 3 1 2 2 0
## 12 2 2 1 1 0 2 2 1
## 13 8 1 1 4 1 5 10 0
## 2 5 5 0 2 2 4 6 4
## 4 19 3 1 11 7 7 12 3
## 5 5 0 0 2 0 0 5 0
## 7 2 0 0 2 0 8 13 0
## 8 7 1 6 3 1 3 9 1
## 9 9 0 1 0 0 1 4 1
## Terms
## Docs trabajo vez
## 10 3 2
## 11 2 1
## 12 2 2
## 13 1 0
## 2 5 4
## 4 6 2
## 5 0 0
## 7 0 0
## 8 4 0
## 9 9 1
Este bloque de código crea un vector que contiene todos los textos limpios de las noticias, realiza un recuento total de cada término y muestra los 50 términos más comunes junto con sus frecuencias. Esto puede ser útil para comprender qué términos son más frecuentes en el conjunto de noticias seleccionado.
# Unir todos los textos limpios en un solo vector
vectorasc19 <- unlist(textos_limpiosasc19)
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_limpioasc19 <- colSums(as.matrix(dtmasc19))
# Ordenar y mostrar los términos más comunes
terminos_comunes_limpioasc19 <- sort(conteo_total_limpioasc19, decreasing = TRUE)
head(terminos_comunes_limpioasc19, 50)
## personas discapacidad laboral trabajo inclusión
## 74 71 36 36 29
## empodera programa empresa juntos vez
## 22 17 14 14 14
## empleo registrad ser empresas mujeres
## 13 13 13 13 13
## diplomado día capacitación erika participantes
## 11 10 9 9 9
## trabajar situación experiencia apoyo reyes
## 9 9 8 8 7
## villa seguridad sociedad además conocer
## 7 7 7 7 7
## social sólo cerebral parálisis correo
## 7 7 7 7 7
## electrónico ramírez cada tener así
## 7 6 6 6 6
## cuenta desarrollo embargo hacer población
## 6 6 6 6 6
## necesidades aquí generación herramientas primer
## 6 5 5 5 5
Este fragmento de código en R utiliza la biblioteca wordcloud para crear una nube de palabras basada en la frecuencia de los términos en el conjunto de noticias “asc19”.
Importante: in.freq = 8: Establece el umbral mínimo de frecuencia para incluir un término en la nube de palabras. En este caso, se incluirán solo los términos que aparecen al menos 8 veces. max.words = 200: Limita el número máximo de palabras que se mostrarán en la nube. En este caso, se mostrarán hasta 200 palabras.
library(wordcloud)
wordcloud(names(terminos_comunes_limpioasc19), terminos_comunes_limpioasc19, min.freq = 8, max.words = 200, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(8, "Dark2"))
Este bloque de código es parte de un proceso de limpieza de datos y
análisis exploratorio del conjunto de noticias “asc19”, centrándose en
eliminar palabras no deseadas y stopwords para resaltar los términos más
relevantes.
palabras_eliminarasc19: Es un vector que contiene palabras específicas que se desean eliminar del corpus, como palabras comunes, nombres propios, y otras que no aportan significado relevante al análisis.
corpus2_asc19 <- tm_map(corpusasc19, removeWords, palabras_eliminarasc19): Utiliza la función removeWords de la biblioteca tm para eliminar las palabras especificadas en palabras_eliminarasc19 del corpus.
corpus3_asc19 <- tm_map(corpus2_asc19, removeWords, stopwords(“es”)): Elimina las stopwords en español utilizando la función removeWords de la biblioteca tm y la lista de stopwords en español proporcionada por stopwords(“es”).
dtm2_asc19 <- DocumentTermMatrix(corpus3_asc19): Crea una nueva matriz de términos de documentos (DTM) después de la limpieza del corpus.
inspect(dtm2_asc19): Muestra la matriz de términos de documentos para que puedas examinarla y verificar la efectividad de las operaciones de limpieza.
conteo_total_asc19 <- colSums(as.matrix(dtm2_asc19)): Calcula el conteo total de cada término en el nuevo DTM.
terminos_comunes_asc19 <- sort(conteo_total_asc19, decreasing = TRUE): Ordena los términos por frecuencia en orden descendente.
resultadosasc19 <- data.frame(Termino = names(terminos_comunes_asc19), Frecuencia = terminos_comunes_asc19): Crea un marco de datos que muestra los términos más comunes y su frecuencia.
head(resultadosasc19, 100): Muestra las primeras 100 filas del marco de datos resultadosasc19, que contienen los términos más comunes junto con sus frecuencias.
# Eliminar palabras específicas. ETAPA 1
palabras_eliminarasc19 <- c("null","gtagset","function","var","pagetype", "presidente", "interlocutor", "ramírez", "reyes","erika", "vcrowvccolumnvccolumntext", "docs","embargo","correo","ser", "vez","hacer","sólo","conocer","además","así","cada","través","mayo","aunque","tener","aún","busca","cuenta","aquí","menor","puedes","puede","pueden","parte","años","docs","día","villa","electrónico","mundo","puedan","situación","puertas","primer","dentro","agradecemos","nnvcsingleimage","registrad","aspace","municipal", "información", "población", "vida")
corpus2_asc19 <- tm_map(corpusasc19, removeWords, palabras_eliminarasc19)
## Warning in tm_map.SimpleCorpus(corpusasc19, removeWords,
## palabras_eliminarasc19): transformation drops documents
# Eliminar stopwords en español
corpus3_asc19 <- tm_map(corpus2_asc19, removeWords, stopwords("es"))
## Warning in tm_map.SimpleCorpus(corpus2_asc19, removeWords, stopwords("es")):
## transformation drops documents
# Repetimos el análisis y comparamos los términos y la nube
# Creamos nuevo dtm
dtm2_asc19 <- DocumentTermMatrix(corpus3_asc19)
#Ver matriz
inspect(dtm2_asc19)
## <<DocumentTermMatrix (documents: 13, terms: 1297)>>
## Non-/sparse entries: 1777/15084
## Sparsity : 89%
## Maximal term length: 53
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs discapacidad empleo empodera empresa inclusión juntos laboral personas
## 10 2 1 3 0 0 1 2 2
## 11 4 0 0 3 3 1 2 2
## 12 2 0 2 1 1 0 2 2
## 13 8 1 1 1 4 1 5 10
## 2 5 3 5 0 2 2 4 6
## 4 19 3 3 1 11 7 7 12
## 5 5 0 0 0 2 0 0 5
## 7 2 3 0 0 2 0 8 13
## 8 7 0 1 6 3 1 3 9
## 9 9 0 0 1 0 0 1 4
## Terms
## Docs programa trabajo
## 10 3 3
## 11 0 2
## 12 1 2
## 13 0 1
## 2 4 5
## 4 3 6
## 5 0 0
## 7 0 0
## 8 1 4
## 9 1 9
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_asc19 <- colSums(as.matrix(dtm2_asc19))
# Ordenar y mostrar los términos más comúnes
terminos_comunes_asc19 <- sort(conteo_total_asc19, decreasing = TRUE)
head(terminos_comunes_asc19)
## personas discapacidad laboral trabajo inclusión empodera
## 74 71 36 36 29 22
# Función para limpiar el texto
limpiar_textoasc19 <- function(archivo) {
textoasc19 <- readLines(archivosasc19, warn = FALSE)
textoasc19 <- paste(textoasc19, collapse = " ")
# Eliminar puntuación
textoasc19 <- gsub("[[:punct:]]", "", textoasc19)
# Eliminar preposiciones y superlativos
palabrasasc19 <- unlist(strsplit(texto, " "))
palabras_filtradasasc19 <- palabras[!(palabras %in% c(preposiciones, superlativos))]
# Volver a unir las palabras filtradas
#texto_filtrado <- paste(palabras_filtradas, collapse = " ")
}
# Obtener la tabla de frecuencias de los términos
tabla_frecuenciasasc19 <- table(conteo_total_asc19)
# Mostrar los términos más comunes junto con sus frecuencias
resultadosasc19 <- data.frame(Termino = names(terminos_comunes_asc19),
Frecuencia = terminos_comunes_asc19)
#Total = tabla_frecuenciasasc19[names(terminos_comunes_asc19)])
# Se despliega las primeras 100 palabras con mayor frecuencia
head(resultadosasc19, 100)
## Termino Frecuencia
## personas personas 74
## discapacidad discapacidad 71
## laboral laboral 36
## trabajo trabajo 36
## inclusión inclusión 29
## empodera empodera 22
## programa programa 17
## empresa empresa 14
## juntos juntos 14
## empleo empleo 13
## empresas empresas 13
## mujeres mujeres 13
## diplomado diplomado 11
## capacitación capacitación 9
## participantes participantes 9
## trabajar trabajar 9
## experiencia experiencia 8
## apoyo apoyo 8
## seguridad seguridad 7
## sociedad sociedad 7
## social social 7
## cerebral cerebral 7
## parálisis parálisis 7
## desarrollo desarrollo 6
## necesidades necesidades 6
## generación generación 5
## herramientas herramientas 5
## barreras barreras 5
## oportunidades oportunidades 5
## prejuicios prejuicios 5
## trabajadores trabajadores 5
## condiciones condiciones 5
## cuerpo cuerpo 5
## instituciones instituciones 5
## riesgo riesgo 5
## emergencia emergencia 5
## manera manera 4
## realizar realizar 4
## vcrowvccolumnvcsingleimage vcrowvccolumnvcsingleimage 4
## actividades actividades 4
## capacidades capacidades 4
## derechos derechos 4
## efectiva efectiva 4
## equipo equipo 4
## habilidades habilidades 4
## lograr lograr 4
## luis luis 4
## participar participar 4
## potosí potosí 4
## proceso proceso 4
## san san 4
## sociales sociales 4
## sueño sueño 4
## cabo cabo 4
## cuales cuales 4
## muchas muchas 4
## proyecto proyecto 4
## acceso acceso 4
## acciones acciones 4
## debe debe 4
## diversidad diversidad 4
## enfrentan enfrentan 4
## fátima fátima 4
## género género 4
## mamá mamá 4
## méxico méxico 4
## necesario necesario 4
## perspectiva perspectiva 4
## trata trata 4
## militar militar 4
## nacional nacional 4
## públicas públicas 4
## espacio espacio 4
## acuerdo acuerdo 4
## atención atención 4
## estudio estudio 4
## integración integración 4
## cinépolis cinépolis 4
## comentario comentario 4
## nombre nombre 4
## web web 4
## abril abril 3
## briones briones 3
## comunidad comunidad 3
## crear crear 3
## entrevistas entrevistas 3
## gerente gerente 3
## módulo módulo 3
## nueva nueva 3
## obtener obtener 3
## presidenta presidenta 3
## quieres quieres 3
## vccolumntextvccolumnvcrow vccolumntextvccolumnvcrow 3
## ayuda ayuda 3
## cambio cambio 3
## comunicación comunicación 3
## conseguir conseguir 3
## diferentes diferentes 3
## décimo décimo 3
## entorno entorno 3
Este código generará una nube de palabras visualmente atractiva donde el tamaño de cada palabra estará relacionado con su frecuencia en el conjunto de noticias “asc19”. Se realizó una nube nueva con las palabras eliminadas manualmente.
wordcloud(names(terminos_comunes_asc19),
terminos_comunes_asc19,
min.freq = 5, # frecuencia minima de las palabras
max.words = 100, # cuantas palabras caben en la nube
random.order = FALSE,
rot.per = 0.35,
#brewer.pal es una paleta de colores
colors = brewer.pal(10, "Paired"))
Este bloque de código realiza un análisis de sentimiento y genera un
modelo de tópicos (topic model) para el conjunto de noticias “asc19”.
Carga las bibliotecas necesarias, realiza un análisis de sentimiento,
genera un modelo de tópicos con LDA, obtiene los términos más
importantes de cada tópico y finalmente crea un gráfico de barras para
visualizar estos términos clave. Se realizó algo similar a lo de
noticias 2022-2023 y en cada línea del código se explica lo que se
realiza en cada una.
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
# Leer el archivo txt
transcripcion19 <- asc19
# Analizar el sentimiento
sentimiento19 <- sentiment_by(transcripcion19)
# Generar un modelo de topic models
lda19 <- LDA(dtm2_asc19, k = 3)
# Obtener los términos más importantes de cada tópico
terms19 <- tidy(lda19, matrix = "beta") %>%
group_by(topic) %>%
top_n(5, wt = beta)
# Generar el gráfico
ggplot(terms19, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 3)
# Obtener los términos más importantes de cada tópico en un dataframe
terms19 <- tidy(lda19, matrix = "beta")
terms19 <- terms19 %>%
select(term, beta)
Este bloque de código realiza un análisis de sentimientos para un conjunto de textos y genera un gráfico de barras para visualizar la distribución de emociones. Utiliza el paquete “syuzhet”, traduce las emociones, muestra los resultados y crea un gráfico de barras para visualizar la distribución de las emociones en los textos analizados.
Cargar bibliotecas necesarias: syuzhet: Proporciona funciones para el análisis de sentimientos. RColorBrewer: Ofrece paletas de colores para gráficos. tm: Herramientas para el procesamiento de texto y creación de corpus.
Concatenar los textos limpios en un solo vector: Se toma el resultado del análisis de términos comunes (resultadosasc19) y se une en un solo vector llamado texto_palabrasasc19.
Obtener el análisis de sentimientos con syuzhet: Utiliza la función get_nrc_sentiment para realizar el análisis de sentimientos en el vector de texto previamente creado (texto_palabrasasc19).
Crear un diccionario de traducción de emociones: Define un diccionario para traducir los nombres de las emociones del resultado del análisis (sentimientos_df_asc19).
Mostrar los resultados del análisis de sentimientos: Muestra las primeras filas del dataframe resultado (head(sentimientos_df_asc19)) y proporciona un resumen estadístico (summary(sentimientos_df_asc19)).
# Cargar las bibliotecas necesarias
library(syuzhet)
library(RColorBrewer)
library(tm)
# Concatenar los textos limpios en un solo vector
texto_palabrasasc19<- unlist(resultadosasc19)
# Obtener el análisis de sentimientos con syuzhet
sentimientos_df_asc19 <- get_nrc_sentiment(texto_palabrasasc19 , lang = "spanish")
# Crear un diccionario de traducción de emociones
diccionario_emociones_asc19 <- c(
"anger" = "enojo",
"anticipation" = "anticipación",
"disgust" = "asco",
"fear" = "miedo",
"joy" = "alegría",
"sadness" = "tristeza",
"surprise" = "sorpresa",
"trust" = "confianza",
"negative" = "negativo",
"positive" = "positivo"
)
# Cambiar los nombres de las emociones en sentimientos_df
colnames(sentimientos_df_asc19) <- diccionario_emociones_asc19
# Mostrar los resultados
head(sentimientos_df_asc19)
## enojo anticipación asco miedo alegría tristeza sorpresa confianza negativo
## 1 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 1 0 0 2
## 3 0 0 0 0 0 0 0 0 0
## 4 0 1 0 0 1 0 1 1 0
## 5 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0
## positivo
## 1 0
## 2 0
## 3 1
## 4 2
## 5 0
## 6 0
summary(sentimientos_df_asc19)
## enojo anticipación asco miedo
## Min. :0.000000 Min. :0.00000 Min. :0.000000 Min. :0.000000
## 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.000000
## Median :0.000000 Median :0.00000 Median :0.000000 Median :0.000000
## Mean :0.006939 Mean :0.01812 Mean :0.001542 Mean :0.009252
## 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.000000
## Max. :4.000000 Max. :3.00000 Max. :1.000000 Max. :2.000000
## alegría tristeza sorpresa confianza
## Min. :0.00000 Min. :0.000000 Min. :0.000000 Min. :0.000
## 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.000
## Median :0.00000 Median :0.000000 Median :0.000000 Median :0.000
## Mean :0.01234 Mean :0.007325 Mean :0.007325 Mean :0.032
## 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.000000 3rd Qu.:0.000
## Max. :2.00000 Max. :1.000000 Max. :1.000000 Max. :3.000
## negativo positivo
## Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000
## Mean :0.0185 Mean :0.0559
## 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :5.0000 Max. :4.0000
# Ajustar parámetros para mejorar la legibilidad y rotar las etiquetas
par(mar = c(5, 5, 4, 2) + 0.1)
# Crear un gráfico de barras con etiquetas rotadas
barplot(
colSums(sentimientos_df_asc19),
space = 0.2,
horiz = FALSE,
las = 2, # Rotar las etiquetas
cex.names = 0.7,
col = brewer.pal(n = ncol(sentimientos_df_asc19), name = "Set3"),
main = "Análisis de Sentimientos de Asociación Civil 2018-2019",
xlab = "Emociones",
ylab = NULL
)
# Agregar etiquetas a las barras
text(
x = barplot(
colSums(sentimientos_df_asc19),
space = 0.2,
horiz = FALSE,
las = 2,
col = brewer.pal(n = ncol(sentimientos_df_asc19), name = "Set3"),
plot = FALSE
),
y = -0.5, # Ubicación vertical de las etiquetas
labels = colSums(sentimientos_df_asc19), # Números para cada emoción
pos = 3, # Posición de las etiquetas (3 = parte superior)
cex = 0.7
)
###ASC 2020-2021
Cargar bibliotecas necesarias: tm: Proporciona herramientas para el procesamiento de texto y la creación de corpus. rvest: Facilita la extracción de información de páginas web.
Definir URLs de noticias: Se crea un vector llamado asc2021 que contiene las URLs de varias noticias relacionadas con la inclusión laboral de personas con discapacidad.
Iterar a través de las URLs y descargar los textos: Utiliza rvest para leer el contenido HTML de cada URL, extrae los párrafos de texto (parrafos.noticiaasc2021) y guarda el contenido en archivos de texto.
Función para limpiar el texto: Define la función limpiar_textoasc2021 que recibe un archivo como entrada, realiza diversas operaciones de limpieza (eliminación de HTML, puntuación, números, etc.) y convierte el texto a minúsculas. Además, se eliminan las stopwords en español.
Aplicar la función de limpieza a los archivos de la lista: Utiliza la función lapply para aplicar la función de limpieza a cada archivo descargado y crea una lista de textos limpios llamada textos_limpiosasc2021.
Crear corpus con textos limpios: Crea un corpus (corpusasc2021) con los textos limpios obtenidos.
Crear Document Term Matrix (DTM): Utiliza DocumentTermMatrix para construir una matriz término-documento (dtmasc2021) a partir del corpus y ves la matriz al final.
# Cargar la biblioteca tm
library(tm)
# Cargar la biblioteca rvest
library(rvest)
# Archivos a procesar
asc2021 <- c(
"https://www.juntos.org.mx/2020/05/dia-del-trabajador-y-la-inclusion/",
"https://www.juntos.org.mx/2021/08/juntos-llevo-a-cabo-feria-del-empleo-para-personas-con-discapacidad",
"https://www.juntos.org.mx/2021/12/la-secretaria-del-trabajo-se-compromete-con-las-personas-con-discapacidad/",
"https://www.juntos.org.mx/2021/02/27-de-febrero-dia-de-la-inclusion-laboral/",
"https://www.juntos.org.mx/2021/10/el-dia-de-hoy-30-personas-con-discapacidad-mas-tienen-la-oportunidad-de-un-empleo-digno/",
"https://www.juntos.org.mx/2021/12/continuan-los-casos-de-exito-en-la-inclusion-laboral-de-personas-con-discapacidad/"
)
# Iterar a través de las URLs y descargar los textos
archivosasc2021 <- character(0)
for (url in asc2021 ) {
paginaasc2021 <- read_html(url)
parrafos.noticiaasc2021 <- html_elements(paginaasc2021 , "p")
text_contentasc2021 <- html_text(parrafos.noticiaasc2021 )
nombre_archivoasc2021 <- gsub("https://www.juntos.org.mx/|/", "", url)
nombre_archivoasc2021 <- paste0(nombre_archivoasc2021, ".txt")
writeLines(text_contentasc2021 , nombre_archivoasc2021 )
archivosasc2021 <- c(archivosasc2021 , nombre_archivoasc2021 )
cat("Archivo descargado y guardado como", nombre_archivoasc2021 , "\n")
}
## Archivo descargado y guardado como 202005dia-del-trabajador-y-la-inclusion.txt
## Archivo descargado y guardado como 202108juntos-llevo-a-cabo-feria-del-empleo-para-personas-con-discapacidad.txt
## Archivo descargado y guardado como 202112la-secretaria-del-trabajo-se-compromete-con-las-personas-con-discapacidad.txt
## Archivo descargado y guardado como 20210227-de-febrero-dia-de-la-inclusion-laboral.txt
## Archivo descargado y guardado como 202110el-dia-de-hoy-30-personas-con-discapacidad-mas-tienen-la-oportunidad-de-un-empleo-digno.txt
## Archivo descargado y guardado como 202112continuan-los-casos-de-exito-en-la-inclusion-laboral-de-personas-con-discapacidad.txt
# Función para limpiar el texto
limpiar_textoasc2021 <- function(archivo) {
texto <- readLines(archivo, warn = FALSE)
texto <- paste(texto, collapse = " ")
textoasc2021 <- tolower(texto)
textoasc2021 <- gsub("http\\S+|www\\.\\S+", "", textoasc2021 )
textoasc2021 <- gsub("<.*?>", "", textoasc2021 )
textoasc2021 <- gsub("[[:punct:]]", "", textoasc2021 )
textoasc2021 <- gsub("\\d+", "", textoasc2021 )
textoasc2021 <- gsub("\\s+", " ", textoasc2021 )
textoasc2021 <- gsub("<img [^>]*>", "", textoasc2021 )
textoasc2021 <- removeWords(textoasc2021, stopwords("es"))
return(textoasc2021 )
}
# Aplicar la función de limpieza solo a los archivos de la lista n23
textos_limpiosasc2021 <- lapply(archivosasc2021 , limpiar_textoasc2021)
# Crear corpus con textos limpios
corpusasc2021 <- Corpus(VectorSource(textos_limpiosasc2021))
# Document Term Matrix
dtmasc2021 <- DocumentTermMatrix(corpusasc2021 )
# Ver la Matriz
inspect(dtmasc2021 )
## <<DocumentTermMatrix (documents: 6, terms: 617)>>
## Non-/sparse entries: 796/2906
## Sparsity : 78%
## Maximal term length: 19
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs discapacidad empleo empresa empresas inclusión laboral oportunidad persona
## 1 4 0 0 2 2 2 1 0
## 2 7 4 2 3 1 2 3 1
## 3 8 0 2 2 3 2 1 1
## 4 14 5 5 3 6 3 2 5
## 5 4 3 1 2 0 0 0 1
## 6 5 0 1 1 2 3 1 1
## Terms
## Docs personas trabajo
## 1 4 3
## 2 6 1
## 3 4 6
## 4 9 4
## 5 3 0
## 6 2 1
Se realiza lo mismo que en los códigos anteriores. Se vuelven a unir los textos limpios en un sólo vector y se obtienen los términos más comúnes de ese vector.
# Unir todos los textos limpios en un solo vector
vectorasc2021 <- unlist(textos_limpiosasc2021)
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_limpioasc2021 <- colSums(as.matrix(dtmasc2021))
# Ordenar y mostrar los términos más comunes
terminos_comunes_limpioasc2021 <- sort(conteo_total_limpioasc2021, decreasing = TRUE)
head(terminos_comunes_limpioasc2021, 50)
## discapacidad personas trabajo inclusión empresas
## 42 28 15 14 13
## laboral empleo empresa persona oportunidad
## 12 12 11 9 8
## tener todas registrad ser dar
## 8 7 6 6 6
## juntos cada así día programa
## 6 6 5 5 5
## digno empodera puede vez derecho
## 5 5 5 5 4
## experiencia hoy mejor parte valor
## 4 4 4 4 4
## evento interesada vacantes vida visual
## 4 4 4 4 4
## habilidades acceso contratación género mayor
## 4 4 4 4 4
## menos trabajar compromiso hacer lograr
## 4 4 3 3 3
## oportunidades aurrera cabo contáctanos feria
## 3 3 3 3 3
Con el texto limpio, se crea una nube de palabras tomando en cuenta la frecuencia de cada una de ellas.
library(wordcloud)
wordcloud(names(terminos_comunes_limpioasc2021), terminos_comunes_limpioasc2021, min.freq = 3, max.words = 200, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(8, "Dark2"))
Posteriormente, se eliminan algunas palabras a mano que no nos serán de
utilidad o que podrían arruinar el análisis. Se vuelve a hacer una
limpieza de stopwords y creamos un nuevo dtm, vemos los términos más
comunes y se obtiene una gráfica de frecuencias.
# Eliminar palabras específicas
palabras_eliminarasc2021 <- c("null","gtagset","function","var","pagetype", "presidente", "interlocutor", "ramírez", "reyes","erika", "vcrowvccolumnvccolumntext", "docs","embargo","correo","ser", "vez","hacer","sólo","conocer","además","así","cada","través","mayo","aunque","tener","aún","busca","cuenta","aquí","menor","puedes","puede","pueden","parte","años","docs","día","villa","electrónico","mundo","puedan","situación","puertas","primer","dentro","agradecemos","potosí","mayor","número","forma","provisión","nacobre","centro","mayor","contamos","general","cuales","celaya","muchas","llevó","gran","hoy","evento","todas","san","número","obtener","lic","pas","dar","paso","cabo","seguir","san","manera","mismo","luis","sector","mejor","director","vida","aspace","equipo","compartida","menos","cabo","dar","hoy","luis","todas","llevó","hacer","aurrera","desean","tipos","pues", "edad", "decente", "contáctanos")
corpus2_asc2021 <- tm_map(corpusasc2021, removeWords, palabras_eliminarasc2021)
## Warning in tm_map.SimpleCorpus(corpusasc2021, removeWords,
## palabras_eliminarasc2021): transformation drops documents
# Eliminar stopwords en español
corpus3_asc2021 <- tm_map(corpus2_asc2021, removeWords, stopwords("es"))
## Warning in tm_map.SimpleCorpus(corpus2_asc2021, removeWords, stopwords("es")):
## transformation drops documents
# Repetimos el análisis y comparamos los términos y la nube
# Creamos nuevo dtm
dtm2_asc2021 <- DocumentTermMatrix(corpus3_asc2021)
#Ver matriz
inspect(dtm2_asc2021)
## <<DocumentTermMatrix (documents: 6, terms: 563)>>
## Non-/sparse entries: 687/2691
## Sparsity : 80%
## Maximal term length: 19
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs discapacidad empleo empresa empresas inclusión laboral oportunidad persona
## 1 4 0 0 2 2 2 1 0
## 2 7 4 2 3 1 2 3 1
## 3 8 0 2 2 3 2 1 1
## 4 14 5 5 3 6 3 2 5
## 5 4 3 1 2 0 0 0 1
## 6 5 0 1 1 2 3 1 1
## Terms
## Docs personas trabajo
## 1 4 3
## 2 6 1
## 3 4 6
## 4 9 4
## 5 3 0
## 6 2 1
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_asc2021 <- colSums(as.matrix(dtm2_asc2021))
# Ordenar y mostrar los términos más comúnes
terminos_comunes_asc2021 <- sort(conteo_total_asc2021, decreasing = TRUE)
head(terminos_comunes_asc2021)
## discapacidad personas trabajo inclusión empresas laboral
## 42 28 15 14 13 12
# Función para limpiar el texto
limpiar_textoasc19 <- function(archivo) {
textoasc2021 <- readLines(archivosasc2021, warn = FALSE)
textoasc2021 <- paste(textoasc2021, collapse = " ")
# Eliminar puntuación
textoasc2021 <- gsub("[[:punct:]]", "", textoasc2021)
# Eliminar preposiciones y superlativos
palabrasasc2021 <- unlist(strsplit(textoasc2021, " "))
palabras_filtradasasc2021 <- palabras[!(palabras %in% c(preposiciones, superlativos))]
# Volver a unir las palabras filtradas
#texto_filtrado <- paste(palabras_filtradas, collapse = " "
}
# Obtener la tabla de frecuencias de los términos
tabla_frecuenciasasc2021 <- table(conteo_total_asc2021)
# Mostrar los términos más comunes junto con sus frecuencias
resultadosasc2021 <- data.frame(Termino = names(terminos_comunes_asc2021),
Frecuencia = terminos_comunes_asc2021)
# Total = tabla_frecuenciasasc2021[names(terminos_comunes_asc2021)])
# Se despliega las primeras 100 palabras con mayor frecuencia
head(resultadosasc2021, 100)
## Termino Frecuencia
## discapacidad discapacidad 42
## personas personas 28
## trabajo trabajo 15
## inclusión inclusión 14
## empresas empresas 13
## laboral laboral 12
## empleo empleo 12
## empresa empresa 11
## persona persona 9
## oportunidad oportunidad 8
## registrad registrad 6
## juntos juntos 6
## programa programa 5
## digno digno 5
## empodera empodera 5
## derecho derecho 4
## experiencia experiencia 4
## valor valor 4
## interesada interesada 4
## vacantes vacantes 4
## visual visual 4
## habilidades habilidades 4
## acceso acceso 4
## contratación contratación 4
## género género 4
## trabajar trabajar 4
## compromiso compromiso 3
## lograr lograr 3
## oportunidades oportunidades 3
## feria feria 3
## mejores mejores 3
## poder poder 3
## seguridad seguridad 3
## trabajadores trabajadores 3
## demanda demanda 3
## organización organización 3
## productividad productividad 3
## sociedad sociedad 3
## abierto abierto 2
## asistencia asistencia 2
## cambiar cambiar 2
## continuar continuar 2
## desarrollo desarrollo 2
## desenvolverse desenvolverse 2
## hace hace 2
## talento talento 2
## trabajador trabajador 2
## bimbo bimbo 2
## búsqueda búsqueda 2
## cefi cefi 2
## colocar colocar 2
## destacar destacar 2
## diferentes diferentes 2
## empleos empleos 2
## entrevistaron entrevistaron 2
## facultad facultad 2
## gracias gracias 2
## medidas medidas 2
## motors motors 2
## objetivo objetivo 2
## participantes participantes 2
## psicología psicología 2
## realizó realizó 2
## reis reis 2
## ustedes ustedes 2
## centros centros 2
## contar contar 2
## diversos diversos 2
## encuentran encuentran 2
## secretario secretario 2
## según según 2
## trabajadoras trabajadoras 2
## ver ver 2
## alguien alguien 2
## alta alta 2
## asegurar asegurar 2
## ausentismo ausentismo 2
## ayudarán ayudarán 2
## beneficios beneficios 2
## características características 2
## casos casos 2
## claves claves 2
## click click 2
## colaboradores colaboradores 2
## dando dando 2
## deben deben 2
## elementos elementos 2
## ello ello 2
## entorno entorno 2
## esforzarse esforzarse 2
## febrero febrero 2
## implementar implementar 2
## importar importar 2
## insuficientes insuficientes 2
## lado lado 2
## lealtad lealtad 2
## lugar lugar 2
## mayoría mayoría 2
## motivada motivada 2
## negocio negocio 2
Se crea una nube de palabras, eliminando aquellas que causaban ruido y aquellas que no aportaban al análisis.
library(wordcloud)
# Crear la wordcloud
wordcloud(words = names(terminos_comunes_asc2021),
freq = terminos_comunes_asc2021,
min.freq = 3, # Frecuencia mínima para incluir una palabra
max.words = 100, # Número máximo de palabras en la nube
random.order = FALSE, # Orden fijo para reproducibilidad
rot.per = 0.35, # Porcentaje de palabras rotadas
colors = brewer.pal(10, "Paired")) # Paleta de colores
Primero se cargar bibliotecas necesarias: tidyverse: Colección de
paquetes para manipulación y visualización de datos. tidytext: Funciones
para trabajar con texto de manera eficiente. dplyr: Herramientas para
manipulación de datos. sentimentr: Análisis de sentimientos.
topicmodels: Modelado de tópicos. tm: Herramientas para el procesamiento
de texto. ggplot2: Biblioteca para la creación de gráficos.
Leer el archivo txt: El código asume que ya tienes un archivo de texto llamado asc2021 que contiene la transcripción de tus noticias.
Generar un modelo de Topic Models (LDA): Utiliza el paquete topicmodels para ajustar un modelo de Latent Dirichlet Allocation (LDA) a la matriz término-documento (dtm2_asc2021) creada anteriormente. Se especifica k = 3 para indicar que se desean identificar 3 tópicos.
Obtener los términos más importantes de cada tópico: Utiliza la función tidy para extraer los términos más importantes de cada tópico basándose en la probabilidad (beta).
Generar el gráfico de barras: Utiliza ggplot2 para crear un gráfico de barras apiladas que muestra la importancia de los términos en cada tópico.
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
# Leer el archivo txt
transcription2021 <- asc2021
# Generar un modelo de topic models
lda2021 <- LDA(dtm2_asc2021, k = 3)
# Obtener los términos más importantes de cada tópico
terms2021 <- tidy(lda2021, matrix = "beta") %>%
group_by(topic) %>%
top_n(4, wt = beta)
# Generar el gráfico
ggplot(terms2021, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 3)
# Obtener los términos más importantes de cada tópico en un dataframe
terms2021 <- tidy(lda2021, matrix = "beta")
terms2021 <- terms2021 %>%
select(term, beta)
En este apartado de hace un análisis de sentimiento nuevamente
Cargar bibliotecas necesarias: syuzhet: Herramientas para el análisis de sentimientos. RColorBrewer: Paleta de colores para gráficos. tm: Herramientas para el procesamiento de texto.
Concatenar los textos limpios en un solo vector: Utiliza la función unlist para convertir la lista de términos limpios en un vector único llamado texto_palabrasasc2021.
Obtener el análisis de sentimientos con syuzhet: Utiliza get_nrc_sentiment para obtener el análisis de sentimientos sobre el vector de palabras. La variable resultante es sentimientos_df_asc2021.
Crear un diccionario de traducción de emociones: Define un diccionario para traducir los nombres de las emociones a términos en español.
Cambiar los nombres de las emociones en sentimientos_df: Renombra las columnas del dataframe sentimientos_df_asc2021 según el diccionario de emociones.
Mostrar los resultados: Muestra las primeras filas y un resumen del dataframe de análisis de sentimientos para posteriormente crear un gráfico de barras.
# Cargar las bibliotecas necesarias
library(syuzhet)
library(RColorBrewer)
library(tm)
# Concatenar los textos limpios en un solo vector
texto_palabrasasc2021 <- unlist(resultadosasc2021)
# Obtener el análisis de sentimientos con syuzhet
sentimientos_df_asc2021 <- get_nrc_sentiment(texto_palabrasasc2021 , lang = "spanish")
# Crear un diccionario de traducción de emociones
diccionario_emociones_asc2021 <- c(
"anger" = "enojo",
"anticipation" = "anticipación",
"disgust" = "asco",
"fear" = "miedo",
"joy" = "alegría",
"sadness" = "tristeza",
"surprise" = "sorpresa",
"trust" = "confianza",
"negative" = "negativo",
"positive" = "positivo"
)
# Cambiar los nombres de las emociones en sentimientos_df
colnames(sentimientos_df_asc2021) <- diccionario_emociones_asc2021
# Mostrar los resultados
head(sentimientos_df_asc2021 )
## enojo anticipación asco miedo alegría tristeza sorpresa confianza negativo
## 1 0 0 0 0 0 1 0 0 2
## 2 0 0 0 0 0 0 0 0 0
## 3 0 1 0 0 1 0 1 1 0
## 4 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0
## positivo
## 1 0
## 2 0
## 3 2
## 4 0
## 5 0
## 6 1
summary(sentimientos_df_asc2021 )
## enojo anticipación asco miedo
## Min. :0.000000 Min. :0.00000 Min. :0.0000000 Min. :0.00000
## 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.:0.0000000 1st Qu.:0.00000
## Median :0.000000 Median :0.00000 Median :0.0000000 Median :0.00000
## Mean :0.002664 Mean :0.02398 Mean :0.0008881 Mean :0.01155
## 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:0.0000000 3rd Qu.:0.00000
## Max. :1.000000 Max. :2.00000 Max. :1.0000000 Max. :3.00000
## alegría tristeza sorpresa confianza
## Min. :0.00000 Min. :0.000000 Min. :0.000000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.00000
## Median :0.00000 Median :0.000000 Median :0.000000 Median :0.00000
## Mean :0.01599 Mean :0.006217 Mean :0.008881 Mean :0.03819
## 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.000000 3rd Qu.:0.00000
## Max. :2.00000 Max. :1.000000 Max. :2.000000 Max. :3.00000
## negativo positivo
## Min. :0.0000 Min. :0.00000
## 1st Qu.:0.0000 1st Qu.:0.00000
## Median :0.0000 Median :0.00000
## Mean :0.0151 Mean :0.06661
## 3rd Qu.:0.0000 3rd Qu.:0.00000
## Max. :3.0000 Max. :3.00000
# Ajustar parámetros para mejorar la legibilidad y rotar las etiquetas
par(mar = c(5, 5, 4, 2) + 0.1)
# Crear un gráfico de barras con etiquetas rotadas
barplot(
colSums(sentimientos_df_asc2021),
space = 0.2,
horiz = FALSE,
las = 2, # Rotar las etiquetas
cex.names = 0.7,
col = brewer.pal(n = ncol(sentimientos_df_asc2021), name = "Set3"),
main = "Análisis de Sentimientos de Asociación Civil 2020-2021",
xlab = "Emociones",
ylab = NULL
)
# Agregar etiquetas a las barras
text(
x = barplot(
colSums(sentimientos_df_asc2021),
space = 0.2,
horiz = FALSE,
las = 2,
col = brewer.pal(n = ncol(sentimientos_df_asc2021), name = "Set3"),
plot = FALSE
),
y = -0.5, # Ubicación vertical de las etiquetas
labels = colSums(sentimientos_df_asc2021), # Números para cada emoción
pos = 3, # Posición de las etiquetas (3 = parte superior)
cex = 0.7
)
###ASC 2022-2023
Se realiza el proceso que se ha realizado previamente, se estraen sólo aquellos links que nos son de utilidad, sólo ahora del 2022-2023 y cambian los nombres de las variables.
# Cargar la biblioteca tm
library(tm)
# Cargar la biblioteca rvest
library(rvest)
# Archivos a procesar
asc2223 <- c(
"https://www.juntos.org.mx/2022/04/si-eres-una-persona-con-discapacidad-ya-podras-trabajar-en-el-alto-tribunal/",
"https://www.juntos.org.mx/2022/01/proceso-de-inclusion-laboral-de-personas-con-discapacidad-en-juntos/",
"https://www.juntos.org.mx/2022/02/conoce-el-area-de-vinculacion-laboral-en-juntos/",
"https://www.juntos.org.mx/2022/02/inicio-empodera-el-programa-de-inclusion-laboral-de-juntos/",
"https://www.juntos.org.mx/2022/03/walmart-empresa-referente-en-la-inclusion-laboral/",
"https://www.juntos.org.mx/2022/05/feria-del-empleo-juntos-para-personas-con-discapacidad/",
"https://www.juntos.org.mx/2022/10/3er-feria-del-empleo-inclusiva-juntos/",
"https://www.juntos.org.mx/2023/02/graduacion-de-empodera-35/",
"https://www.juntos.org.mx/2023/01/arrancara-empodera-35-de-juntos-ac/",
"https://www.juntos.org.mx/2023/02/juntos-a-c-presenta-proyecto-de-inclusion-laboral-en-guanajuato/",
"https://www.juntos.org.mx/2023/04/primera-feria-del-empleo-inclusiva-del-2023/",
"https://www.juntos.org.mx/2023/04/secretaria-del-trabajo-y-juntos-a-c-firman-convenio-para-fomentar-el-empleo-de-las-personas-con-discapacidad-en-el-estado/",
"https://www.juntos.org.mx/2023/05/siguen-las-colocaciones-de-personas-con-discapacidad-en-empleos-formales-en-slp/",
"https://www.juntos.org.mx/2023/04/empodera-celaya-es-una-realidad/",
"https://www.juntos.org.mx/2023/04/arranca-empodera-37/",
"https://www.juntos.org.mx/2023/07/nacobre-apoya-la-inclusion-laboral-de-personas-con-discapacidad/",
"https://www.juntos.org.mx/2023/08/empresas-de-diversos-giros-y-tamanos-continuan-abriendo-oportunidades-laborales/",
"https://www.juntos.org.mx/2023/10/trabajando-en-dignidad/",
"https://www.juntos.org.mx/2023/03/felicidades-a-la-generacion-36-empodera%ef%bf%bc/",
"https://www.juntos.org.mx/2023/03/hacia-la-inclusion-de-mujeres-con-discapacidad-en-puestos-politicos-de-relevancia/",
"https://www.juntos.org.mx/2023/04/ppm-se-suma-a-la-inclusion-laboral-de-personas-con-discapacidad-en-slp/",
"https://www.juntos.org.mx/2023/05/siguen-las-colocaciones-de-personas-con-discapacidad-en-empleos-formales-en-slp/",
"https://www.juntos.org.mx/2023/04/arranca-empodera-37/"
)
# Iterar a través de las URLs y descargar los textos
archivosasc2223 <- character(0)
for (url in asc2223 ) {
paginaasc2223 <- read_html(url)
parrafos.noticiaasc2223 <- html_elements(paginaasc2223 , "p")
text_contentasc2223 <- html_text(parrafos.noticiaasc2223 )
nombre_archivoasc2223 <- gsub("https://www.juntos.org.mx/|/", "", url)
nombre_archivoasc2223 <- paste0(nombre_archivoasc2223, ".txt")
writeLines(text_contentasc2223 , nombre_archivoasc2223 )
archivosasc2223 <- c(archivosasc2223 , nombre_archivoasc2223 )
cat("Archivo descargado y guardado como", nombre_archivoasc2223 , "\n")
}
## Archivo descargado y guardado como 202204si-eres-una-persona-con-discapacidad-ya-podras-trabajar-en-el-alto-tribunal.txt
## Archivo descargado y guardado como 202201proceso-de-inclusion-laboral-de-personas-con-discapacidad-en-juntos.txt
## Archivo descargado y guardado como 202202conoce-el-area-de-vinculacion-laboral-en-juntos.txt
## Archivo descargado y guardado como 202202inicio-empodera-el-programa-de-inclusion-laboral-de-juntos.txt
## Archivo descargado y guardado como 202203walmart-empresa-referente-en-la-inclusion-laboral.txt
## Archivo descargado y guardado como 202205feria-del-empleo-juntos-para-personas-con-discapacidad.txt
## Archivo descargado y guardado como 2022103er-feria-del-empleo-inclusiva-juntos.txt
## Archivo descargado y guardado como 202302graduacion-de-empodera-35.txt
## Archivo descargado y guardado como 202301arrancara-empodera-35-de-juntos-ac.txt
## Archivo descargado y guardado como 202302juntos-a-c-presenta-proyecto-de-inclusion-laboral-en-guanajuato.txt
## Archivo descargado y guardado como 202304primera-feria-del-empleo-inclusiva-del-2023.txt
## Archivo descargado y guardado como 202304secretaria-del-trabajo-y-juntos-a-c-firman-convenio-para-fomentar-el-empleo-de-las-personas-con-discapacidad-en-el-estado.txt
## Archivo descargado y guardado como 202305siguen-las-colocaciones-de-personas-con-discapacidad-en-empleos-formales-en-slp.txt
## Archivo descargado y guardado como 202304empodera-celaya-es-una-realidad.txt
## Archivo descargado y guardado como 202304arranca-empodera-37.txt
## Archivo descargado y guardado como 202307nacobre-apoya-la-inclusion-laboral-de-personas-con-discapacidad.txt
## Archivo descargado y guardado como 202308empresas-de-diversos-giros-y-tamanos-continuan-abriendo-oportunidades-laborales.txt
## Archivo descargado y guardado como 202310trabajando-en-dignidad.txt
## Archivo descargado y guardado como 202303felicidades-a-la-generacion-36-empodera%ef%bf%bc.txt
## Archivo descargado y guardado como 202303hacia-la-inclusion-de-mujeres-con-discapacidad-en-puestos-politicos-de-relevancia.txt
## Archivo descargado y guardado como 202304ppm-se-suma-a-la-inclusion-laboral-de-personas-con-discapacidad-en-slp.txt
## Archivo descargado y guardado como 202305siguen-las-colocaciones-de-personas-con-discapacidad-en-empleos-formales-en-slp.txt
## Archivo descargado y guardado como 202304arranca-empodera-37.txt
# Función para limpiar el texto
limpiar_textoasc2223 <- function(archivo) {
texto <- readLines(archivo, warn = FALSE)
texto <- paste(texto, collapse = " ")
textoasc2223 <- tolower(texto)
textoasc2223 <- gsub("http\\S+|www\\.\\S+", "", textoasc2223 )
textoasc2223 <- gsub("<.*?>", "", textoasc2223 )
textoasc2223 <- gsub("[[:punct:]]", "", textoasc2223 )
textoasc2223 <- gsub("\\d+", "", textoasc2223 )
textoasc2223 <- gsub("\\s+", " ", textoasc2223 )
textoasc2223 <- gsub("<img [^>]*>", "", textoasc2223 )
textoasc2223 <- removeWords(textoasc2223, stopwords("es"))
return(textoasc2223 )
}
# Aplicar la función de limpieza solo a los archivos de la lista n23
textos_limpiosasc2223 <- lapply(archivosasc2223 , limpiar_textoasc2223 )
# Corpus con textos limpios
corpusasc2223 <- Corpus(VectorSource(textos_limpiosasc2223 ))
# Document Term Matrix
dtmasc2223 <- DocumentTermMatrix(corpusasc2223 )
# Ver la Matriz
inspect(dtmasc2223 )
## <<DocumentTermMatrix (documents: 23, terms: 1420)>>
## Non-/sparse entries: 2824/29836
## Sparsity : 91%
## Maximal term length: 19
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs así discapacidad empleo empodera empresas inclusión juntos laboral
## 10 4 4 1 1 0 4 2 3
## 12 2 4 1 0 1 2 4 3
## 14 5 3 2 5 0 1 5 4
## 16 0 6 1 2 1 3 3 4
## 17 1 6 0 4 6 4 0 9
## 18 3 5 1 0 2 2 2 3
## 19 5 3 3 4 1 1 2 4
## 20 2 8 0 0 0 1 2 0
## 5 0 3 0 0 0 3 0 3
## 7 2 14 4 0 6 4 8 3
## Terms
## Docs personas programa
## 10 3 1
## 12 4 0
## 14 3 5
## 16 8 2
## 17 6 5
## 18 3 0
## 19 3 6
## 20 1 1
## 5 1 0
## 7 17 0
Mismo procedimiento que el de asc 2020-2021, se vuelven a unir todos los textos limpios en un sólo vector y aparece una tabla de frecuencias.
# Unir todos los textos limpios en un solo vector
vectorasc2223 <- unlist(textos_limpiosasc2223)
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_limpioasc2223 <- colSums(as.matrix(dtmasc2223))
# Ordenar y mostrar los términos más comunes
terminos_comunes_limpioasc2223 <- sort(conteo_total_limpioasc2223, decreasing = TRUE)
head(terminos_comunes_limpioasc2223, 50)
## discapacidad personas laboral juntos inclusión
## 97 88 73 50 42
## empodera así empresas programa empleo
## 38 36 36 35 34
## trabajo registrad social capacitación feria
## 27 23 22 20 20
## ser vida oportunidad luis mujeres
## 18 18 17 17 17
## vinculación san generación agencia lic
## 17 16 16 16 16
## potosí participantes vacantes instalaciones todas
## 15 14 13 13 13
## oportunidades cabo sector general sociedad
## 13 12 12 11 11
## cada número ámbito colocación seguir
## 11 11 11 10 10
## éxito pasado calidad obtener gracias
## 10 10 10 10 10
## laborales empresa forma dif director
## 10 10 9 9 9
Hacemos una nube de palabras con las frecuencias anteriores.
library(wordcloud)
wordcloud(names(terminos_comunes_limpioasc2223), terminos_comunes_limpioasc2223, min.freq = 8, max.words = 200, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(8, "Dark2"))
## Warning in wordcloud(names(terminos_comunes_limpioasc2223),
## terminos_comunes_limpioasc2223, : personas could not be fit on page. It will not
## be plotted.
Se eliminan algunas palabras que no nos son de utilidad y se crea un
nuevo dtm para trabajar con él.
# Eliminar palabras específicas.
palabras_eliminarasc2223 <- c("null","gtagset","function","var","pagetype", "presidente", "interlocutor", "ramírez", "reyes","erika", "vcrowvccolumnvccolumntext", "docs","embargo","correo","ser", "vez","hacer","sólo","conocer","además","así","cada","través","mayo","aunque","tener","aún","busca","cuenta","aquí","menor","puedes","puede","pueden","parte","años","docs","día","villa","electrónico","mundo","puedan","situación","puertas","primer","dentro","agradecemos","nnvcsingleimage","registrad","aspace","municipal","lic","director","celaya", "colocación","san","potosí", "vez","hacer","sólo","conocer","además","así","cada","través","mayo","aunque","tener","aún","busca","cuenta","aquí","menor","puedes","puede","pueden","parte","años","docs","día","villa","electrónico","mundo","puedan","situación","puertas","primer","dentro","agradecemos","potosí","mayor","número","forma","provisión","nacobre","centro","mayor","contamos","general","cuales","celaya","muchas","llevó","gran","hoy","evento","todas","san","número","obtener","lic","pas","dar","paso","cabo","seguir","san","manera","mismo","luis","sector","mejor","director","vida","aspace","equipo","compartida","menos","cabo","dar","hoy","luis","todas","llevó","hacer","aurrera","desean","tipos","pues","calidad","pasado", "generar", "guanajuato", "generación", "nuevas", "áreas", "colocaciones", "gracias", "presidenta", "mejorar", "coordinadora", "modelo")
corpus2_asc2223 <- tm_map(corpusasc2223, removeWords, palabras_eliminarasc2223)
## Warning in tm_map.SimpleCorpus(corpusasc2223, removeWords,
## palabras_eliminarasc2223): transformation drops documents
# Eliminar stopwords en español
corpus3_asc2223 <- tm_map(corpus2_asc2223, removeWords, stopwords("es"))
## Warning in tm_map.SimpleCorpus(corpus2_asc2223, removeWords, stopwords("es")):
## transformation drops documents
# Repetimos el análisis y comparamos los términos y la nube
# Creamos nuevo dtm
dtm2_asc2223 <- DocumentTermMatrix(corpus3_asc2223)
#Ver matriz
inspect(dtm2_asc2223)
## <<DocumentTermMatrix (documents: 23, terms: 1336)>>
## Non-/sparse entries: 2392/28336
## Sparsity : 92%
## Maximal term length: 19
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs discapacidad empleo empodera empresas inclusión juntos laboral personas
## 10 4 1 1 0 4 2 3 3
## 12 4 1 0 1 2 4 3 4
## 14 3 2 5 0 1 5 4 3
## 16 6 1 2 1 3 3 4 8
## 17 6 0 4 6 4 0 9 6
## 18 5 1 0 2 2 2 3 3
## 19 3 3 4 1 1 2 4 3
## 20 8 0 0 0 1 2 0 1
## 5 3 0 0 0 3 0 3 1
## 7 14 4 0 6 4 8 3 17
## Terms
## Docs programa trabajo
## 10 1 1
## 12 0 4
## 14 5 0
## 16 2 0
## 17 5 1
## 18 0 2
## 19 6 3
## 20 1 0
## 5 0 1
## 7 0 4
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_asc2223 <- colSums(as.matrix(dtm2_asc2223))
# Ordenar y mostrar los términos más comúnes
terminos_comunes_asc2223 <- sort(conteo_total_asc2223, decreasing = TRUE)
head(terminos_comunes_asc2223)
## discapacidad personas laboral juntos inclusión empodera
## 97 88 73 50 42 38
# Función para limpiar el texto
limpiar_textoasc2223 <- function(archivo) {
textoasc2223 <- readLines(archivosasc2223, warn = FALSE)
textoasc2223 <- paste(textoasc2223, collapse = " ")
# Eliminar puntuación
textoasc2223 <- gsub("[[:punct:]]", "", textoasc2223)
# Eliminar preposiciones y superlativos
palabrasasc2223 <- unlist(strsplit(texto, " "))
palabras_filtradasasc2223 <- palabras[!(palabras %in% c(preposiciones, superlativos))]
# Volver a unir las palabras filtradas
#texto_filtrado <- paste(palabras_filtradas, collapse = " ")
}
# Obtener la tabla de frecuencias de los términos
tabla_frecuenciasasc2223 <- table(conteo_total_asc2223)
# Mostrar los términos más comunes junto con sus frecuencias
resultadosasc2223 <- data.frame(Termino = names(terminos_comunes_asc2223),
Frecuencia = terminos_comunes_asc2223)
# Total = tabla_frecuenciasasc2223[names(terminos_comunes_asc2223)])
# Se despliega las primeras 100 palabras con mayor frecuencia
head(resultadosasc2223, 100)
## Termino Frecuencia
## discapacidad discapacidad 97
## personas personas 88
## laboral laboral 73
## juntos juntos 50
## inclusión inclusión 42
## empodera empodera 38
## empresas empresas 36
## programa programa 35
## empleo empleo 34
## trabajo trabajo 27
## social social 22
## capacitación capacitación 20
## feria feria 20
## oportunidad oportunidad 17
## mujeres mujeres 17
## vinculación vinculación 17
## agencia agencia 16
## participantes participantes 14
## vacantes vacantes 13
## instalaciones instalaciones 13
## oportunidades oportunidades 13
## sociedad sociedad 11
## ámbito ámbito 11
## éxito éxito 10
## laborales laborales 10
## empresa empresa 10
## dif dif 9
## instituciones instituciones 8
## habilidades habilidades 8
## beneficios beneficios 7
## experiencia experiencia 7
## objetivo objetivo 7
## colaboradores colaboradores 7
## políticos políticos 7
## lograr lograr 6
## tipo tipo 6
## persona persona 6
## sociales sociales 6
## diversas diversas 6
## generaciones generaciones 6
## motriz motriz 6
## proceso proceso 6
## méxico méxico 6
## previsión previsión 6
## walmart walmart 6
## crear crear 6
## personal personal 6
## representantes representantes 6
## camino camino 6
## derechos derechos 6
## espacios espacios 6
## solo solo 6
## directora directora 6
## desarrollarse desarrollarse 6
## cita cita 6
## acciones acciones 6
## ppm ppm 6
## cabe cabe 6
## necesidad necesidad 6
## partidos partidos 6
## información información 5
## mediante mediante 5
## ciudad ciudad 5
## labor labor 5
## seguimiento seguimiento 5
## auditiva auditiva 5
## cambio cambio 5
## curso curso 5
## edición edición 5
## febrero febrero 5
## inauguración inauguración 5
## intelectual intelectual 5
## mes mes 5
## quieres quieres 5
## concluyó concluyó 5
## diplomado diplomado 5
## graduados graduados 5
## participar participar 5
## desarrollo desarrollo 5
## digno digno 5
## estatal estatal 5
## importancia importancia 5
## maría maría 5
## monserrat monserrat 5
## vázquez vázquez 5
## motors motors 5
## formal formal 5
## laboral laboral 5
## logrado logrado 5
## abril abril 5
## participación participación 5
## dicha dicha 5
## dado dado 5
## entrevistas entrevistas 5
## encuentro encuentro 5
## acceder acceder 4
## bolsa bolsa 4
## corte corte 4
## expresó expresó 4
## justicia justicia 4
Se realiza una nueva nube de palabras con los textos limpios.
wordcloud(names(terminos_comunes_asc2223),
terminos_comunes_asc2223,
min.freq = 7, # frecuencia minima de las palabras
max.words = 100, # cuantas palabras caben en la nube
random.order = FALSE,
rot.per = 0.35,
#brewer.pal es una paleta de colores
colors = brewer.pal(10, "Paired"))
## Warning in wordcloud(names(terminos_comunes_asc2223),
## terminos_comunes_asc2223, : personas could not be fit on page. It will not be
## plotted.
library(ggplot2)
# Tomar los 25 términos más comunes
terminos_top_asc2223 <- names(terminos_comunes_asc2223)[1:25]
# Crear un vector con las frecuencias de estos términos
frecuencias_top_asc2223 <- terminos_comunes_asc2223[1:25]
# Definir colores personalizados
colores_asc2223 <- colorRampPalette(brewer.pal(8, "Dark2"))(100)
# Crear un gráfico de barras con colores y ajustes de tamaño de letra
barplot(frecuencias_top_asc2223,
names.arg = terminos_top_asc2223,
horiz = TRUE,
las = 1,
main = "Términos más utilizados en ASC 2019",
xlab = "Frecuencia",
col = colores_asc2223, # Agregar los colores personalizados
border = "white", # Color de los bordes de las barras
cex.names = 0.5, # Tamaño de letra en el eje x
cex.axis = 0.9, # Tamaño de letra en los ejes
cex.main = 1.2, # Tamaño de letra en el título principal
cex.lab = 0.9 # Tamaño de letra en las etiquetas de los ejes
)
Se realiza nuevamente un análisis de tópicos, usando la misma técnica
que en años anteriores.
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
# Leer el archivo txt
transcripcion2223 <- asc2223
# Analizar el sentimiento
sentimiento2223 <- sentiment_by(transcripcion2223)
# Generar un modelo de topic models
lda2223 <- LDA(dtm2_asc2223, k = 3)
# Obtener los términos más importantes de cada tópico
terms2223 <- tidy(lda2223, matrix = "beta") %>%
group_by(topic) %>%
top_n(5, wt = beta)
# Generar el gráfico
ggplot(terms2223, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 3)
# Obtener los términos más importantes de cada tópico en un dataframe
terms2223 <- tidy(lda2223, matrix = "beta")
terms2223 <- terms2223 %>%
select(term, beta)
Por último, se realiza un análisis de sentimientos similar a los años anteriores, utilizanod la misma técnica.
# Cargar las bibliotecas necesarias
library(syuzhet)
library(RColorBrewer)
library(tm)
# Concatenar los textos limpios en un solo vector
texto_palabrasasc2223 <- unlist(resultadosasc2223)
# Obtener el análisis de sentimientos con syuzhet
sentimientos_df_asc2223 <- get_nrc_sentiment(texto_palabrasasc2223 , lang = "spanish")
# Crear un diccionario de traducción de emociones
diccionario_emociones_asc2223 <- c(
"anger" = "enojo",
"anticipation" = "anticipación",
"disgust" = "asco",
"fear" = "miedo",
"joy" = "alegría",
"sadness" = "tristeza",
"surprise" = "sorpresa",
"trust" = "confianza",
"negative" = "negativo",
"positive" = "positivo"
)
# Cambiar los nombres de las emociones en sentimientos_df
colnames(sentimientos_df_asc2223) <- diccionario_emociones_asc2223
# Mostrar los resultados
head(sentimientos_df_asc2223 )
## enojo anticipación asco miedo alegría tristeza sorpresa confianza negativo
## 1 0 0 0 0 0 1 0 0 2
## 2 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0
## positivo
## 1 0
## 2 0
## 3 1
## 4 0
## 5 0
## 6 0
summary(sentimientos_df_asc2223 )
## enojo anticipación asco miedo
## Min. :0.000000 Min. :0.00000 Min. :0.000000 Min. :0.000000
## 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.000000
## Median :0.000000 Median :0.00000 Median :0.000000 Median :0.000000
## Mean :0.004865 Mean :0.01609 Mean :0.004117 Mean :0.008608
## 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.000000
## Max. :2.000000 Max. :2.00000 Max. :1.000000 Max. :2.000000
## alegría tristeza sorpresa confianza
## Min. :0.0000 Min. :0.000000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.0000 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.0000 Median :0.000000 Median :0.00000 Median :0.00000
## Mean :0.0116 Mean :0.007111 Mean :0.00524 Mean :0.02919
## 3rd Qu.:0.0000 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :2.0000 Max. :2.000000 Max. :1.00000 Max. :3.00000
## negativo positivo
## Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000
## Mean :0.01647 Mean :0.05389
## 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :2.00000 Max. :3.00000
# Ajustar parámetros para mejorar la legibilidad y rotar las etiquetas
par(mar = c(5, 5, 4, 2) + 0.1)
# Crear un gráfico de barras con etiquetas rotadas
barplot(
colSums(sentimientos_df_asc2223 ),
space = 0.2,
horiz = FALSE,
las = 2, # Rotar las etiquetas
cex.names = 0.7,
col = brewer.pal(n = ncol(sentimientos_df_asc2223), name = "Set3"),
main = "Análisis de Sentimientos de Asociación Civil 2022-2023",
xlab = "Emociones",
ylab = NULL
)
# Agregar etiquetas a las barras
text(
x = barplot(
colSums(sentimientos_df_asc2223),
space = 0.2,
horiz = FALSE,
las = 2,
col = brewer.pal(n = ncol(sentimientos_df_asc2223), name = "Set3"),
plot = FALSE
),
y = -0.5, # Ubicación vertical de las etiquetas
labels = colSums(sentimientos_df_asc2223), # Números para cada emoción
pos = 3, # Posición de las etiquetas (3 = parte superior)
cex = 0.7
)