#Extracción de texto: Noticias El código realizado recorre una lista de URLs, realiza scraping de párrafos de texto específicos en cada página y guarda esos párrafos en archivos de texto distintos en una carpeta especificada. El nombre de cada archivo se basa en el contador y el año correspondiente, y el código imprime mensajes indicando la URL procesada y la ubicación del archivo guardado. Este proceso se repite para cada URL en la lista; para la lista de URLs de cada año sucesivamente. ##2019
contador1noti <- 1
carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti" # Reemplaza esto con la ruta de la carpeta donde quieres guardar los archivos
# Cargar bibliotecas
library(rvest)
library(stringr)
# Lista de URLs que deseas scrapear
urls <- c(
"https://www.milenio.com/deportes/extra-cancha/cristiano-ronaldo-y-su-gran-gesto-con-un-aficionado-con-discapacidad",
"https://www.milenio.com/politica/comunidad/feria-leon-2020-personas-mayores-discapacitados",
"https://www.milenio.com/politica/comunidad/feria-leon-2020-personas-mayores-discapacitados",
"https://www.milenio.com/espectaculos/teleton-ayuda-economica-ojala-sigan-esfuerzo-aml",
"https://www.milenio.com/politica/en-teleton-amlo-pide-a-mexicanos-ayudar",
"https://www.milenio.com/politica/comunidad/pinatas-de-integra-adornan-la-navidad",
"https://www.milenio.com/policia/condenan-agresor-sexual-adolescente-discapacidad-mental",
"https://www.milenio.com/politica/comunidad/resaltan-importancia-de-estrategias-educativas-incluyentes",
"https://www.milenio.com/politica/buscan-incluir-lenguaje-discriminacion-leyes-codigos-nl",
"https://www.milenio.com/politica/congreso/personas-discapacidad-mexico-contratar-seguros-scjn",
"https://www.milenio.com/politica/comunidad/guanajuato-le-apuesta-mas-a-la-inclusion",
"https://www.milenio.com/politica/comunidad/mujeres-discapacidad-enfrentan-mayores-dificultades-iemujeres-nl",
"https://www.milenio.com/politica/comunidad/cristina-diaz-pone-marcha-guadalupe-barreras",
"https://www.milenio.com/politica/comunidad/dif-nl-compra-35-vehiculos-adaptados-personas-discapacidad",
"https://www.milenio.com/politica/comunidad/invita-cedh-respetar-derechos-personas-discapacitadas",
"https://www.milenio.com/politica/busca-valera-generar-inclusion-aboral-personas-discapacidad",
"https://www.milenio.com/politica/comunidad/personas-con-discapacidad-piden-mas-espacios-accesibles",
"https://www.milenio.com/politica/secretaria-bienestar-815-mil-personas-discapacidad-pension",
"https://www.milenio.com/politica/amlo-analiza-teleton-atender-personas-discapacidad",
"https://www.milenio.com/politica/amlo-temas-conferencia-mananera-3-diciembre",
"https://www.milenio.com/politica/comunidad/tienen-nuevo-rey-y-reina-en-salamanca",
"https://www.milenio.com/policia/se-ahoga-nino-discapacitado-en-canal-de-reynosa",
"https://www.milenio.com/politica/comunidad/guadalajara-arranca-la-semana-de-la-inclusion",
"https://www.milenio.com/politica/preparan-iniciativa-para-emplear-a-discapacitados-en-tamaulipas",
"https://www.milenio.com/tecnologia/mas-tecnologia/be-my-eyes-voluntario-vidente-app",
"https://www.milenio.com/cultura/vaselina-muy-especial-por-una-sociedad-incluyente",
"https://www.milenio.com/deportes/mas-aficion/torreon-celebran-entusiasmo-xv-carrera-5k-icadi",
"https://www.milenio.com/espectaculos/musica/corona-capital-guadalajara-arranca-fuerte-sol-polvo",
"https://www.milenio.com/politica/gobierno-nl-asegura-dron-costo-29-mdp",
"https://www.milenio.com/futbol/club-santos/nueve-anos-de-una-copa-con-historia-y-ahora-inclusiva",
"https://www.milenio.com/futbol/club-santos/arranca-copa-internacional-santos-penoles-2019",
"https://www.milenio.com/politica/muestran-ninos-unidos-labor-secretaria-seguridad",
"https://www.milenio.com/deportes/reportan-listo-edicion-31-maraton-lala",
"https://www.milenio.com/politica/comunidad/peligran-ninos-con-capacidades-diferentes-en-estancias-infantiles"
)
# Bucle para recorrer las URLs
for (url in urls) {
# Realizar la solicitud a la URL
pagina <- read_html(url)
# Realizar scraping de los datos que necesitas usando selectores CSS o XPath
parrafos19 <- pagina %>%
html_nodes("div#content-body.media-container.news p") %>%
html_text()
# Guardar los datos en un archivo de texto
nombre_archivo <- file.path(carpeta, paste0("datos_2019_", contador1noti, ".txt"))# Nombre del archivo basado en el número en la URL
writeLines(parrafos19, nombre_archivo)
contador1noti <<- contador1noti + 1
cat("Datos de", url, "guardados en", nombre_archivo, "\n")
}
## Datos de https://www.milenio.com/deportes/extra-cancha/cristiano-ronaldo-y-su-gran-gesto-con-un-aficionado-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_1.txt
## Datos de https://www.milenio.com/politica/comunidad/feria-leon-2020-personas-mayores-discapacitados guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_2.txt
## Datos de https://www.milenio.com/politica/comunidad/feria-leon-2020-personas-mayores-discapacitados guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_3.txt
## Datos de https://www.milenio.com/espectaculos/teleton-ayuda-economica-ojala-sigan-esfuerzo-aml guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_4.txt
## Datos de https://www.milenio.com/politica/en-teleton-amlo-pide-a-mexicanos-ayudar guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_5.txt
## Datos de https://www.milenio.com/politica/comunidad/pinatas-de-integra-adornan-la-navidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_6.txt
## Datos de https://www.milenio.com/policia/condenan-agresor-sexual-adolescente-discapacidad-mental guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_7.txt
## Datos de https://www.milenio.com/politica/comunidad/resaltan-importancia-de-estrategias-educativas-incluyentes guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_8.txt
## Datos de https://www.milenio.com/politica/buscan-incluir-lenguaje-discriminacion-leyes-codigos-nl guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_9.txt
## Datos de https://www.milenio.com/politica/congreso/personas-discapacidad-mexico-contratar-seguros-scjn guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_10.txt
## Datos de https://www.milenio.com/politica/comunidad/guanajuato-le-apuesta-mas-a-la-inclusion guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_11.txt
## Datos de https://www.milenio.com/politica/comunidad/mujeres-discapacidad-enfrentan-mayores-dificultades-iemujeres-nl guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_12.txt
## Datos de https://www.milenio.com/politica/comunidad/cristina-diaz-pone-marcha-guadalupe-barreras guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_13.txt
## Datos de https://www.milenio.com/politica/comunidad/dif-nl-compra-35-vehiculos-adaptados-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_14.txt
## Datos de https://www.milenio.com/politica/comunidad/invita-cedh-respetar-derechos-personas-discapacitadas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_15.txt
## Datos de https://www.milenio.com/politica/busca-valera-generar-inclusion-aboral-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_16.txt
## Datos de https://www.milenio.com/politica/comunidad/personas-con-discapacidad-piden-mas-espacios-accesibles guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_17.txt
## Datos de https://www.milenio.com/politica/secretaria-bienestar-815-mil-personas-discapacidad-pension guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_18.txt
## Datos de https://www.milenio.com/politica/amlo-analiza-teleton-atender-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_19.txt
## Datos de https://www.milenio.com/politica/amlo-temas-conferencia-mananera-3-diciembre guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_20.txt
## Datos de https://www.milenio.com/politica/comunidad/tienen-nuevo-rey-y-reina-en-salamanca guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_21.txt
## Datos de https://www.milenio.com/policia/se-ahoga-nino-discapacitado-en-canal-de-reynosa guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_22.txt
## Datos de https://www.milenio.com/politica/comunidad/guadalajara-arranca-la-semana-de-la-inclusion guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_23.txt
## Datos de https://www.milenio.com/politica/preparan-iniciativa-para-emplear-a-discapacitados-en-tamaulipas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_24.txt
## Datos de https://www.milenio.com/tecnologia/mas-tecnologia/be-my-eyes-voluntario-vidente-app guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_25.txt
## Datos de https://www.milenio.com/cultura/vaselina-muy-especial-por-una-sociedad-incluyente guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_26.txt
## Datos de https://www.milenio.com/deportes/mas-aficion/torreon-celebran-entusiasmo-xv-carrera-5k-icadi guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_27.txt
## Datos de https://www.milenio.com/espectaculos/musica/corona-capital-guadalajara-arranca-fuerte-sol-polvo guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_28.txt
## Datos de https://www.milenio.com/politica/gobierno-nl-asegura-dron-costo-29-mdp guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_29.txt
## Datos de https://www.milenio.com/futbol/club-santos/nueve-anos-de-una-copa-con-historia-y-ahora-inclusiva guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_30.txt
## Datos de https://www.milenio.com/futbol/club-santos/arranca-copa-internacional-santos-penoles-2019 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_31.txt
## Datos de https://www.milenio.com/politica/muestran-ninos-unidos-labor-secretaria-seguridad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_32.txt
## Datos de https://www.milenio.com/deportes/reportan-listo-edicion-31-maraton-lala guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_33.txt
## Datos de https://www.milenio.com/politica/comunidad/peligran-ninos-con-capacidades-diferentes-en-estancias-infantiles guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2019_34.txt
##2020
contador2noti <- 1
carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti" # Reemplaza esto con la ruta de la carpeta donde quieres guardar los archivos
dir.create(carpeta, showWarnings = FALSE)
# Cargar bibliotecas
library(rvest)
library(stringr)
# Lista de URLs que deseas scrapear
urls <- c(
"https://www.milenio.com/virales/fauna/hombre-discapacidad-adopta-perro-silla-ruedas",
"https://www.milenio.com/politica/congreso/coronavirus-tamaulipas-piden-informacion-braille-covid-19",
"https://www.milenio.com/politica/secretaria-bienestar-invirtio-143-mil-mdp-2020",
"https://www.milenio.com/internacional/ny-investiga-aplicacion-vacuna-anticovid-publico",
"https://www.milenio.com/politica/comunidad/ciudad-madero-dif-atiende-6-mil-personas-discapacidad",
"https://www.milenio.com/politica/congreso/piden-presupuesto-consulta-indigena-personas-discapacidad",
"https://www.milenio.com/politica/partidos-nl-impulsaran-inclusion-social-2021",
"https://www.milenio.com/politica/comunidad/pilar-gomez-y-femsa-hacen-equipo-por-buenas-causas",
"https://www.milenio.com/politica/comunidad/entregan-leon-mil-396-credenciales-personas-discapacidad-2020",
"https://www.milenio.com/politica/elecciones-2021/inclusion-personas-discapacidad-eleccion-2021-obligatorio",
"https://www.milenio.com/politica/comunidad/udeg-feu-pide-inclusion-comunidad-estudiantil-sorda",
"https://www.milenio.com/tecnologia/apps/look-to-speak-google-app-comunicarse-personas-discapacitadas",
"https://www.milenio.com/deportes/mas-aficion/torreon-consuelo-martinez-entrena-personas-discapacidad",
"https://www.milenio.com/politica/comunidad/en-magdalena-contreras-dan-apoyos-a-personas-con-discapacidad",
"https://www.milenio.com/politica/sep-presenta-estrategia-alfabetizacion-personas-discapacidad",
"https://www.milenio.com/estados/dif-edomex-realiza-inversion-historica-atender-discapacidad",
"https://www.milenio.com/politica/inauguran-ciudad-de-la-inclusion-en-monterrey",
"https://www.milenio.com/politica/comunidad/edomex-con-la-red-mas-grande-para-la-atencion-de-la-discapacidad",
"https://www.milenio.com/politica/mancera-busca-cambiar-denominacion-perros-guia-asistencia",
"https://www.milenio.com/negocios/coronavirus-abre-oportunidades-laborales-personas-discapacidad",
"https://www.milenio.com/politica/personas-con-discapacidad-plantean-cuota-de-contratacion",
"https://www.milenio.com/policia/hallan-cadaver-hombre-discapacitado-colonia-gonzalo-bautista",
"https://www.milenio.com/estados/mas-estados/coahuila-joven-lagunero-pide-apoyo-comer-vestir-san-pedro",
"https://www.milenio.com/policia/hallan-cadaver-hombre-discapacitado-colonia-gonzalo-bautista",
"https://www.milenio.com/politica/comunidad/discapacidades-deben-dejar-de-ser-bandera-politica-incluyeteh",
"https://www.milenio.com/estados/instituto-capacidades-pone-espera-200-personas",
"https://www.milenio.com/politica/pachuca-entrega-ludlow-telleria-cuarto-informe-dif-municipal",
"https://www.milenio.com/policia/coronavirus-tenango-valle-exigen-liberar-reos-vulnerables"
)
# Bucle para recorrer las URLs
for (url in urls) {
# Realizar la solicitud a la URL
pagina <- read_html(url)
# Realizar scraping de los datos que necesitas usando selectores CSS o XPath
parrafos20 <- pagina %>%
html_nodes("div#content-body.media-container.news p") %>%
html_text()
# Guardar los datos en un archivo de texto
nombre_archivo <- file.path(carpeta, paste0("datos_2020_", contador2noti, ".txt"))# Nombre del archivo basado en el número en la URL
writeLines(parrafos20, nombre_archivo)
contador2noti <<- contador2noti + 1
cat("Datos de", url, "guardados en", nombre_archivo, "\n")
}
## Datos de https://www.milenio.com/virales/fauna/hombre-discapacidad-adopta-perro-silla-ruedas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_1.txt
## Datos de https://www.milenio.com/politica/congreso/coronavirus-tamaulipas-piden-informacion-braille-covid-19 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_2.txt
## Datos de https://www.milenio.com/politica/secretaria-bienestar-invirtio-143-mil-mdp-2020 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_3.txt
## Datos de https://www.milenio.com/internacional/ny-investiga-aplicacion-vacuna-anticovid-publico guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_4.txt
## Datos de https://www.milenio.com/politica/comunidad/ciudad-madero-dif-atiende-6-mil-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_5.txt
## Datos de https://www.milenio.com/politica/congreso/piden-presupuesto-consulta-indigena-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_6.txt
## Datos de https://www.milenio.com/politica/partidos-nl-impulsaran-inclusion-social-2021 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_7.txt
## Datos de https://www.milenio.com/politica/comunidad/pilar-gomez-y-femsa-hacen-equipo-por-buenas-causas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_8.txt
## Datos de https://www.milenio.com/politica/comunidad/entregan-leon-mil-396-credenciales-personas-discapacidad-2020 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_9.txt
## Datos de https://www.milenio.com/politica/elecciones-2021/inclusion-personas-discapacidad-eleccion-2021-obligatorio guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_10.txt
## Datos de https://www.milenio.com/politica/comunidad/udeg-feu-pide-inclusion-comunidad-estudiantil-sorda guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_11.txt
## Datos de https://www.milenio.com/tecnologia/apps/look-to-speak-google-app-comunicarse-personas-discapacitadas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_12.txt
## Datos de https://www.milenio.com/deportes/mas-aficion/torreon-consuelo-martinez-entrena-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_13.txt
## Datos de https://www.milenio.com/politica/comunidad/en-magdalena-contreras-dan-apoyos-a-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_14.txt
## Datos de https://www.milenio.com/politica/sep-presenta-estrategia-alfabetizacion-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_15.txt
## Datos de https://www.milenio.com/estados/dif-edomex-realiza-inversion-historica-atender-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_16.txt
## Datos de https://www.milenio.com/politica/inauguran-ciudad-de-la-inclusion-en-monterrey guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_17.txt
## Datos de https://www.milenio.com/politica/comunidad/edomex-con-la-red-mas-grande-para-la-atencion-de-la-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_18.txt
## Datos de https://www.milenio.com/politica/mancera-busca-cambiar-denominacion-perros-guia-asistencia guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_19.txt
## Datos de https://www.milenio.com/negocios/coronavirus-abre-oportunidades-laborales-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_20.txt
## Datos de https://www.milenio.com/politica/personas-con-discapacidad-plantean-cuota-de-contratacion guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_21.txt
## Datos de https://www.milenio.com/policia/hallan-cadaver-hombre-discapacitado-colonia-gonzalo-bautista guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_22.txt
## Datos de https://www.milenio.com/estados/mas-estados/coahuila-joven-lagunero-pide-apoyo-comer-vestir-san-pedro guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_23.txt
## Datos de https://www.milenio.com/policia/hallan-cadaver-hombre-discapacitado-colonia-gonzalo-bautista guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_24.txt
## Datos de https://www.milenio.com/politica/comunidad/discapacidades-deben-dejar-de-ser-bandera-politica-incluyeteh guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_25.txt
## Datos de https://www.milenio.com/estados/instituto-capacidades-pone-espera-200-personas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_26.txt
## Datos de https://www.milenio.com/politica/pachuca-entrega-ludlow-telleria-cuarto-informe-dif-municipal guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_27.txt
## Datos de https://www.milenio.com/policia/coronavirus-tenango-valle-exigen-liberar-reos-vulnerables guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2020_28.txt
##2021
contador3noti <- 1
carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti" # Reemplaza esto con la ruta de la carpeta donde quieres guardar los archivos
dir.create(carpeta, showWarnings = FALSE)
# Cargar bibliotecas
library(rvest)
library(stringr)
# Lista de URLs que deseas scrapear
urls <- c(
"https://www.milenio.com/politica/pension-bienestar-discapacidad-aumento-2022",
"https://www.milenio.com/internacional/expertos-defienden-el-acompanamiento-como-derecho-para-ancianos",
"https://www.milenio.com/internacional/expertos-defienden-el-acompanamiento-como-derecho-para-ancianos",
"https://www.milenio.com/internacional/enfermera-condenada-15-anos-prision-masacre-alemania",
"https://www.milenio.com/politica/margarita-garfias-gana-premio-nacional-derechos-humanos",
"https://www.milenio.com/politica/habra-pension-universal-para-personas-con-discapacidad-de-puebla",
"https://www.milenio.com/aula/buscar-la-inclusion-educativa-para-una-sociedad-mas-equitativa",
"https://www.milenio.com/politica/comunidad/avance-espacios-acceso-personas-discapacidad-puebla",
"https://www.milenio.com/politica/organismos/imss-garantiza-empleo-con-incapacidad-laboral-de-trabajo",
"https://www.milenio.com/politica/comunidad/arranca-en-leon-el-programa-medico-en-tu-casa",
"https://www.milenio.com/politica/comunidad/mamas-ninos-discapacidad-necesitan-apoyo-alimentacion",
"https://www.milenio.com/politica/pri-presenta-iniciativa-beneficio-personas-discapacidad",
"https://www.milenio.com/negocios/amis-respalda-reforma-eliminar-discriminacion-contratar-seguro",
"https://www.milenio.com/estados/mujeres-discapacidad-sufren-doble-discriminacion-gomez-palacio",
"https://www.milenio.com/politica/comunidad/emprendedoras-con-discapacidad-retos-y-desigualdad",
"https://www.milenio.com/sociedad/salud-educacion-piden-ninos-alcaldesa-leon",
"https://www.milenio.com/sociedad/vercodi-equinoterapia-al-alcance-de-todos-en-nuevo-leon",
"https://www.milenio.com/cultura/incluyen-personas-discapacidad-actividad-cultural-edomex",
"https://www.milenio.com/policia/marchan-personas-con-discapacidad-en-cdmx",
"https://www.milenio.com/sociedad/marchan-personas-discapacidad-puebla-exigir-inclusion",
"https://www.milenio.com/politica/diputados-promueven-trabajos-para-personas-con-discapacidad",
"https://www.milenio.com/virales/italia-abuelito-15-anos-salir-casa-elevador",
"https://www.milenio.com/internacional/misiles-gaza-matan-hombre-discapacitado-esposa-hija",
"https://www.milenio.com/salud/tamaulipas-abuelito-que-tuvo-covid-19-es-abandonado-en-un-carro",
"https://www.milenio.com/salud/tamaulipas-abuelito-que-tuvo-covid-19-es-abandonado-en-un-carro",
"https://www.milenio.com/sociedad/en-leon-regresan-las-tarjetas-pagobus",
"https://www.milenio.com/cultura/lucha-libre-patrimonio-humanidad-pasar-desapercibid",
"https://www.milenio.com/politica/comunidad/tehuacan-cuenta-con-un-parque-para-ninos-con-capacidades-diferentes",
"https://www.milenio.com/deportes/mas-aficion/pagano-enfrenta-filex-iii-luchador-capacidades",
"https://www.milenio.com/ciencia-y-salud/sociedad/nuevoleon-inauguran-centro-rehabilitacion-infantil-equinoterapia",
"https://www.milenio.com/politica/elecciones-2021/reivindicar-papel-mujer-prioridad-tony-rodriguez",
"https://www.milenio.com/politica/comunidad/playa-miramar-dif-madero-dara-atencion-visitantes-semana-santa"
)
# Bucle para recorrer las URLs
for (url in urls) {
# Realizar la solicitud a la URL
pagina <- read_html(url)
# Realizar scraping de los datos que necesitas usando selectores CSS o XPath
parrafos21 <- pagina %>%
html_nodes("div#content-body.media-container.news p") %>%
html_text()
# Guardar los datos en un archivo de texto
nombre_archivo <- file.path(carpeta, paste0("datos_2021_", contador3noti, ".txt"))# Nombre del archivo basado en el número en la URL
writeLines(parrafos21, nombre_archivo)
contador3noti <<- contador3noti + 1
cat("Datos de", url, "guardados en", nombre_archivo, "\n")
}
## Datos de https://www.milenio.com/politica/pension-bienestar-discapacidad-aumento-2022 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_1.txt
## Datos de https://www.milenio.com/internacional/expertos-defienden-el-acompanamiento-como-derecho-para-ancianos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_2.txt
## Datos de https://www.milenio.com/internacional/expertos-defienden-el-acompanamiento-como-derecho-para-ancianos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_3.txt
## Datos de https://www.milenio.com/internacional/enfermera-condenada-15-anos-prision-masacre-alemania guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_4.txt
## Datos de https://www.milenio.com/politica/margarita-garfias-gana-premio-nacional-derechos-humanos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_5.txt
## Datos de https://www.milenio.com/politica/habra-pension-universal-para-personas-con-discapacidad-de-puebla guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_6.txt
## Datos de https://www.milenio.com/aula/buscar-la-inclusion-educativa-para-una-sociedad-mas-equitativa guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_7.txt
## Datos de https://www.milenio.com/politica/comunidad/avance-espacios-acceso-personas-discapacidad-puebla guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_8.txt
## Datos de https://www.milenio.com/politica/organismos/imss-garantiza-empleo-con-incapacidad-laboral-de-trabajo guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_9.txt
## Datos de https://www.milenio.com/politica/comunidad/arranca-en-leon-el-programa-medico-en-tu-casa guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_10.txt
## Datos de https://www.milenio.com/politica/comunidad/mamas-ninos-discapacidad-necesitan-apoyo-alimentacion guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_11.txt
## Datos de https://www.milenio.com/politica/pri-presenta-iniciativa-beneficio-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_12.txt
## Datos de https://www.milenio.com/negocios/amis-respalda-reforma-eliminar-discriminacion-contratar-seguro guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_13.txt
## Datos de https://www.milenio.com/estados/mujeres-discapacidad-sufren-doble-discriminacion-gomez-palacio guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_14.txt
## Datos de https://www.milenio.com/politica/comunidad/emprendedoras-con-discapacidad-retos-y-desigualdad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_15.txt
## Datos de https://www.milenio.com/sociedad/salud-educacion-piden-ninos-alcaldesa-leon guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_16.txt
## Datos de https://www.milenio.com/sociedad/vercodi-equinoterapia-al-alcance-de-todos-en-nuevo-leon guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_17.txt
## Datos de https://www.milenio.com/cultura/incluyen-personas-discapacidad-actividad-cultural-edomex guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_18.txt
## Datos de https://www.milenio.com/policia/marchan-personas-con-discapacidad-en-cdmx guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_19.txt
## Datos de https://www.milenio.com/sociedad/marchan-personas-discapacidad-puebla-exigir-inclusion guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_20.txt
## Datos de https://www.milenio.com/politica/diputados-promueven-trabajos-para-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_21.txt
## Datos de https://www.milenio.com/virales/italia-abuelito-15-anos-salir-casa-elevador guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_22.txt
## Datos de https://www.milenio.com/internacional/misiles-gaza-matan-hombre-discapacitado-esposa-hija guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_23.txt
## Datos de https://www.milenio.com/salud/tamaulipas-abuelito-que-tuvo-covid-19-es-abandonado-en-un-carro guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_24.txt
## Datos de https://www.milenio.com/salud/tamaulipas-abuelito-que-tuvo-covid-19-es-abandonado-en-un-carro guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_25.txt
## Datos de https://www.milenio.com/sociedad/en-leon-regresan-las-tarjetas-pagobus guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_26.txt
## Datos de https://www.milenio.com/cultura/lucha-libre-patrimonio-humanidad-pasar-desapercibid guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_27.txt
## Datos de https://www.milenio.com/politica/comunidad/tehuacan-cuenta-con-un-parque-para-ninos-con-capacidades-diferentes guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_28.txt
## Datos de https://www.milenio.com/deportes/mas-aficion/pagano-enfrenta-filex-iii-luchador-capacidades guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_29.txt
## Datos de https://www.milenio.com/ciencia-y-salud/sociedad/nuevoleon-inauguran-centro-rehabilitacion-infantil-equinoterapia guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_30.txt
## Datos de https://www.milenio.com/politica/elecciones-2021/reivindicar-papel-mujer-prioridad-tony-rodriguez guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_31.txt
## Datos de https://www.milenio.com/politica/comunidad/playa-miramar-dif-madero-dara-atencion-visitantes-semana-santa guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2021_32.txt
##2022
contador4noti <- 1
carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti" # Reemplaza esto con la ruta de la carpeta donde quieres guardar los archivos
dir.create(carpeta, showWarnings = FALSE)
# Cargar bibliotecas
library(rvest)
library(stringr)
# Lista de URLs que deseas scrapear
urls <- c(
"https://www.milenio.com/virales/brigada-bomberos-baila-cancion-daft-punk",
"https://www.milenio.com/policia/feminicidio-ana-maria-chimalhuacan-exigen-justicia",
"https://www.milenio.com/estados/nayarit-entregan-tarjetas-bienestar-pension-universal",
"https://www.milenio.com/politica/partido-accion-nacional-propone-candidaturas-para-comunidad-lgbt",
"https://www.milenio.com/espectaculos/teleton-celebra-25-anos",
"https://www.milenio.com/politica/pension-para-personas-con-discapacidad-aumentara-en-2023",
"https://www.milenio.com/politica/comunidad/estacionamientos-especiales-puebla-mitad-solicitudes-falsas",
"https://www.milenio.com/politica/red-nacional-ciegos-llama-ajustar-articulos",
"https://www.milenio.com/cultura/zapopan-fallece-el-artista-froylan-diaz",
"https://www.milenio.com/internacional/canada-podria-tener-el-proceso-de-eutanasia-mas-accesible-del-mundo",
"https://www.milenio.com/politica/chiapas-dan-tarjetas-de-pension-para-personas-con-discapacidad",
"https://www.milenio.com/politica/hidalgo-fallece-lucrecia-lorena-hernandez-diputada-morena",
"https://www.milenio.com/politica/pagos-pensiones-bienestar-hidalgo-superan-96-ciento",
"https://www.milenio.com/politica/comunidad/evaluan-eliminar-riesgos-discapacitados-centro-tampico",
"https://www.milenio.com/politica/comunidad/evaluan-riesgos-afectan-discapacitados-centro-tampico",
"https://www.milenio.com/politica/comunidad/presentan-el-registro-estatal-de-discapacidad-en-edomex",
"https://www.milenio.com/politica/organismos/hidalgo-necesaria-capacitacion-atender-personas-discapacitadas",
"https://www.milenio.com/aula/programa-busca-la-reintegracion-de-personas-con-discapacidad",
"https://www.milenio.com/politica/congreso/buscan-generar-estimulos-aumentar-personas-discapacidad",
"https://www.milenio.com/internacional/madrid-disenan-perro-robot-guiar-a-personas-con-discapacidad",
"https://www.milenio.com/sociedad/gobierno-nl-entrega-apoyos-personas-discapacidad",
"https://www.milenio.com/opinion/sarai-aguilar-arriozola/arcon-de-hipatia/qatar-maluma-e-infantino-felices-cuantos",
"https://www.milenio.com/virales/ladron-devuelve-automovil-mujer-deja-nota-pidiendo-perdon",
"https://www.milenio.com/internacional/asia-y-oceania/singapur-hombre-discapacitado-condenado-muerte-drogas",
"https://www.milenio.com/politica/comunidad/en-tamaulipas-violentan-a-seis-de-cada-diez-mujeres-con-discapacidad",
"https://www.milenio.com/politica/comunidad/puente-papa-diputados-piden-monterrey-rehabilitarlo",
"https://www.milenio.com/politica/comunidad/jose-lucha-visibilizar-derechos-personas-discapacidad",
"https://www.milenio.com/politica/comunidad/inicia-torneo-estatal-baloncesto-silla-ruedas-altamira",
"https://www.milenio.com/politica/comunidad/admision-buap-2022-aspirantes-varados-discapacidad-examen",
"https://www.milenio.com/politica/prd-pide-gobierno-nl-congelar-tarifas-metro-estudiantes",
"https://www.milenio.com/politica/pri-propone-impulsar-educacion-inclusiva-nuevo-leon",
"https://www.milenio.com/futbol/club-america/america-fomenta-inclusion-mundial-sindrome-down",
"https://www.milenio.com/negocios/terraza-suite-presidencial-hotel-principal-aifa",
"https://www.milenio.com/politica/comunidad/apoyo-personas-discapacitadas-dif-zinacantepec-requisitos",
"https://www.milenio.com/politica/amlo-asegura-sentirse-bien-tras-filtracion-de-reportes-medicos"
)
# Bucle para recorrer las URLs
for (url in urls) {
# Realizar la solicitud a la URL
pagina <- read_html(url)
# Realizar scraping de los datos que necesitas usando selectores CSS o XPath
parrafos22 <- pagina %>%
html_nodes("div#content-body.media-container.news p") %>%
html_text()
# Guardar los datos en un archivo de texto
nombre_archivo <- file.path(carpeta, paste0("datos_2022_", contador4noti, ".txt"))# Nombre del archivo basado en el número en la URL
writeLines(parrafos22, nombre_archivo)
contador4noti <<- contador4noti + 1
cat("Datos de", url, "guardados en", nombre_archivo, "\n")
}
## Datos de https://www.milenio.com/virales/brigada-bomberos-baila-cancion-daft-punk guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_1.txt
## Datos de https://www.milenio.com/policia/feminicidio-ana-maria-chimalhuacan-exigen-justicia guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_2.txt
## Datos de https://www.milenio.com/estados/nayarit-entregan-tarjetas-bienestar-pension-universal guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_3.txt
## Datos de https://www.milenio.com/politica/partido-accion-nacional-propone-candidaturas-para-comunidad-lgbt guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_4.txt
## Datos de https://www.milenio.com/espectaculos/teleton-celebra-25-anos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_5.txt
## Datos de https://www.milenio.com/politica/pension-para-personas-con-discapacidad-aumentara-en-2023 guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_6.txt
## Datos de https://www.milenio.com/politica/comunidad/estacionamientos-especiales-puebla-mitad-solicitudes-falsas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_7.txt
## Datos de https://www.milenio.com/politica/red-nacional-ciegos-llama-ajustar-articulos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_8.txt
## Datos de https://www.milenio.com/cultura/zapopan-fallece-el-artista-froylan-diaz guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_9.txt
## Datos de https://www.milenio.com/internacional/canada-podria-tener-el-proceso-de-eutanasia-mas-accesible-del-mundo guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_10.txt
## Datos de https://www.milenio.com/politica/chiapas-dan-tarjetas-de-pension-para-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_11.txt
## Datos de https://www.milenio.com/politica/hidalgo-fallece-lucrecia-lorena-hernandez-diputada-morena guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_12.txt
## Datos de https://www.milenio.com/politica/pagos-pensiones-bienestar-hidalgo-superan-96-ciento guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_13.txt
## Datos de https://www.milenio.com/politica/comunidad/evaluan-eliminar-riesgos-discapacitados-centro-tampico guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_14.txt
## Datos de https://www.milenio.com/politica/comunidad/evaluan-riesgos-afectan-discapacitados-centro-tampico guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_15.txt
## Datos de https://www.milenio.com/politica/comunidad/presentan-el-registro-estatal-de-discapacidad-en-edomex guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_16.txt
## Datos de https://www.milenio.com/politica/organismos/hidalgo-necesaria-capacitacion-atender-personas-discapacitadas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_17.txt
## Datos de https://www.milenio.com/aula/programa-busca-la-reintegracion-de-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_18.txt
## Datos de https://www.milenio.com/politica/congreso/buscan-generar-estimulos-aumentar-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_19.txt
## Datos de https://www.milenio.com/internacional/madrid-disenan-perro-robot-guiar-a-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_20.txt
## Datos de https://www.milenio.com/sociedad/gobierno-nl-entrega-apoyos-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_21.txt
## Datos de https://www.milenio.com/opinion/sarai-aguilar-arriozola/arcon-de-hipatia/qatar-maluma-e-infantino-felices-cuantos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_22.txt
## Datos de https://www.milenio.com/virales/ladron-devuelve-automovil-mujer-deja-nota-pidiendo-perdon guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_23.txt
## Datos de https://www.milenio.com/internacional/asia-y-oceania/singapur-hombre-discapacitado-condenado-muerte-drogas guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_24.txt
## Datos de https://www.milenio.com/politica/comunidad/en-tamaulipas-violentan-a-seis-de-cada-diez-mujeres-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_25.txt
## Datos de https://www.milenio.com/politica/comunidad/puente-papa-diputados-piden-monterrey-rehabilitarlo guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_26.txt
## Datos de https://www.milenio.com/politica/comunidad/jose-lucha-visibilizar-derechos-personas-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_27.txt
## Datos de https://www.milenio.com/politica/comunidad/inicia-torneo-estatal-baloncesto-silla-ruedas-altamira guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_28.txt
## Datos de https://www.milenio.com/politica/comunidad/admision-buap-2022-aspirantes-varados-discapacidad-examen guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_29.txt
## Datos de https://www.milenio.com/politica/prd-pide-gobierno-nl-congelar-tarifas-metro-estudiantes guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_30.txt
## Datos de https://www.milenio.com/politica/pri-propone-impulsar-educacion-inclusiva-nuevo-leon guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_31.txt
## Datos de https://www.milenio.com/futbol/club-america/america-fomenta-inclusion-mundial-sindrome-down guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_32.txt
## Datos de https://www.milenio.com/negocios/terraza-suite-presidencial-hotel-principal-aifa guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_33.txt
## Datos de https://www.milenio.com/politica/comunidad/apoyo-personas-discapacitadas-dif-zinacantepec-requisitos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_34.txt
## Datos de https://www.milenio.com/politica/amlo-asegura-sentirse-bien-tras-filtracion-de-reportes-medicos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2022_35.txt
##2023
contador5noti <- 1
carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti" # Reemplaza esto con la ruta de la carpeta donde quieres guardar los archivos
dir.create(carpeta, showWarnings = FALSE)
# Cargar bibliotecas
library(rvest)
library(stringr)
# Lista de URLs que deseas scrapear
urls <- c(
"https://www.milenio.com/espectaculos/famosos/katy-perry-y-orlando-bloom-ganan-juicio-por-mansion-veterano",
"https://www.milenio.com/deportes/mas-aficion/sordolimpiadas-el-evento-multideportivo-para-personas-con-discapacidad",
"https://www.milenio.com/espectaculos/cine/hollywood-representacion-latina-mejoro-15-anos-estudio",
"https://www.milenio.com/politica/comunidad/huracan-otis-afecta-a-familias-tras-perdida-de-personas-en-acapulco",
"https://www.milenio.com/salud/edomex-tramitan-mas-de-mil-500-certificados-de-discapacidad",
"https://www.milenio.com/politica/senado-respalda-personas-discapacidad-accedan-animales",
"https://www.milenio.com/policia/proponen-aumentar-penas-delitos-sexuales-grupos-vulnerables",
"https://www.milenio.com/futbol/club-atlas/copa-atlas-2023-es-anunciada-en-guadalajara",
"https://www.milenio.com/politica/comunidad/iree-capacita-para-la-vida-laboral-a-personas-con-discapacidad",
"https://www.milenio.com/politica/asf-programas-del-sndif-no-favorecieron-la-inclusion-de-personas-dice",
"https://www.milenio.com/politica/elecciones/ine-promueve-candidaturas-personas-discapacidad-curso",
"https://www.milenio.com/estados/san-luis-potosi-asesinan-joven-discapacidad",
"https://www.milenio.com/politica/comunidad/dia-de-las-personas-talla-pequena-celebracion-mexico",
"https://www.milenio.com/politica/comunidad/37-mil-mexiquenses-solicitado-pension-discapacidad",
"https://www.milenio.com/estados/coahuila-iec-inicia-consultas-pueblos-indigenas-afromexicanos",
"https://www.milenio.com/politica/pension-beneficiara-a-mas-de-un-millon-de-personas-con-discapacidad",
"https://www.milenio.com/politica/pri-diputada-pide-abrir-espacios-mujeres-indigenas-campo",
"https://www.milenio.com/politica/pago-pensiones-personas-discapacidad-finales-octubre",
"https://www.milenio.com/estados/durango-van-4-quejas-de-discriminacion-laboral-por-diversidad-sexual",
"https://www.milenio.com/politica/pan-nl-pide-indemnizar-ciudadanos-negligencia-metro",
"https://www.milenio.com/salud/instalan-modulos-de-inscripcion-a-pension-en-edomex",
"https://www.milenio.com/virales/joven-discapacitado-es-captado-llevando-flores-amarillas-para-regalar",
"https://www.milenio.com/policia/rescatan-hombre-discapacitado-arrojado-canal-ecatepec",
"https://www.milenio.com/virales/hombres-cargan-amigo-discapacitado-para-tomarse-foto-en-caja-de-barbie",
"https://www.milenio.com/estados/hombre-detenido-pasar-discapacitado-pedia-limosna",
"https://www.milenio.com/virales/mujer-aparta-lugar-discapacitados-recibe-costosa-leccion-video-viral",
"https://www.milenio.com/internacional/guatemala-ataque-armado-deja-3-muertos-menor-edad",
"https://www.milenio.com/politica/ruben-rocha-afirma-que-la-beneficencia-publica-no-deja-a",
"https://www.milenio.com/politica/analizaran-inclusion-personas-discapacidad-planilla-laboral",
"https://www.milenio.com/politica/comunidad/menores-huejutla-capacidades-conocen-playa-miramar",
"https://www.milenio.com/politica/comunidad/aumenta-inclusion-para-actividades-deportivas-en-tehuacan",
"https://www.milenio.com/estados/realizan-primera-feria-de-inclusion-y-autoempleo-en-neza"
)
# Bucle para recorrer las URLs
for (url in urls) {
# Realizar la solicitud a la URL
pagina <- read_html(url)
# Realizar scraping de los datos que necesitas usando selectores CSS o XPath
parrafos23 <- pagina %>%
html_nodes("div#content-body.media-container.news p") %>%
html_text()
# Guardar los datos en un archivo de texto
nombre_archivo <- file.path(carpeta, paste0("datos_2023_", contador5noti, ".txt"))# Nombre del archivo basado en el número en la URL
writeLines(parrafos23, nombre_archivo)
contador5noti <<- contador5noti + 1
cat("Datos de", url, "guardados en", nombre_archivo, "\n")
}
## Datos de https://www.milenio.com/espectaculos/famosos/katy-perry-y-orlando-bloom-ganan-juicio-por-mansion-veterano guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_1.txt
## Datos de https://www.milenio.com/deportes/mas-aficion/sordolimpiadas-el-evento-multideportivo-para-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_2.txt
## Datos de https://www.milenio.com/espectaculos/cine/hollywood-representacion-latina-mejoro-15-anos-estudio guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_3.txt
## Datos de https://www.milenio.com/politica/comunidad/huracan-otis-afecta-a-familias-tras-perdida-de-personas-en-acapulco guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_4.txt
## Datos de https://www.milenio.com/salud/edomex-tramitan-mas-de-mil-500-certificados-de-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_5.txt
## Datos de https://www.milenio.com/politica/senado-respalda-personas-discapacidad-accedan-animales guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_6.txt
## Datos de https://www.milenio.com/policia/proponen-aumentar-penas-delitos-sexuales-grupos-vulnerables guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_7.txt
## Datos de https://www.milenio.com/futbol/club-atlas/copa-atlas-2023-es-anunciada-en-guadalajara guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_8.txt
## Datos de https://www.milenio.com/politica/comunidad/iree-capacita-para-la-vida-laboral-a-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_9.txt
## Datos de https://www.milenio.com/politica/asf-programas-del-sndif-no-favorecieron-la-inclusion-de-personas-dice guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_10.txt
## Datos de https://www.milenio.com/politica/elecciones/ine-promueve-candidaturas-personas-discapacidad-curso guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_11.txt
## Datos de https://www.milenio.com/estados/san-luis-potosi-asesinan-joven-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_12.txt
## Datos de https://www.milenio.com/politica/comunidad/dia-de-las-personas-talla-pequena-celebracion-mexico guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_13.txt
## Datos de https://www.milenio.com/politica/comunidad/37-mil-mexiquenses-solicitado-pension-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_14.txt
## Datos de https://www.milenio.com/estados/coahuila-iec-inicia-consultas-pueblos-indigenas-afromexicanos guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_15.txt
## Datos de https://www.milenio.com/politica/pension-beneficiara-a-mas-de-un-millon-de-personas-con-discapacidad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_16.txt
## Datos de https://www.milenio.com/politica/pri-diputada-pide-abrir-espacios-mujeres-indigenas-campo guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_17.txt
## Datos de https://www.milenio.com/politica/pago-pensiones-personas-discapacidad-finales-octubre guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_18.txt
## Datos de https://www.milenio.com/estados/durango-van-4-quejas-de-discriminacion-laboral-por-diversidad-sexual guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_19.txt
## Datos de https://www.milenio.com/politica/pan-nl-pide-indemnizar-ciudadanos-negligencia-metro guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_20.txt
## Datos de https://www.milenio.com/salud/instalan-modulos-de-inscripcion-a-pension-en-edomex guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_21.txt
## Datos de https://www.milenio.com/virales/joven-discapacitado-es-captado-llevando-flores-amarillas-para-regalar guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_22.txt
## Datos de https://www.milenio.com/policia/rescatan-hombre-discapacitado-arrojado-canal-ecatepec guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_23.txt
## Datos de https://www.milenio.com/virales/hombres-cargan-amigo-discapacitado-para-tomarse-foto-en-caja-de-barbie guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_24.txt
## Datos de https://www.milenio.com/estados/hombre-detenido-pasar-discapacitado-pedia-limosna guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_25.txt
## Datos de https://www.milenio.com/virales/mujer-aparta-lugar-discapacitados-recibe-costosa-leccion-video-viral guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_26.txt
## Datos de https://www.milenio.com/internacional/guatemala-ataque-armado-deja-3-muertos-menor-edad guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_27.txt
## Datos de https://www.milenio.com/politica/ruben-rocha-afirma-que-la-beneficencia-publica-no-deja-a guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_28.txt
## Datos de https://www.milenio.com/politica/analizaran-inclusion-personas-discapacidad-planilla-laboral guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_29.txt
## Datos de https://www.milenio.com/politica/comunidad/menores-huejutla-capacidades-conocen-playa-miramar guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_30.txt
## Datos de https://www.milenio.com/politica/comunidad/aumenta-inclusion-para-actividades-deportivas-en-tehuacan guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_31.txt
## Datos de https://www.milenio.com/estados/realizan-primera-feria-de-inclusion-y-autoempleo-en-neza guardados en /Users/abby/Documents/5to/CD II/Reto/Noti/datos_2023_32.txt
#Limpieza Este código una serie de operaciones para limpiar archivos de texto en español ubicados en la carpeta “/Users/abby/Documents/5to/CD II/Reto/Noti”. Inicialmente, se obtiene una lista de todos los archivos en esa carpeta. Luego, se utiliza la biblioteca tm para procesar y limpiar el texto. En un bucle, cada archivo se lee, convierte a minúsculas, elimina saltos de línea, puntuación y palabras vacías (stopwords) en español. El texto limpio se escribe de nuevo en archivos con el prefijo ‘limpio_’. Este proceso de limpieza es común en análisis de texto para preparar datos para análisis de texto o minería de texto.
file_list19 <- list.files(path = "/Users/abby/Documents/5to/CD II/Reto/Noti")
# Carga las bibliotecas necesarias
library(tm)
## Loading required package: NLP
library(SnowballC)
# Define la ruta de la carpeta
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti"
# Obtiene la lista de archivos .txt en la carpeta
archivos <- list.files(path = ruta_carpeta, pattern = "*.txt")
# Loop para leer y limpiar cada archivo
for (archivo in archivos) {
# Lee el archivo
texto <- readLines(paste0(ruta_carpeta, "/", archivo))
# Convierte a minúsculas
texto <- tolower(texto)
# Elimina los saltos de línea
texto <- gsub("\n", " ", texto)
# Elimina la puntuación
texto <- removePunctuation(texto)
# Elimina las palabras vacías
texto <- removeWords(texto, stopwords("spanish"))
# Escribe el texto limpio de nuevo al archivo
writeLines(texto, paste0(ruta_carpeta, "/limpio_", archivo))
}
#Análisis
##2019 ###Vectorización
Este código tiene como objetivo leer y vectorizar el texto contenido en archivos limpios procesados previamente, específicamente aquellos que cumplen con un patrón en su nombre de archivo. La ruta de la carpeta se establece en “/Users/abby/Documents/5to/CD II/Reto/Noti/limpio”. Luego, se utiliza la función list.files para obtener una lista de archivos en esa carpeta que coinciden con el patrón “limpio_datos_2019.*.txt”. Un vector llamado texto_vectorizado19 se inicializa para almacenar el texto de estos archivos.
El código utiliza un bucle para recorrer cada archivo en la lista, leyendo el contenido de cada archivo de texto limpio y concatenando ese contenido en el vector texto_vectorizado19.
# Ruta de la carpeta
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti/limpio"
# Lista de archivos en la carpeta que coinciden con el patrón
archivos <- list.files(path = ruta_carpeta, pattern = "limpio_datos_2019.*\\.txt")
# Inicializa un vector para almacenar el texto de los archivos
texto_vectorizado19 <- character(length(archivos))
# Loop para leer y vectorizar el texto de cada archivo
for (i in 1:length(archivos)) {
# Ruta completa del archivo
ruta_archivo <- file.path(ruta_carpeta, archivos[i])
# Lee el archivo de texto
texto <- readLines(ruta_archivo)
# Vectoriza el texto
texto_vectorizado19[i] <- paste(texto, collapse = " ")
}
###Corpus y nube de palabras Este código realiza un análisis de texto
sobre los comentarios vectorizados correspondientes al año 2019.
Primero, crea un corpus utilizando la función Corpus de la
biblioteca tm a partir del vector
texto_vectorizado19. Luego, genera una matriz
término-documento (DTM) utilizando DocumentTermMatrix para
contar la frecuencia de cada término en los comentarios. Posteriormente,
calcula el conteo total de términos y los ordena de manera descendente.
El código identifica y muestra los 25 términos más comunes en los
comentarios del año 2019. Luego, utiliza el paquete
wordcloud2 para visualizar estos términos comunes en una
nube de palabras, asignando colores específicos a una lista predefinida
de palabras relacionadas con discapacidades. Finalmente, guarda la nube
de palabras como un archivo HTML y la convierte a una imagen PNG
utilizando la función webshot, guardando la imagen en una
carpeta especificada. En resumen, este código ofrece un análisis visual
de los términos más frecuentes en los comentarios de 2019, con un
enfoque especial en palabras relacionadas con discapacidades.
#Crea corpus
corpus19 <- Corpus(VectorSource(texto_vectorizado19))
# Creación DTM
dtm19 <- DocumentTermMatrix(corpus19)
#Conteo
conteo_total <- colSums(as.matrix(dtm19))
#Ordenar y mostrar los términos comúnes
terminos_comunes19<- sort(conteo_total, decreasing = TRUE)
#Identificación 25 términos más comúnes
head(terminos_comunes19, 25)
## personas discapacidad mil trabajo parte
## 88 87 28 24 20
## méxico millones día años
## 20 20 20 19 19
## año niños así sociedad lugar
## 19 18 17 17 17
## león pesos internacional atención “
## 16 16 15 15 15
## destacó diferentes cada laboral dif
## 14 14 14 13 13
# Carga el paquete wordcloud2
library(wordcloud2)
library(htmlwidgets)
# Define una lista de palabras
lista_palabras <- c("discapacidad", "discapacitado", "minusvalido", "diferentes", "enfermito", "capacidades")
# Define los colores para las palabras
colores <- ifelse(names(terminos_comunes19) %in% lista_palabras, "blue", "black")
# Crea la nube de palabras
nube <- wordcloud2(data.frame(word = names(terminos_comunes19), freq = terminos_comunes19),
color = colores, minSize = 2, size = 0.6)
saveWidget(nube, file="nube.html", selfcontained = F)
nube
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/nubes"
# Convierte el archivo HTML a PNG con webshot y lo guarda en la carpeta especificada
webshot::webshot("nube.html", file = paste0(ruta_carpeta, "/nube.png"))
###Análisis de sentimientos Este código realiza un análisis de
sentimientos sobre los comentarios procesados del año 2019. Comienza
cargando varias bibliotecas necesarias para el análisis, incluyendo
syuzhet, RColorBrewer, wordcloud,
y tm. A continuación, tokeniza el corpus de comentarios,
convierte el texto a minúsculas, elimina puntuación, números y palabras
vacías en español. Luego, se obtiene un vector de palabras y se realiza
un análisis de sentimientos utilizando el paquete syuzhet,
generando una tabla que muestra la cantidad de palabras asociadas a
diferentes emociones. A través de gráficos de barras, identifica las
palabras más frecuentes asociadas con sentimientos de tristeza,
felicidad, enfado, confianza, miedo y disgusto. Posteriormente, crea una
nube de palabras para visualizar las emociones presentes en los
comentarios. También realiza un análisis de sentimientos con el paquete
afinn, clasificando las palabras en positivas o negativas y
representando los resultados con una gráfica de barras apilada. Este
código proporciona una visión completa de los sentimientos expresados en
los comentarios del año 2019, permitiendo una comprensión más profunda
de la tonalidad emocional presente en el conjunto de datos.
# Carga los paquetes
library(syuzhet)
library(RColorBrewer)
library(wordcloud)
library(tm)
# Tokenización en el corpus
corpus_tokenizado <- tm_map(corpus19, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(corpus19, content_transformer(tolower)):
## transformation drops documents
corpus_tokenizado <- tm_map(corpus_tokenizado, removePunctuation)
## Warning in tm_map.SimpleCorpus(corpus_tokenizado, removePunctuation):
## transformation drops documents
corpus_tokenizado <- tm_map(corpus_tokenizado, removeNumbers)
## Warning in tm_map.SimpleCorpus(corpus_tokenizado, removeNumbers): transformation
## drops documents
corpus_tokenizado <- tm_map(corpus_tokenizado, removeWords, stopwords("spanish"))
## Warning in tm_map.SimpleCorpus(corpus_tokenizado, removeWords,
## stopwords("spanish")): transformation drops documents
# Obtención del texto tokenizado como un vector
texto_palabras <- sapply(corpus_tokenizado, function(x) unlist(strsplit(as.character(x), " ")))
# Convertir a una lista
texto_palabras <- unlist(texto_palabras)
# Eliminar elementos vacíos
texto_palabras <- texto_palabras[texto_palabras != ""]
# Análisis de sentimientos
sentimientos_df <- get_nrc_sentiment(texto_palabras, lang="spanish")
head(sentimientos_df)
## anger anticipation disgust fear joy sadness surprise trust negative positive
## 1 0 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0 0 0
## 5 0 1 0 0 0 0 0 1 0 1
## 6 0 0 0 0 0 0 0 0 0 0
# Gráfica de barras sentimientos
barplot(
colSums(prop.table(sentimientos_df[, 1:8])),
space = 0.2,
horiz = FALSE,
las = 1,
cex.names = 0.7,
col = brewer.pal(n = 8, name = "Set3"),
main = "Noticias sobre personas con discapacidad, 2019",
xlab = "emociones", ylab = NULL
)
# Filtra palabras asociadas con diferentes sentimientos y las ordena
palabras_trust <- texto_palabras[sentimientos_df$trust> 0]
palabras_trust_orden <- sort(table(unlist(palabras_trust)), decreasing = TRUE)
head(palabras_trust_orden, n = 12)
##
## trabajo cuenta instituto presidente general recursos congreso
## 24 12 12 11 10 10 9
## equipo apoyo centro importante marco
## 9 8 8 8 8
palabras_tristeza <- texto_palabras[sentimientos_df$sadness> 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n = 12)
##
## discapacidad compromiso artículo discapacidad caso
## 87 8 5 5 4
## salir violencia carrera dependencia discapacidad”
## 4 4 3 3 3
## problema salida
## 3 3
#Nube de emociones con sentimiento
nube_emociones_vector <- c(
paste(texto_palabras[sentimientos_df$sadness> 0], collapse = " "),
paste(texto_palabras[sentimientos_df$joy > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$anger > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$fear > 0], collapse = " "))
nube_corpus <- Corpus(VectorSource(nube_emociones_vector))
nube_tdm <- TermDocumentMatrix(nube_corpus)
nube_tdm <- as.matrix(nube_tdm)
colnames(nube_tdm) <- c('tristeza', 'felicidad', 'enfado', 'confianza')
set.seed(757) # puede ser cualquier número
comparison.cloud(nube_tdm, random.order = FALSE,
colors = c("green", "red", "orange", "blue"),
title.size = 1, max.words = 50, scale = c(2.5, 1), rot.per = 0.4)
# Realiza un análisis de sentimientos con el paquete Afinn: Positivo/negativo
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.1 ✔ purrr 1.0.1
## ✔ tibble 3.2.1 ✔ dplyr 1.1.4
## ✔ tidyr 1.3.0 ✔ forcats 0.5.2
## ✔ readr 2.1.4
## ── 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()
library(tidytext)
library(tm)
library(lubridate)
##
## Attaching package: 'lubridate'
##
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(zoo)
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
##
## The following object is masked from 'package:syuzhet':
##
## rescale
# Lee el lexicon Afinn para análisis de sentimientos
afinn <- read.csv("lexico_afinn.en.es.csv", stringsAsFactors = F, fileEncoding = "latin1") %>%
tibble::as_tibble()
# Convierte el vector de texto vectorizado a un data frame
texto_vectorizado19df <- as.data.frame(texto_vectorizado19)
# Realiza la tokenización del texto y lo une con el lexicon Afinn
texto_afinn <-
texto_vectorizado19df %>%
unnest_tokens(input = "texto_vectorizado19", output = "Palabra") %>%
inner_join(afinn, ., by = "Palabra") %>%
mutate(Tipo = ifelse(Puntuacion > 0, "Positiva", "Negativa"))
## Warning in inner_join(afinn, ., by = "Palabra"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 44 of `x` matches multiple rows in `y`.
## ℹ Row 4289 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
# Define el tema para la gráfica de sentimientos
tema_graf <-
theme_minimal() +
theme(text = element_text(family = "serif"),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "#EBEBEB", colour = NA),
legend.position = "none",
legend.box.background = element_rect(fill = "#EBEBEB", colour = NA))
# Cuenta la cantidad de palabras positivas y negativas
conteo_sentimientos <- texto_afinn %>%
group_by(Tipo) %>%
summarise(n = n(), .groups = "keep")
conteo_sentimientos$dummy <- "sentimientos"
# Crea la gráfica de barras apilada
grafica_sentimientos <- ggplot(conteo_sentimientos, aes(x = dummy, y = n, fill = Tipo)) +
geom_bar(stat = "identity") +
labs(x = "Tipo de sentimiento", y = "Cantidad de palabras", title = "Análisis de sentimientos, Noticias 2019") +
tema_graf +
scale_fill_manual(values = c("firebrick3", "green"))
# Muestra la gráfica
print(grafica_sentimientos)
###Tópicos Este código en R realiza un análisis de tópicos en un
conjunto de comentarios procesados del año 2019. Inicia cargando las
bibliotecas necesarias para el análisis de texto, incluyendo
tidyverse, tidytext, dplyr,
sentimentr, topicmodels, tm,
ggplot2, y reshape2. Luego, convierte el
vector de texto vectorizado a un Corpus y a una matriz término-documento
(DTM). Se realiza un filtrado para eliminar las filas con frecuencia
cero y luego se aplica un modelo de Análisis de Dirichlet Latente (LDA)
con K=5 tópicos. Posteriormente, se extraen los términos más importantes
de cada tópico utilizando la función tidy y se seleccionan
los cinco términos más relevantes para cada tópico. Finalmente, se
genera un gráfico de barras apiladas para visualizar los términos más
importantes de cada tópico, organizados en facetas, proporcionando así
una representación visual de los tópicos identificados en los
comentarios del año 2019.
# Carga de librerías
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
##
## Attaching package: 'sentimentr'
## The following object is masked from 'package:syuzhet':
##
## get_sentences
library(topicmodels)
library(tm)
library(ggplot2)
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
# Convertir el texto en un Corpus y en dtm
corpus <- Corpus(VectorSource(texto_vectorizado19))
palabras_eliminar <- c("milenio", "grupo")
corpus <- tm_map(corpus, removeWords, palabras_eliminar)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, palabras_eliminar):
## transformation drops documents
dtm <- DocumentTermMatrix(corpus)
dtm <- dtm[rowSums(as.matrix(dtm)) > 0, ]
#Se hace un LDA con K=2, o sea, con solamente dos tópicos
lda <- LDA(dtm, k = 5)
# Obtener los términos más importantes de cada tópico
terms <- tidy(lda, matrix = "beta") %>%
group_by(topic) %>%
top_n(5, wt = beta)
terms$topic <- as.factor(terms$topic)
# Generar el gráfico
print(ggplot(terms, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 3) +
ggtitle(paste("Análisis de tópicos")))
####Se replican los mismos pasos utilizados para los datos del 2019 a los datos del 2020, 2021, 2022, y 2023.
##2020 ###Vectorización Este código tiene como objetivo leer y vectorizar el texto contenido en archivos limpios procesados previamente, específicamente aquellos que cumplen con un patrón en su nombre de archivo. La ruta de la carpeta se establece en “/Users/abby/Documents/5to/CD II/Reto/Noti/limpio”. Luego, se utiliza la función list.files para obtener una lista de archivos en esa carpeta que coinciden con el patrón “limpio_datos_2020.*.txt”. Un vector llamado texto_vectorizado19 se inicializa para almacenar el texto de estos archivos.
El código utiliza un bucle para recorrer cada archivo en la lista, leyendo el contenido de cada archivo de texto limpio y concatenando ese contenido en el vector texto_vectorizado19. Cabe destacar que la parte de “Vectoriza el texto” está marcada como un lugar donde puedes reemplazar esa operación con tu propia función de vectorización, lo que significa que puedes personalizar el proceso de cómo deseas vectorizar el texto según tus necesidades específicas.
# Ruta de la carpeta
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti/limpio"
# Lista de archivos en la carpeta que coinciden con el patrón
archivos <- list.files(path = ruta_carpeta, pattern = "limpio_datos_2020.*\\.txt")
# Inicializa un vector para almacenar el texto de los archivos
texto_vectorizado20 <- character(length(archivos))
# Loop para leer y vectorizar el texto de cada archivo
for (i in 1:length(archivos)) {
# Ruta completa del archivo
ruta_archivo <- file.path(ruta_carpeta, archivos[i])
# Lee el archivo de texto
texto <- readLines(ruta_archivo)
# Vectoriza el texto (aquí puedes reemplazar esto con tu propia función de vectorización)
texto_vectorizado20[i] <- paste(texto, collapse = " ")
}
###Corpus y nube de palabras
#Crea corpus
corpus20 <- Corpus(VectorSource(texto_vectorizado20))
# Creación DTM
dtm20 <- DocumentTermMatrix(corpus20)
#Conteo
conteo_total <- colSums(as.matrix(dtm20))
#Ordenar y mostrar los términos comúnes
terminos_comunes20<- sort(conteo_total, decreasing = TRUE)
#Identificación 25 términos más comúnes
head(terminos_comunes20, 25)
## discapacidad personas inclusión así atención
## 107 97 38 23 21
## mil rehabilitación “ millones nacional
## 20 19 18 18 17
## alguna ser social centro población
## 16 16 16 16 16
## además general dif pesos vida
## 15 15 15 15 14
## educación méxico unidades manera
## 14 14 14 13 13
colores <- ifelse(names(terminos_comunes20) %in% lista_palabras, "blue", "black")
# Crea la nube de palabras
nube <- wordcloud2(data.frame(word = names(terminos_comunes20), freq = terminos_comunes20),
color = colores, minSize = 2, size = 0.6)
nube
saveWidget(nube, file="nube.html", selfcontained = F)
# Convierte el archivo HTML a PNG con webshot y lo guarda en la carpeta especificada
webshot::webshot("nube.html", file = paste0(ruta_carpeta, "/nube.png"))
###Análisis de sentimientos
# Carga los paquetes necesarios para el análisis de sentimientos y visualización
library(syuzhet)
library(RColorBrewer)
library(wordcloud)
library(tm)
# Tokenización en el corpus
texto_palabras <- get_tokens(texto_vectorizado20)
head(texto_palabras)
## [1] "veces" "sólo" "cuestión" "esperar" "conocer" "alma"
# Realiza un análisis de sentimientos utilizando el paquete syuzhet
sentimientos_df <- get_nrc_sentiment(texto_palabras, lang="spanish")
head(sentimientos_df)
## anger anticipation disgust fear joy sadness surprise trust negative positive
## 1 0 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 0 0 0 0
## 4 0 3 0 0 0 0 1 1 1 1
## 5 0 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0 1
#Gráfica de barras sentimientos
barplot(
colSums(prop.table(sentimientos_df[, 1:8])),
space = 0.2,
horiz = FALSE,
las = 1,
cex.names = 0.7,
col = brewer.pal(n = 8, name = "Set3"),
main = "Noticias sobre personas con discapacidad, 2020",
xlab="emociones", ylab = NULL)
# Filtra palabras asociadas confianza, tristeza, miedo y disgusto con diferentes sentimientos y las ordena
palabras_trust <- texto_palabras[sentimientos_df$trust> 0]
palabras_trust_orden <- sort(table(unlist(palabras_trust)), decreasing = TRUE)
head(palabras_trust_orden, n = 12)
##
## centro general acuerdo cuenta congreso instituto sistema
## 16 15 13 12 10 10 10
## ley presidenta trabajo apoyo presidente
## 9 9 9 8 8
palabras_tristeza <- texto_palabras[sentimientos_df$sadness> 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n = 12)
##
## discapacidad pandemia compromiso artículo caso dependencia
## 109 9 7 3 3 3
## carrera corte enfermedad espectro estima necesidad
## 2 2 2 2 2 2
palabras_anti <- texto_palabras[sentimientos_df$anticipation> 0]
palabras_anti_orden <- sort(table(unlist(palabras_anti)), decreasing = TRUE)
head(palabras_anti_orden, n = 12)
##
## acuerdo red entrega trabajo asistencia oportunidad
## 13 10 9 9 7 7
## empresa mejorar movimiento tiempo victoria ver
## 6 6 6 6 6 4
# Crea una nube de comparación de emociones utilizando comparison.cloud
nube_emociones_vector <- c(
paste(texto_palabras[sentimientos_df$sadness> 0], collapse = " "),
paste(texto_palabras[sentimientos_df$joy > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$anger > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$fear > 0], collapse = " "))
nube_corpus <- Corpus(VectorSource(nube_emociones_vector))
nube_tdm <- TermDocumentMatrix(nube_corpus)
nube_tdm <- as.matrix(nube_tdm)
colnames(nube_tdm) <- c('tristeza', 'felicidad', 'enfado', 'confianza')
set.seed(757) # puede ser cualquier número
comparison.cloud(nube_tdm, random.order = FALSE,
colors = c("green", "red", "orange", "blue"),
title.size = 1, max.words = 50, rot.per = 0.4)
# Realiza un análisis de sentimientos con el paquete Afinn: Positivo/negativo
library(tidyverse)
library(tidytext)
library(tm)
library(lubridate)
library(zoo)
library(scales)
library(ggplot2)
# Lee el lexicon Afinn para análisis de sentimientos
afinn <- read.csv("lexico_afinn.en.es.csv", stringsAsFactors = F, fileEncoding = "latin1") %>%
tibble::as_tibble()
# Convierte el vector de texto vectorizado a un data frame
texto_vectorizado20df <- as.data.frame(texto_vectorizado20)
# Realiza la tokenización del texto y lo une con el lexicon Afinn
texto_afinn <-
texto_vectorizado20df %>%
unnest_tokens(input = "texto_vectorizado20", output = "Palabra") %>%
inner_join(afinn, ., by = "Palabra") %>%
mutate(Tipo = ifelse(Puntuacion > 0, "Positiva", "Negativa"))
## Warning in inner_join(afinn, ., by = "Palabra"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 51 of `x` matches multiple rows in `y`.
## ℹ Row 4320 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
# Define el tema para la gráfica de sentimientos
tema_graf <-
theme_minimal() +
theme(text = element_text(family = "serif"),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "#EBEBEB", colour = NA),
legend.position = "none",
legend.box.background = element_rect(fill = "#EBEBEB", colour = NA))
# Cuenta la cantidad de palabras positivas y negativas
conteo_sentimientos <- texto_afinn %>%
group_by(Tipo) %>%
summarise(n = n(), .groups = "keep")
# Crea una variable ficticia para apilar las barras
conteo_sentimientos$dummy <- "sentimientos"
# Crea la gráfica de barras apilada
grafica_sentimientos <- ggplot(conteo_sentimientos, aes(x = dummy, y = n, fill = Tipo)) +
geom_bar(stat = "identity") +
labs(x = "Tipo de sentimiento", y = "Cantidad de palabras", title = "Análisis de sentimientos, Noticias 2020") +
tema_graf +
scale_fill_manual(values = c("firebrick3", "green"))
# Muestra la gráfica
print(grafica_sentimientos)
###Tópicos
# Carga de librerías
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
library(reshape2)
# Convertir el texto en un Corpus y en dtm
corpus <- Corpus(VectorSource(texto_vectorizado20))
palabras_eliminar <- c("milenio", "grupo")
corpus <- tm_map(corpus, removeWords, palabras_eliminar)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, palabras_eliminar):
## transformation drops documents
dtm <- DocumentTermMatrix(corpus)
dtm <- dtm[rowSums(as.matrix(dtm)) > 0, ]
#Se hace un LDA con K=2, o sea, con solamente dos tópicos
lda <- LDA(dtm, k = 5)
# Obtener los términos más importantes de cada tópico
terms <- tidy(lda, matrix = "beta") %>%
group_by(topic) %>%
top_n(4, wt = beta)
terms$topic <- as.factor(terms$topic)
# Generar el gráfico
print(ggplot(terms, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 4) +
ggtitle(paste("Análisis de tópicos")))
##2021 ###Vectorización Este código tiene como objetivo leer y vectorizar el texto contenido en archivos limpios procesados previamente, específicamente aquellos que cumplen con un patrón en su nombre de archivo. La ruta de la carpeta se establece en “/Users/abby/Documents/5to/CD II/Reto/Noti/limpio”. Luego, se utiliza la función list.files para obtener una lista de archivos en esa carpeta que coinciden con el patrón “limpio_datos_2021.*.txt”. Un vector llamado texto_vectorizado19 se inicializa para almacenar el texto de estos archivos.
El código utiliza un bucle para recorrer cada archivo en la lista, leyendo el contenido de cada archivo de texto limpio y concatenando ese contenido en el vector texto_vectorizado21.
# Ruta de la carpeta
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti/limpio"
# Lista de archivos en la carpeta que coinciden con el patrón
archivos <- list.files(path = ruta_carpeta, pattern = "limpio_datos_2021.*\\.txt")
# Inicializa un vector para almacenar el texto de los archivos
texto_vectorizado21 <- character(length(archivos))
# Loop para leer y vectorizar el texto de cada archivo
for (i in 1:length(archivos)) {
# Ruta completa del archivo
ruta_archivo <- file.path(ruta_carpeta, archivos[i])
# Lee el archivo de texto
texto <- readLines(ruta_archivo)
# Vectoriza el texto (aquí puedes reemplazar esto con tu propia función de vectorización)
texto_vectorizado21[i] <- paste(texto, collapse = " ")
}
###Corpus y nube de palabras
#Crea corpus
corpus21 <- Corpus(VectorSource(texto_vectorizado21))
# Creación DTM
dtm21 <- DocumentTermMatrix(corpus21)
#Conteo
conteo_total <- colSums(as.matrix(dtm21))
#Ordenar y mostrar los términos comúnes
terminos_comunes21<- sort(conteo_total, decreasing = TRUE)
#Identificación 25 términos más comúnes
head(terminos_comunes21, 25)
## personas discapacidad años niños mayores
## 98 90 33 24 21 21
## mujeres derecho pues diferentes además ser
## 21 21 18 17 16 16
## ciudad así manera alguna familia derechos
## 16 15 15 15 14 14
## centro dijo parte inclusión nacional trabajo
## 13 13 13 13 13 13
## apoyo
## 12
colores <- ifelse(names(terminos_comunes21) %in% lista_palabras, "blue", "black")
# Crea la nube de palabras
nube <- wordcloud2(data.frame(word = names(terminos_comunes21), freq = terminos_comunes21),
color = colores, minSize = 2, size = 0.6)
nube
saveWidget(nube, file="nube.html", selfcontained = F)
ruta_carpeta <-"/Users/abby/Documents/5to/CD II/Reto"
# Convierte el archivo HTML a PNG con webshot y lo guarda en la carpeta especificada
webshot::webshot("nube.html", file = paste0(ruta_carpeta, "/nube.png"))
###Análisis de sentimientos
# Carga los paquetes
library(syuzhet)
library(RColorBrewer)
library(wordcloud)
library(tm)
# Tokenización en el corpus
texto_palabras <- get_tokens(texto_vectorizado21)
head(texto_palabras)
## [1] "pensión" "bienestar" "personas" "discapacidad" "permanente"
## [6] "aumentará"
# Realiza un análisis de sentimientos utilizando el paquete syuzhet
sentimientos_df <- get_nrc_sentiment(texto_palabras, lang="spanish")
head(sentimientos_df)
## anger anticipation disgust fear joy sadness surprise trust negative positive
## 1 0 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 1 0 0 2 0
## 5 0 0 0 0 0 0 0 0 0 0
## 6 0 0 0 1 0 0 0 0 1 2
#Gráfica de barras sentimientos
barplot(
colSums(prop.table(sentimientos_df[, 1:8])),
space = 0.2,
horiz = FALSE,
las = 1,
cex.names = 0.7,
col = brewer.pal(n = 8, name = "Set3"),
main = "Noticias sobre personas con discapacidad, 2021",
xlab="emociones", ylab = NULL)
# Filtra palabras asociadas confianza, tristeza, miedo y disgusto con diferentes sentimientos y las ordena
palabras_trust <- texto_palabras[sentimientos_df$trust> 0]
palabras_trust_orden <- sort(table(unlist(palabras_trust)), decreasing = TRUE)
head(palabras_trust_orden, n = 12)
##
## apoyo centro trabajo presidente sistema general cuenta
## 13 13 13 10 10 8 7
## diario instituto nivel importante ley
## 7 7 7 6 6
palabras_tristeza <- texto_palabras[sentimientos_df$sadness> 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n = 12)
##
## discapacidad enfermedad lucha pandemia crisis incapacidad
## 94 12 11 9 7 7
## salir violencia caso dejar madre soledad
## 6 6 5 4 4 4
palabras_anti <- texto_palabras[sentimientos_df$anticipation> 0]
palabras_anti_orden <- sort(table(unlist(palabras_anti)), decreasing = TRUE)
head(palabras_anti_orden, n = 12)
##
## trabajo diario entrega movimiento paciente salir asistencia
## 13 7 7 6 6 6 5
## llegar tiempo acuerdo buscar defensa
## 5 5 4 4 4
palabras_miedo <- texto_palabras[sentimientos_df$fear> 0]
palabras_miedo_orden <- sort(table(unlist(palabras_miedo)), decreasing = TRUE)
head(palabras_miedo_orden, n = 12)
##
## enfermedad lucha pandemia falta violencia caso defensa
## 12 11 9 7 6 5 4
## gobierno pagano soledad accidente ataque
## 4 4 4 3 3
palabras_anger <- texto_palabras[sentimientos_df$anger> 0]
palabras_anger_orden <- sort(table(unlist(palabras_anger)), decreasing = TRUE)
head(palabras_anger_orden, n = 12)
##
## enfermedad lucha falta violencia subsidio defensa ataque
## 12 11 7 6 5 4 3
## ataques escasez escritura muerte abandonado
## 3 3 3 3 2
# Crea una nube de comparación de emociones utilizando comparison.cloud
nube_emociones_vector <- c(
paste(texto_palabras[sentimientos_df$sadness> 0], collapse = " "),
paste(texto_palabras[sentimientos_df$joy > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$anger > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$fear > 0], collapse = " "))
nube_corpus <- Corpus(VectorSource(nube_emociones_vector))
nube_tdm <- TermDocumentMatrix(nube_corpus)
nube_tdm <- as.matrix(nube_tdm)
colnames(nube_tdm) <- c('tristeza', 'felicidad', 'enfado', 'confianza')
set.seed(757) # puede ser cualquier número
comparison.cloud(nube_tdm, random.order = FALSE,
colors = c("green", "red", "orange", "blue"),
title.size = 1, max.words = 50, rot.per = 0.4)
# Realiza un análisis de sentimientos con el paquete Afinn: Positivo/negativo
library(tidyverse)
library(tidytext)
library(tm)
library(lubridate)
library(zoo)
library(scales)
library(ggplot2)
# Lee el lexicon Afinn para análisis de sentimientos
afinn <- read.csv("lexico_afinn.en.es.csv", stringsAsFactors = F, fileEncoding = "latin1") %>%
tibble::as_tibble()
texto_vectorizado21df <- as.data.frame(texto_vectorizado21)
# Realiza la tokenización del texto y lo une con el lexicon Afinn
texto_afinn <-
texto_vectorizado21df %>%
unnest_tokens(input = "texto_vectorizado21", output = "Palabra") %>%
inner_join(afinn, ., by = "Palabra") %>%
mutate(Tipo = ifelse(Puntuacion > 0, "Positiva", "Negativa"))
## Warning in inner_join(afinn, ., by = "Palabra"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 3 of `x` matches multiple rows in `y`.
## ℹ Row 1235 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
# Define el tema para la gráfica de sentimientos
tema_graf <-
theme_minimal() +
theme(text = element_text(family = "serif"),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "#EBEBEB", colour = NA),
legend.position = "none",
legend.box.background = element_rect(fill = "#EBEBEB", colour = NA))
# Cuenta la cantidad de palabras positivas y negativas
conteo_sentimientos <- texto_afinn %>%
group_by(Tipo) %>%
summarise(n = n(), .groups = "keep")
# Crea una variable ficticia para apilar las barras
conteo_sentimientos$dummy <- "sentimientos"
# Crea la gráfica de barras apilada
grafica_sentimientos <- ggplot(conteo_sentimientos, aes(x = dummy, y = n, fill = Tipo)) +
geom_bar(stat = "identity") +
labs(x = "Tipo de sentimiento", y = "Cantidad de palabras", title = "Análisis de sentimientos, Noticias 2021") +
tema_graf +
scale_fill_manual(values = c("firebrick3", "green"))
# Muestra la gráfica
print(grafica_sentimientos)
###Tópicos
# Carga de librerías
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
library(reshape2)
# Convertir el texto en un Corpus y en dtm
corpus <- Corpus(VectorSource(texto_vectorizado21))
palabras_eliminar <- c("milenio", "grupo")
corpus <- tm_map(corpus, removeWords, palabras_eliminar)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, palabras_eliminar):
## transformation drops documents
dtm <- DocumentTermMatrix(corpus)
dtm <- dtm[rowSums(as.matrix(dtm)) > 0, ]
#Se hace un LDA con K=2, o sea, con solamente dos tópicos
lda <- LDA(dtm, k = 5)
# Obtener los términos más importantes de cada tópico
terms <- tidy(lda, matrix = "beta") %>%
group_by(topic) %>%
top_n(4, wt = beta)
terms$topic <- as.factor(terms$topic)
# Generar el gráfico
print(ggplot(terms, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 4) +
ggtitle(paste("Análisis de tópicos")))
##2022 ###Vectorización Este código tiene como objetivo leer y vectorizar el texto contenido en archivos limpios procesados previamente, específicamente aquellos que cumplen con un patrón en su nombre de archivo. La ruta de la carpeta se establece en “/Users/abby/Documents/5to/CD II/Reto/Noti/limpio”. Luego, se utiliza la función list.files para obtener una lista de archivos en esa carpeta que coinciden con el patrón “limpio_datos_2022.*.txt”. Un vector llamado texto_vectorizado19 se inicializa para almacenar el texto de estos archivos.
El código utiliza un bucle para recorrer cada archivo en la lista, leyendo el contenido de cada archivo de texto limpio y concatenando ese contenido en el vector texto_vectorizado22.
# Ruta de la carpeta
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti/limpio"
# Lista de archivos en la carpeta que coinciden con el patrón
archivos <- list.files(path = ruta_carpeta, pattern = "limpio_datos_2022.*\\.txt")
# Inicializa un vector para almacenar el texto de los archivos
texto_vectorizado22 <- character(length(archivos))
# Loop para leer y vectorizar el texto de cada archivo
for (i in 1:length(archivos)) {
# Ruta completa del archivo
ruta_archivo <- file.path(ruta_carpeta, archivos[i])
# Lee el archivo de texto
texto <- readLines(ruta_archivo)
# Vectoriza el texto
texto_vectorizado22[i] <- paste(texto, collapse = " ")
}
###Corpus y nube de palabras
#Crea corpus
corpus22 <- Corpus(VectorSource(texto_vectorizado22))
# Creación DTM
dtm22 <- DocumentTermMatrix(corpus22)
#Conteo
conteo_total <- colSums(as.matrix(dtm22))
#Ordenar y mostrar los términos comúnes
terminos_comunes22<- sort(conteo_total, decreasing = TRUE)
#Identificación 25 términos más comúnes
head(terminos_comunes22, 25)
## personas discapacidad mil bienestar gobierno
## 94 86 45 21 19
## pesos alguna “ así presidente
## 18 17 17 16 15
## años méxico teletón niños informó
## 15 14 14 13 13
## pensión social tipo puede nacional
## 13 13 13 12 12
## rehabilitación muerte población salud través
## 12 11 11 11 11
colores <- ifelse(names(terminos_comunes22) %in% lista_palabras, "blue", "black")
# Crea la nube de palabras
nube <- wordcloud2(data.frame(word = names(terminos_comunes22), freq = terminos_comunes22),
color = colores, minSize = 2, size = 0.6)
nube
saveWidget(nube, file="nube.html", selfcontained = F)
ruta_carpeta <-"/Users/abby/Documents/5to/CD II/Reto"
# Convierte el archivo HTML a PNG con webshot y lo guarda en la carpeta especificada
webshot::webshot("nube.html", file = paste0(ruta_carpeta, "/nube.png"))
###Análisis de sentimientos
# Carga los paquetes
library(syuzhet)
library(RColorBrewer)
library(wordcloud)
library(tm)
# Tokenización en el corpus
texto_palabras <- get_tokens(texto_vectorizado22)
head(texto_palabras)
## [1] "siempre" "lugar" "buenas" "acciones" "mes" "causa"
# Realiza un análisis de sentimientos utilizando el paquete syuzhet
sentimientos_df <- get_nrc_sentiment(texto_palabras, lang="spanish")
head(sentimientos_df)
## anger anticipation disgust fear joy sadness surprise trust negative positive
## 1 0 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0 0
#Gráfica de barras sentimientos
barplot(
colSums(prop.table(sentimientos_df[, 1:8])),
space = 0.2,
horiz = FALSE,
las = 1,
cex.names = 0.7,
col = brewer.pal(n = 8, name = "Set3"),
main = "Noticias sobre personas con discapacidad, 2022",
xlab="emociones", ylab = NULL)
# Filtra palabras asociadas con diferentes sentimientos y las ordena
palabras_trust <- texto_palabras[sentimientos_df$trust> 0]
palabras_trust_orden <- sort(table(unlist(palabras_trust)), decreasing = TRUE)
head(palabras_trust_orden, n = 12)
##
## presidente congreso centro instituto sistema general acuerdo
## 15 11 10 10 10 9 7
## apoyo gobernador importante ley recursos
## 7 7 7 7 6
palabras_tristeza <- texto_palabras[sentimientos_df$sadness> 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n = 12)
##
## discapacidad muerte automóvil caso enfermedad
## 88 11 5 4 4
## problema artículo impuesto sentencia vulnerabilidad
## 4 3 3 3 3
## ausencia carrera
## 2 2
palabras_miedo <- texto_palabras[sentimientos_df$fear> 0]
palabras_miedo_orden <- sort(table(unlist(palabras_miedo)), decreasing = TRUE)
head(palabras_miedo_orden, n = 12)
##
## gobierno muerte falta automóvil brigada
## 19 11 7 5 5
## caso enfermedad problema ver criminal
## 4 4 4 4 3
## guerrero procedimiento
## 3 3
palabras_disgust <- texto_palabras[sentimientos_df$disgust> 0]
palabras_disgust_orden <- sort(table(unlist(palabras_disgust)), decreasing = TRUE)
head(palabras_disgust_orden, n = 12)
##
## congreso muerte falta automóvil enfermedad finalmente secretaría
## 11 11 7 5 4 4 4
## artículo criminal impuesto sentencia corte
## 3 3 3 3 2
#Nube de emociones con sentimiento
nube_emociones_vector <- c(
paste(texto_palabras[sentimientos_df$sadness> 0], collapse = " "),
paste(texto_palabras[sentimientos_df$joy > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$anger > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$fear > 0], collapse = " "))
nube_corpus <- Corpus(VectorSource(nube_emociones_vector))
nube_tdm <- TermDocumentMatrix(nube_corpus)
nube_tdm <- as.matrix(nube_tdm)
colnames(nube_tdm) <- c('tristeza', 'felicidad', 'enfado', 'confianza')
set.seed(757) # puede ser cualquier número
comparison.cloud(nube_tdm, random.order = FALSE,
colors = c("green", "red", "orange", "blue"),
title.size = 1, max.words = 50, scale = c(2.5, 1), rot.per = 0.4)
# Realiza un análisis de sentimientos con el paquete Afinn: Positivo/negativo
library(tidyverse)
library(tidytext)
library(tm)
library(lubridate)
library(zoo)
library(scales)
library(ggplot2)
# Lee el lexicon Afinn para análisis de sentimientos
afinn <- read.csv("lexico_afinn.en.es.csv", stringsAsFactors = F, fileEncoding = "latin1") %>%
tibble::as_tibble()
# Convierte el vector de texto vectorizado a un data frame
texto_vectorizado22df <- as.data.frame(texto_vectorizado22)
# Realiza la tokenización del texto y lo une con el lexicon Afinn
texto_afinn <-
texto_vectorizado22df %>%
unnest_tokens(input = "texto_vectorizado22", output = "Palabra") %>%
inner_join(afinn, ., by = "Palabra") %>%
mutate(Tipo = ifelse(Puntuacion > 0, "Positiva", "Negativa"))
## Warning in inner_join(afinn, ., by = "Palabra"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 51 of `x` matches multiple rows in `y`.
## ℹ Row 2972 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
# Define el tema para la gráfica de sentimientos
tema_graf <-
theme_minimal() +
theme(text = element_text(family = "serif"),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "#EBEBEB", colour = NA),
legend.position = "none",
legend.box.background = element_rect(fill = "#EBEBEB", colour = NA))
# Cuenta la cantidad de palabras positivas y negativas
conteo_sentimientos <- texto_afinn %>%
group_by(Tipo) %>%
summarise(n = n(), .groups = "keep")
# Crea una variable ficticia para apilar las barras
conteo_sentimientos$dummy <- "sentimientos"
# Crea la gráfica de barras apilada
grafica_sentimientos <- ggplot(conteo_sentimientos, aes(x = dummy, y = n, fill = Tipo)) +
geom_bar(stat = "identity") +
labs(x = "Tipo de sentimiento", y = "Cantidad de palabras", title = "Análisis de sentimientos, Noticias 2022") +
tema_graf +
scale_fill_manual(values = c("firebrick3", "green"))
# Muestra la gráfica
print(grafica_sentimientos)
###Tópicos
# Carga de librerías
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
library(reshape2)
# Convertir el texto en un Corpus y en dtm
corpus <- Corpus(VectorSource(texto_vectorizado22))
dtm <- DocumentTermMatrix(corpus)
#Se hace un LDA con K=2, o sea, con solamente dos tópicos
dtm <- dtm[rowSums(as.matrix(dtm)) > 0, ]
lda <- LDA(dtm, k = 5)
# Obtener los términos más importantes de cada tópico
terms <- tidy(lda, matrix = "beta") %>%
group_by(topic) %>%
top_n(5, wt = beta)
# Generar el gráfico
print(ggplot(terms, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 4) +
ggtitle(paste("Análisis de tópicos")))
print(terms)
## # A tibble: 28 × 3
## # Groups: topic [5]
## topic term beta
## <int> <chr> <dbl>
## 1 1 discapacidad 0.00576
## 2 2 discapacidad 0.0170
## 3 3 discapacidad 0.0146
## 4 4 discapacidad 0.0216
## 5 5 discapacidad 0.0282
## 6 2 mil 0.0308
## 7 4 mil 0.00687
## 8 3 muerte 0.00686
## 9 1 personas 0.0115
## 10 2 personas 0.0234
## # ℹ 18 more rows
##2023 ###Vectorización Este código tiene como objetivo leer y vectorizar el texto contenido en archivos limpios procesados previamente, específicamente aquellos que cumplen con un patrón en su nombre de archivo. La ruta de la carpeta se establece en “/Users/abby/Documents/5to/CD II/Reto/Noti/limpio”. Luego, se utiliza la función list.files para obtener una lista de archivos en esa carpeta que coinciden con el patrón “limpio_datos_2022.*.txt”. Un vector llamado texto_vectorizado19 se inicializa para almacenar el texto de estos archivos.
El código utiliza un bucle para recorrer cada archivo en la lista, leyendo el contenido de cada archivo de texto limpio y concatenando ese contenido en el vector texto_vectorizado23.
# Ruta de la carpeta
ruta_carpeta <- "/Users/abby/Documents/5to/CD II/Reto/Noti/limpio"
# Lista de archivos en la carpeta que coinciden con el patrón
archivos <- list.files(path = ruta_carpeta, pattern = "limpio_datos_2023.*\\.txt")
# Inicializa un vector para almacenar el texto de los archivos
texto_vectorizado23 <- character(length(archivos))
# Loop para leer y vectorizar el texto de cada archivo
for (i in 1:length(archivos)) {
# Ruta completa del archivo
ruta_archivo <- file.path(ruta_carpeta, archivos[i])
# Lee el archivo de texto
texto <- readLines(ruta_archivo)
# Vectoriza el texto
texto_vectorizado23[i] <- paste(texto, collapse = " ")
}
###Corpus y nube de palabras
#Crea corpus
corpus23 <- Corpus(VectorSource(texto_vectorizado23))
# Creación DTM
dtm23 <- DocumentTermMatrix(corpus23)
#Conteo
conteo_total <- colSums(as.matrix(dtm23))
#Ordenar y mostrar los términos comúnes
terminos_comunes23<- sort(conteo_total, decreasing = TRUE)
#Identificación 25 términos más comúnes
head(terminos_comunes23, 25)
## personas discapacidad mil años ciento
## 82 60 33 30 24
## además millones nacional alguna méxico
## 19 18 18 18 17
## rehabilitación bienestar dos pesos ser
## 16 16 14 14 14
## social así laboral 2022 solo
## 14 14 14 13 13
## joven gobierno ley trabajo ruedas
## 12 12 12 12 12
colores <- ifelse(names(terminos_comunes23) %in% lista_palabras, "blue", "black")
# Crea la nube de palabras
nube <- wordcloud2(data.frame(word = names(terminos_comunes23), freq = terminos_comunes23),
color = colores, minSize = 2, size = 0.6)
nube
saveWidget(nube, file="nube.html", selfcontained = F)
ruta_carpeta <-"/Users/abby/Documents/5to/CD II/Reto"
# Convierte el archivo HTML a PNG con webshot y lo guarda en la carpeta especificada
webshot::webshot("nube.html", file = paste0(ruta_carpeta, "/nube.png"))
###Análisis de sentimientos
# Carga los paquetes
library(syuzhet)
library(RColorBrewer)
library(wordcloud)
library(tm)
# Tokenización en el corpus
texto_palabras <- get_tokens(texto_vectorizado23)
head(texto_palabras)
## [1] "katy" "perry" "orlando" "bloom" "acaban" "ganar"
# Realiza un análisis de sentimientos utilizando el paquete syuzhet
sentimientos_df <- get_nrc_sentiment(texto_palabras, lang="spanish")
head(sentimientos_df)
## anger anticipation disgust fear joy sadness surprise trust negative positive
## 1 0 0 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0 0
## 3 0 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 0 0 0 0 1
#Gráfica de barras sentimientos
barplot(
colSums(prop.table(sentimientos_df[, 1:8])),
space = 0.2,
horiz = FALSE,
las = 1,
cex.names = 0.7,
col = brewer.pal(n = 8, name = "Set3"),
main = "Noticias sobre personas con discapacidad, 2023",
xlab="emociones", ylab = NULL)
# Filtra palabras asociadas con diferentes sentimientos y las ordena
palabras_trust <- texto_palabras[sentimientos_df$trust> 0]
palabras_trust_orden <- sort(table(unlist(palabras_trust)), decreasing = TRUE)
head(palabras_trust_orden, n = 12)
##
## ley trabajo acuerdo instituto sistema apoyo centro
## 12 12 11 11 10 8 7
## general presidente director presidenta registro
## 7 6 5 5 5
palabras_tristeza <- texto_palabras[sentimientos_df$sadness> 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n = 12)
##
## discapacidad violencia caso discapacitado abuso
## 64 9 5 5 3
## artículo lucha muerte pena penal
## 3 3 3 3 3
## problema vehículo
## 3 3
palabras_anti <- texto_palabras[sentimientos_df$anticipation> 0]
palabras_anti_orden <- sort(table(unlist(palabras_anti)), decreasing = TRUE)
head(palabras_anti_orden, n = 12)
##
## joven trabajo acuerdo asistencia empresa dinero
## 12 12 11 5 5 4
## libertad llegar tribunal competencia consejo entrega
## 4 4 4 3 3 3
palabras_anger <- texto_palabras[sentimientos_df$anger> 0]
palabras_anger_orden <- sort(table(unlist(palabras_anger)), decreasing = TRUE)
head(palabras_anger_orden, n = 12)
##
## violencia falta dinero abuso lucha muerte pena voto
## 9 5 4 3 3 3 3 3
## batalla corte crimen defensa
## 2 2 2 2
#Nube de emociones con sentimiento
nube_emociones_vector <- c(
paste(texto_palabras[sentimientos_df$sadness> 0], collapse = " "),
paste(texto_palabras[sentimientos_df$joy > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$anger > 0], collapse = " "),
paste(texto_palabras[sentimientos_df$fear > 0], collapse = " "))
nube_corpus <- Corpus(VectorSource(nube_emociones_vector))
nube_tdm <- TermDocumentMatrix(nube_corpus)
nube_tdm <- as.matrix(nube_tdm)
colnames(nube_tdm) <- c('tristeza', 'felicidad', 'enfado', 'confianza')
set.seed(757) # puede ser cualquier número
comparison.cloud(nube_tdm, random.order = FALSE,
colors = c("green", "red", "orange", "blue"),
title.size = 1, max.words = 50, scale = c(2.5, 1), rot.per = 0.4)
#Analisis de sentimientos con Afinn: Positivo/negativo
library(tidyverse)
library(tidytext)
library(tm)
library(lubridate)
library(zoo)
library(scales)
library(ggplot2)
# Lee el lexicon Afinn para análisis de sentimientos
afinn <- read.csv("lexico_afinn.en.es.csv", stringsAsFactors = F, fileEncoding = "latin1") %>%
tibble::as_tibble()
# Convierte el vector de texto vectorizado a un data frame
texto_vectorizado23df <- as.data.frame(texto_vectorizado23)
# Realiza la tokenización del texto y lo une con el lexicon Afinn
texto_afinn <-
texto_vectorizado23df %>%
unnest_tokens(input = "texto_vectorizado23", output = "Palabra") %>%
inner_join(afinn, ., by = "Palabra") %>%
mutate(Tipo = ifelse(Puntuacion > 0, "Positiva", "Negativa"))
## Warning in inner_join(afinn, ., by = "Palabra"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 30 of `x` matches multiple rows in `y`.
## ℹ Row 4711 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
# Define el tema para la gráfica de sentimientos
tema_graf <-
theme_minimal() +
theme(text = element_text(family = "serif"),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "#EBEBEB", colour = NA),
legend.position = "none",
legend.box.background = element_rect(fill = "#EBEBEB", colour = NA))
# Cuenta la cantidad de palabras positivas y negativas
conteo_sentimientos <- texto_afinn %>%
group_by(Tipo) %>%
summarise(n = n(), .groups = "keep")
# Crea una variable ficticia para apilar las barras
conteo_sentimientos$dummy <- "sentimientos"
# Crea la gráfica de barras apilada
grafica_sentimientos <- ggplot(conteo_sentimientos, aes(x = dummy, y = n, fill = Tipo)) +
geom_bar(stat = "identity") +
labs(x = "Tipo de sentimiento", y = "Cantidad de palabras", title = "Análisis de sentimientos, Noticias 2023") +
tema_graf +
scale_fill_manual(values = c("firebrick3", "green"))
# Muestra la gráfica
print(grafica_sentimientos)
###Tópicos
# Carga de librerías
library(tidyverse)
library(tidytext)
library(dplyr)
library(sentimentr)
library(topicmodels)
library(tm)
library(ggplot2)
library(reshape2)
# Convertir el texto en un Corpus y en dtm
corpus <- Corpus(VectorSource(texto_vectorizado23))
dtm <- DocumentTermMatrix(corpus)
#Se hace un LDA con K=2, o sea, con solamente dos tópicos
dtm <- dtm[rowSums(as.matrix(dtm)) > 0, ]
lda <- LDA(dtm, k = 5)
# Obtener los términos más importantes de cada tópico
terms <- tidy(lda, matrix = "beta") %>%
group_by(topic) %>%
top_n(5, wt = beta)
# Generar el gráfico
print(ggplot(terms, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 4) +
ggtitle(paste("Análisis de tópicos")))
print(terms)
## # A tibble: 42 × 3
## # Groups: topic [5]
## topic term beta
## <int> <chr> <dbl>
## 1 2 años 0.00788
## 2 3 años 0.00798
## 3 4 años 0.0110
## 4 1 millones 0.00560
## 5 2 millones 0.00657
## 6 1 además 0.00560
## 7 3 ciento 0.0150
## 8 1 discapacidad 0.00653
## 9 2 discapacidad 0.00657
## 10 3 discapacidad 0.0169
## # ℹ 32 more rows