#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