Librerias

library(rvest)
library(magrittr)
library(wordcloud)
## Loading required package: RColorBrewer
library(tm)
## Loading required package: NLP
library(tidyr)
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:magrittr':
## 
##     extract
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:NLP':
## 
##     annotate
library(stringr)
library(tidytext)
library(textdata)
library(janeaustenr)
library(dslabs)
library(sentimentr)
library(topicmodels)

FUENTES DE INFORMACIÓN

  • Se realiza webscrapping de manera manual a fuentes de NOTICIAS, GOBIERNO y ASOCIACIONES CIVILES. Las fuentes de informacion se nombran de acuerdo al numero de url que se utiliza, el año y el tipo de fuente. Es importante destacar que se guarda el texto utilizando html.nodes y se especifica l texto principal y el titulo de la noticia, esto con busca de crear una limpieza mas completa.

NOTICIAS.

### AÑO 2018 (NOTICIAS)

# Lista of URLs
url_list_2018 <- c(
  "https://www.dw.com/es/detienen-al-presunto-asesino-de-tres-activistas-lgbti-en-m%C3%A9xico/a-44301325",
  "https://expansion.mx/empresas/2018/11/13/estas-son-las-empresas-en-mexico-mas-incluyentes",
  "https://www.infobae.com/america/mexico/2018/07/26/desnuda-con-huellas-de-tortura-y-un-alambre-de-puas-en-el-cuello-el-brutal-asesinato-de-una-reina-gay-en-mexico/",
  "https://www.infobae.com/america/mexico/2018/07/23/revuelo-en-mexico-un-conductor-de-television-asegura-que-dejo-de-ser-homosexual/",
  "https://www.elsoldemexico.com.mx/doble-via/virales/boxeador-mexicano-llama-plaga-a-la-comunidad-lgbt-me-cagan-los-gays-video-dario-larralde-tokio-2020-2771682.html",
  "https://www.france24.com/es/20180520-mexico-posiciones-candidatos-derechos-lgbti",
  "https://peopleenespanol.com/celebridades/transexual-suicidio-lupita-jones/",
  "https://www.elperiodico.com/es/internacional/20181218/comunidad-lgbt-mexico-derechos-respetados-7207651",
  "https://www.eluniversal.com.mx/espectaculos/una-mujer-jamas-sera-igual-un-transgenero-lupita-jones/",
  "https://www.record.com.mx/futbol-futbol-nacional-seleccion-mexicana/piden-tolerancia-entre-marcha-del-orgullo-gay-y-festejos",
  "https://www.elsoldemexico.com.mx/gossip/omg/carlos-vela-relacion-transexual-amorio-alejandra-salinas-carlos-salcido-2129340.html",
  "https://www.eluniversal.com.mx/colaboracion/mochilazo-en-el-tiempo/nacion/sociedad/40-anos-de-las-marchas-gay/",
  "https://los40.com.mx/los40/2018/06/13/actualidad/1528913209_465819.html",
  "https://www.elsoldemexico.com.mx/gossip/omg/historico.-joven-transexual-engalana-por-primera-vez-una-portada-de-playboy-558024.html",
  "https://www.infobae.com/america/mexico/2018/04/21/los-secretos-del-ultimo-vagon-del-metro-de-la-ciudad-de-mexico-la-cajita-feliz-de-la-comunidad-gay/"
  
  
)

for (i in seq_along(url_list_2018)) {
  url <- url_list_2018[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2018_not_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    # Escribe un error
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## AÑO 2019 (NOTICIAS)

url_list_2019 <- c( "https://www.gq.com.mx/entretenimiento/articulo/soy-gay-estoy-orgulloso-de-decirlo-exclusiva-jorge-luis-martinez-patinador-mexicano",
 "https://www.elfinanciero.com.mx/economia/si-la-comunidad-lgbt-fuera-un-pais-su-economia-seria-3-veces-mas-grande-que-la-de-mexico/",
 "https://politica.expansion.mx/cdmx/2019/06/29/cronica-a-sus-41-anos-la-marcha-lgbt-reune-a-generaciones-en-una-misma-lucha",
 "https://www.infobae.com/america/mexico/2019/10/11/soy-gay-asi-fue-como-un-diputado-pidio-aprobar-el-matrimonio-igualitario-en-sonora/",
 "https://www.gq.com.mx/estilo-de-vida/articulo/historia-y-significado-orgullo-gay",
 "https://www.animalpolitico.com/2019/05/asesinatos-lgbt-crimenes-odio-mexico",
 "https://www.infobae.com/america/entretenimiento/2019/05/30/mauricio-clark-alista-marcha-ex-gay-en-mexico-puedes-dejar-atras-una-vida-homosexual/",
 "https://www.elsoldemexico.com.mx/mexico/sociedad/parejas-gay-ya-podran-casarse-en-consulados-mexicanos-de-todo-el-mundo-3630987.html",
"https://www.elsoldemexico.com.mx/mundo/reprimen-una-inedita-marcha-gay-en-cuba-3611941.html",
 "https://www.forbes.com.mx/no-existe-el-gen-gay-apunta-estudio-sobre-el-adn/",
 "https://mexico.as.com/mexico/2019/05/08/tikitakas/1557332833_619030.html",
 "https://www.milenio.com/politica/comunidad/comunidad-gay-los-cinco-estados-lgbt-mas-incluyentes-en-mexico",
 "https://www.quien.com/politica/2019/05/17/andres-manuel-lopez-obrador-con-la-bandera-del-arcoiris-entre-las-manos",
 "https://mexico.as.com/mexico/2019/06/12/tikitakas/1560353638_361181.html",
"https://www.elsoldemexico.com.mx/mundo/quien-rechaza-a-los-homosexuales-no-tiene-corazon-humano-papa-francisco-3343342.html"
)

for (i in seq_along(url_list_2019)) {
  url <- url_list_2019[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2019_not_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    # Escribe un error
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## AÑO 2020 (NOTICIAS)

# List of URLs for 2020 articles
url_list_2020 <- c(
  "https://www.vogue.mx/estilo-de-vida/articulo/belinda-envia-mensaje-a-la-comunidad-lgtbi-en-marcha-de-orgullo-gay-en-instagram",
  "https://www.milenio.com/politica/comunidad/marcha-orgullo-gay-41-anos-llenar-color-calles-cdmx",
  "https://www.eluniverso.com/noticias/2020/06/27/nota/7887000/activistas-lgbt-mexico-piden-justicia-crimenes-odio-durante-maraton/",
  "https://udgtv.com/noticias/la-comunidad-lgbt-de-mexico-triunfa-con-la-marcha-en-linea-mas-grande-del-mundo/13806",
  "https://politica.expansion.mx/estados/2020/08/12/un-joven-activista-lgbt-es-asesinado-en-zapopan-jalisco",
  "https://www.eluniversal.com.mx/opinion/mochilazo-en-el-tiempo/el-nueve-el-bar-gay-que-desafio-los-prejuicios-en-los-80/",
  "https://expansion.mx/empresas/2020/12/03/el-numero-de-empresas-lgbt-friendly-sube-a-casi-el-doble-este-ano-en-mexico",
  "https://www.espn.com.mx/futbol/mexico/nota/_/id/7093490/america-pumas-orgullo-gay-comunidad-lgbtttiqa",
  "https://www.eluniversal.com.mx/de-ultima/victoria-volkova-es-la-primera-mujer-transgenero-en-aparecer-en-playboy-mexico/",
  "https://www.gq.com.mx/entretenimiento/articulo/luz-noceda-de-the-owl-house-primer-personaje-bisexual-de-disney",
  "https://www.marthadebayle.com/v3/radiov3/sosv3/empresas-gay-friendly-en-mexico-2/",
  "https://www.dw.com/es/m%C3%A9xico-busca-una-cura-para-la-homofobia/a-53735445",
  "https://www.elsoldemexico.com.mx/mundo/benedicto-xvi-compara-al-matrimonio-homosexual-con-el-anticristo-5183682.html",
  "https://expansion.mx/carrera/2020/06/09/ejecutivos-lgbt-orgullosos-e-influyentes",
  "https://elpais.com/mexico/2020-08-13/el-asesinato-de-un-joven-homosexual-en-jalisco-enciende-de-nuevo-las-alarmas-sobre-los-delitos-de-odio-en-mexico.html"
  
)

for (i in seq_along(url_list_2020)) {
  url <- url_list_2020[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2020_not_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## AÑO 2021 (NOTICIAS)

url_list_2021 <- c(
  "https://www.elfinanciero.com.mx/nacional/2021/06/26/en-mexico-11-de-la-poblacion-pertenece-a-la-comunidad-lgbttti-segun-encuesta/",
  "https://www.swissinfo.ch/spa/m%C3%A9xico-lgbt--documentaci%C3%B3n-_los-avances-y-retos-de-la-comunidad-lgbt-en-m%C3%A9xico-en-esta-fiesta-del-orgullo/46736542",
  "https://mexico.as.com/mexico/2021/06/27/tikitakas/1624747409_345975.html",
  "https://politica.expansion.mx/cdmx/2021/12/30/pareja-gay-exige-disculpas-y-reparacion-del-dano-a-six-flags",
  "https://latinus.us/2021/12/30/six-flags-discrimina-pareja-gay-corrige-eliminando-politica-comportamiento-afectuoso/",
  "https://www.telediario.mx/comunidad/denuncian-discriminacion-pareja-gay-parque-diversiones-cdmx",
  "https://www.sandiegouniontribune.com/en-espanol/noticias/mexico/articulo/2021-07-07/el-congreso-de-la-ciudad-de-mexico-aprueba-ley-de-derechos-de-personas-lgbt",
  "https://mexico.as.com/mexico/2021/05/17/actualidad/1621205355_217302.html",
  "https://www.elsoldemexico.com.mx/doble-via/virales/hijo-de-superman-se-declara-bisexual-7327211.html",
  "https://www.latimes.com/espanol/mexico/articulo/2021-06-08/queman-y-asesinan-a-joven-gay-en-caribe-mexicano-tras-revelar-prueba-positiva",
  "https://www.latimes.com/espanol/mexico/articulo/2021-06-28/lopez-obrador-asegura-que-esta-por-la-diversidad-en-el-dia-del-orgullo-lgbt",
  "https://www.nytimes.com/es/2021/07/02/espanol/opinion/homofobia-futbol-mexico.html",
  "https://www.homosensual.com/lgbt/es-delito-ponerle-colores-lgbt-a-la-bandera-de-mexico/",
  "https://www.milenio.com/cultura/homofobia-transfobia-bifobia-celebra-17-mayo",
  "https://www.swissinfo.ch/spa/m%C3%A9xico-lgbt--cr%C3%B3nica-_lady-tacos-de-canasta--la-famosa-vendedora-trans-salta-a-la-pol%C3%ADtica-mexicana/46560754"
)

for (i in seq_along(url_list_2021)) {
  url <- url_list_2021[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2021_not_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## AÑO 2022 (NOTICIAS)

url_list_2022 <- c(
  "https://www.sandiegouniontribune.com/en-espanol/noticias/story/2022-02-18/mexicano-logra-registro-no-binario-en-acta-de-nacimiento",
  "https://agenciapresentes.org/2022/02/17/reconocen-por-primera-vez-la-identidad-de-una-persona-no-binaria-en-mexico/",
  "https://www.televisa.com/noticias/que-dia-se-conmemora-en-mexico-el-orgullo-lgbt/",
  "https://agenciapresentes.org/2022/11/04/mexico-hidalgo-se-convierte-en-el-primer-estado-que-reconoce-a-personas-no-binarias/",
  "https://www.elfinanciero.com.mx/nacional/2022/08/31/viruela-del-mono-organizaciones-gay-piden-acciones-para-frenar-contagios/",
  "https://www.foxsports.com.mx/2022/05/17/futbolistas-que-se-han-declarado-gays-en-los-ultimos-anos/",
  "https://elpais.com/mexico/2022-04-01/radiografia-de-la-transfobia-en-mexico-me-ensenaron-que-ser-yo-era-un-motivo-de-muerte.html",
  "https://www.hrw.org/es/news/2022/05/31/ee-uu-solicitantes-de-asilo-lgbt-en-peligro-en-la-frontera",
  "https://mexico.as.com/actualidad/sre-emite-primer-documento-oficial-para-personas-no-binarias-como-es-y-que-incluye-n/",
  "https://indeporte.cdmx.gob.mx/comunicacion/nota/celebra-gobierno-capitalino-mes-del-orgullo-con-la-iii-copa-lgbt-y-matrimonios-igualitarios",
  "https://www.dgcs.unam.mx/boletin/bdboletin/2022_524.html",
  "https://mexico.as.com/tikitakas/alan-estrada-confiesa-publicamente-que-es-gay-envia-mensaje-a-la-comunidad-lgbt-n/",
  "https://www.elsoldemexico.com.mx/mundo/la-primera-identificacion-oficial-no-binaria-9096871.html",
  "https://politica.expansion.mx/cdmx/2022/05/17/iluminan-monumentos-contra-la-homofobia-transfobia-y-bifobia",
  "https://www.excelsior.com.mx/funcion/jovenes-golpean-hombre-gay-afuera-taqueria-cdmx/1552036",
  "https://www.france24.com/es/am%C3%A9rica-latina/20231114-hallan-sin-vida-a-ociel-baena-primer-magistrade-electoral-no-binario-de-latinoam%C3%A9rica",
  "https://noticias.imer.mx/blog/esto-incomoda-porque-rompe-paradigmas-que-significa-ser-magistrade-en-mexico/",
  
  
  "https://www.eltiempo.com/mundo/latinoamerica/hallan-muerto-a-magistrade-de-genero-no-binario-que-lucho-por-derechos-lgbti-en-mexico-825437",
  "https://www.milenio.com/politica/emiten-primer-pasaporte-no-binario-en-mexico-a-magistrade-ociel-baena",
  "https://www.elfinanciero.com.mx/cdmx/2023/09/16/mujeres-trans-en-los-banos-publicos-activistas-protestan-en-la-cineteca-nacional/",
  "https://aristeguinoticias.com/1507/mexico/fotos-y-videos-ni-hombre-ni-mujer-no-binarie-realizan-primera-marcha-no-binarie-en-cdmx/",
  "https://aristeguinoticias.com/1507/mexico/mexicanes-reconocimiento-legal-de-personas-no-binarias-avanza-en-mexico/",
  "https://elpais.com/mexico/2023-08-14/wendy-guevara-la-actriz-trans-que-ha-convertido-la-casa-de-los-famosos-en-su-propio-show.html",
  "https://aristeguinoticias.com/0703/mexico/cis-trans-no-binarix-glosario-de-diversidad-de-genero-para-el-8m/",
  "https://aristeguinoticias.com/2207/deportes/quinn-primera-persona-trans-no-binaria-que-juega-en-un-mundial-femenil/",
  "https://www.jornada.com.mx/notas/2023/09/16/sociedad/activista-advierte-riesgos-de-la-comunidad-trans-en-mexico/",
  "https://elpais.com/mexico/2023-02-22/una-protesta-por-los-derechos-de-las-personas-trans-enfrenta-a-las-autoridades-con-los-manifestantes-en-el-congreso-de-ciudad-de-mexico.html"
)

for (i in seq_along(url_list_2022)) {
  url <- url_list_2022[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2022_not_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    # Print an error message
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## Articulo 16 scraped correctamente
## Articulo 17 scraped correctamente
## Articulo 18 scraped correctamente
## Articulo 19 scraped correctamente
## Articulo 20 scraped correctamente
## Articulo 21 scraped correctamente
## Articulo 22 scraped correctamente
## Articulo 23 scraped correctamente
## Articulo 24 scraped correctamente
## Articulo 25 scraped correctamente
## Articulo 26 scraped correctamente
## Articulo 27 scraped correctamente

GOBIERNO

## AÑO 2018

url_list_2018_gob <- c(
  "https://www.gob.mx/ceav/documentos/diagnostico-nacional-sobre-la-discriminacion-hacia-personas-lgbti-en-mexico",
  "https://www.gob.mx/ceav/prensa/instituciones-y-organizaciones-civiles-repudiamos-los-recientes-asesinatos-de-personas-de-la-diversidad-sexual-y-de-genero?idiom=es",
  "https://www.gob.mx/conamed/articulos/la-conamed-participa-en-una-reunion-de-pares-en-la-sede-de-la-oms-en-washington-d-c?idiom=es",
  "https://www.gob.mx/conavim/es/articulos/protocolo-de-actuacion-de-la-policia-federal-para-casos-que-involucren-personas-de-la-comunidad-lgbttti?idiom=es",
  "https://www.gob.mx/imjuve/articulos/dia-internacional-del-orgullo-lgbtiq?idiom=es",
  "https://www.gob.mx/cultura/prensa/festival-mix-vuelve-con-amplia-seleccion-de-cine-sobre-diversidad-sexual",
  "https://www.gob.mx/sectur/prensa/la-actividad-turistica-en-mexico-hoy-tiene-una-nueva-dimension-social-232853?idiom=es-MX"
)

for (i in seq_along(url_list_2018_gob)) {
  url <- url_list_2018_gob[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2018_gob_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## AÑO 2019

url_list_2019_gob <- c(
  "https://www.gob.mx/salud%7Cseguropopular/es/articulos/ponencia-el-derecho-a-la-salud-de-las-comunidades-lgbt",
  "https://www.gob.mx/cultura/articulos/breve-historia-de-la-primera-marcha-lgbttti-de-mexico",
  "https://www.gob.mx/inapam/es/articulos/diversidad-sexual-en-personas-adultas-mayores?idiom=es",
  "https://www.gob.mx/sipinna/articulos/que-es-el-bullying-homofobico?idiom=es",
  "https://www.gob.mx/indesol/prensa/visibilizan-movimientos-lgbti-en-el-mundo-y-su-impacto-en-mexico-hacia-poblaciones-diversa",
  "https://www.gob.mx/aprendemx/articulos/mitos-y-realidades-sobre-las-personas-con-orientaciones-sexuales-e-identidades-de-genero-diversas?idiom=es",
  "https://www.gob.mx/sre/prensa/acompanan-embajadas-y-consulados-campana-en-favor-de-la-diversidad-lgbt-200754",
  "https://www.gob.mx/presidencia/prensa/conferencia-de-prensa-del-presidente-andres-manuel-lopez-obrador-del-17-de-mayo-de-2019-200627?idiom=en",
  "https://www.gob.mx/indesol/prensa/discuten-los-derechos-humanos-de-la-poblacion-lgbti-en-condicion-de-migrante",
  "https://www.gob.mx/sfp/documentos/red-de-apoyo-lgbti-de-la-funcion-publica",
  "https://www.gob.mx/imss/articulos/implementa-imss-acciones-que-fomentan-el-respeto-y-garantizan-los-derechos-de-la-diversidad-sexual"
)

for (i in seq_along(url_list_2019_gob)) {
  url <- url_list_2019_gob[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2019_gob_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## AÑO 2020

# List of URLs for 2020 government articles
url_list_2020_gob <- c(
  "https://www.gob.mx/cultura/prensa/con-actividades-artisticas-el-inbal-conmemora-el-dia-internacional-del-orgullo-lgbt",
  "https://www.gob.mx/cultura/prensa/cortometrajes-para-conmemorar-el-dia-del-orgullo-lgbt",
  "https://www.gob.mx/indesol/prensa/colectivo-jotos-de-guerrero-en-la-lucha-por-visibilizar-los-derechos-de-las-poblaciones-diversas",
  "https://www.gob.mx/inmujeres/articulos/discriminacion-de-la-comunidad-lgbt-en-los-centros-de-trabajo-una-realidad-en-mexico",
  "https://www.gob.mx/segob/prensa/gobierno-de-mexico-comprometido-para-eliminar-discriminacion-por-orientacion-sexual-e-identidad-de-genero-senala-secretaria-de-gobernacion",
  "https://www.gob.mx/cultura/prensa/conmemorara-el-cecut-el-dia-internacional-del-orgullo-gay-con-conversatorio-a-distancia",
  "https://www.gob.mx/sectur/prensa/concluyo-exitosamente-miguel-torruco-su-participacion-en-la-feria-internacional-de-turismo-de-espana?idiom=es-MX",
  "https://www.gob.mx/sectur/prensa/la-actividad-turistica-en-mexico-hoy-tiene-una-nueva-dimension-social-232853?idiom=es-MX"
)

for (i in seq_along(url_list_2020_gob)) {
  url <- url_list_2020_gob[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2020_gob_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## AÑO 2021

url_list_2021_gob <- c(
  "https://www.gob.mx/inapam/es/articulos/vejeces-diversas-personas-mayores-lgbtttiqa-lesbianas-gay-bisexuales-transgenero-transexuales-intersexuales-queer-y-asexuales?idiom=es",
  "https://www.gob.mx/inpi/es/articulos/muxes-y-la-comunidad-lgbtttiqa?idiom=es",
  "https://www.gob.mx/salud/cnegsr/es/articulos/recursos-contra-la-discriminacion-y-la-violencia-por-orientacion-sexual-identidad-o-expresion-de-genero?idiom=es",
  "https://www.gob.mx/salud/es/articulos/blog-275701?idiom=es"
)

for (i in seq_along(url_list_2021_gob)) {
  url <- url_list_2021_gob[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2021_gob_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## AÑO 2022

url_list_2022_gob <- c(
  "https://www.gob.mx/semar/acciones-y-programas/derechos-humanos-de-las-personas-lgtb",
  "https://www.gob.mx/imss/documentos/protocolo-de-atencion-lgbttti-en-el-imss",
  "https://www.gob.mx/sre/documentos/personas-lgbtiq-94153",
  "https://www.gob.mx/imss/prensa/celebra-imss-resolucion-por-pension-de-viudez-entre-parejas-del-mismo-sexo",
  "https://www.gob.mx/conasami/prensa/conasami-presenta-brecha-salarial-para-grupos-de-interes-por-potencial-discriminacion-laboral?idiom=es",
  "https://www.gob.mx/sectur/prensa/sectur-impulsa-acreditacion-en-el-segmento-lgbtq-para-destinos-y-empresas-en-mexico",
  "https://www.gob.mx/salud/prensa/vincular-viruela-simica-con-la-poblacion-lgbtttiq-genera-estigma-y-discriminacion",
  "https://www.gob.mx/sre/prensa/second-meeting-of-lgbtq-mexican-communities-abroad?idiom=en",
  "https://www.gob.mx/cultura/prensa/la-actriz-luz-maria-jerez-leera-fragmentos-de-familias-monstruosas-como-parte-de-quieres-que-te-lo-lea-otra-vez",
  "https://www.gob.mx/segob/prensa/llaman-conapred-fmf-y-liga-mx-a-reconocer-y-respetar-diversidad-sexual-en-el-futbol",
  "https://www.gob.mx/sre/prensa/sre-celebra-encuentro-con-comunidades-mexicanas-residentes-en-el-exterior",
  "https://www.gob.mx/sre/prensa/the-foreign-ministry-meets-with-representatives-of-mexican-communities-in-the-us?idiom=en",
  "https://www.gob.mx/cultura/prensa/la-galeria-jose-maria-velasco-comparte-la-tradicion-de-la-vela-muxe-en-la-ciudad-de-mexico",
  "https://www.gob.mx/cultura/articulos/nancy-cardenas-guerrillera-disfrazada-de-artista",
  "https://www.gob.mx/cultura/prensa/el-museo-casa-de-carranza-desarrollara-jornada-cultural-por-el-dia-internacional-del-orgullo-lgbtttiq"
)

for (i in seq_along(url_list_2022_gob)) {
  url <- url_list_2022_gob[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1,  p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2022_gob_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
ASOCIACION CIVIL
## AÑO 2018

url_list_2018_ac <- c(
  "https://www.yaajmexico.org/blog/descargables/encuesta-nacional-sobre-discriminacion-y-juventudes-lgbti/",
  "https://www.yaajmexico.org/blog/articulos/la-homofobia-esta-viva-y-coleando-la-prohibicion-a-las-curas-lgbt/",
  "https://www.yaajmexico.org/blog/notas/hawai-prohibe-las-terapias-de-conversion-para-la-juventud-lgbtq/",
  "https://www.yaajmexico.org/blog/notas/embajadas-se-reuniran-para-fijar-postura-sobre-derechos-humanos-lgbti-en-mexico/",
  "https://www.yaajmexico.org/blog/notas/el-parlamento-europeo-toma-una-posicion-contra-las-terapias-de-conversion-lgbti-por-primera-vez/",
  "https://www.yaajmexico.org/blog/notas/se-dijo-que-no-era-enfermedad-nunca-se-dijo-que-la-homosexualidad-que-fuera-saludable-psicologo/",
  "https://www.yaajmexico.org/blog/articulos/el-rechazo-familiar-puede-causar-danos-irreversibles-a-la-salud-de-las-personas-lgbt/",
  "https://www.yaajmexico.org/blog/ecosig/presentacion-del-dossier-ecosig/",
  "https://www.yaajmexico.org/blog/notas/la-cndh-se-pronuncia-en-contra-de-las-practicas-de-conversion/",
  "https://www.yaajmexico.org/blog/notas/ganan-juicio-contra-las-terapias-de-conversion-en-china/"
)

for (i in seq_along(url_list_2018_ac)) {
  url <- url_list_2018_ac[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2018_ac_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## AÑO 2019

url_list_2019_ac <- c(
  "https://www.yaajmexico.org/blog/notas/resultados-fortalecete-lgbti-2019/",
  "https://www.yaajmexico.org/blog/instrumentos/guia-universidades-libres-de-violencia-y-discriminacion-por-orientacion-sexual-e-identidad-de-genero/",
  "https://www.yaajmexico.org/blog/ecosig/guia-nada-que-curar/",
  "https://www.yaajmexico.org/blog/comunicados/informe-rendicion-de-cuentas-2018/",
  "https://www.yaajmexico.org/blog/instrumentos/manual-para-estudiantes-universidades-incluyentes-y-libres-de-discriminacion/",
  "https://infanciastrans.org/testimonio-luis-en-foro-de-infancias-trans/",
  "https://infanciastrans.org/testimonio-sofia-en-foro-de-infancias-trans/",
  "https://infanciastrans.org/somos-diversidad-retratos-de-genero/",
  "https://infanciastrans.org/infancias-trans-por-genaro-lozano/",
  "https://infanciastrans.org/10-de-octubre-iniciativa-para-la-via-administrativa-de-la-identidad-de-genero-en-personas-menores-de-18-anos-en-la-ciudad-de-mexico/",
  "https://infanciastrans.org/resguardo-de-actas-de-nacimiento/",
  "https://infanciastrans.org/decalogo-para-madres-y-padres/",
  "https://infanciastrans.org/modificacion-de-genero-e-identidad/",
  "https://infanciastrans.org/que-hacer-si-tengo-una-hija-hijo-o-hije-trans/"
)

for (i in seq_along(url_list_2019_ac)) {
  url <- url_list_2019_ac[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2019_ac_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## AÑO 2020

url_list_2020_ac <- c(
  "https://infanciastrans.org/materiales-audiovisuales-sobre-infancias-y-adolescencias-trans/",
  "https://infanciastrans.org/camino-a-jalisco/", 
  "https://infanciastrans.org/personas-trans-en-la-cdmx-panorama-actual-2/",
  "https://infanciastrans.org/activismo-dentro-de-la-escuela/",
  "https://infanciastrans.org/por-que-y-como-podemos-ayudar-a-las-infancias-y-adolescencias-trans/",
  "https://infanciastrans.org/repuesta-a-obispo-de-cuernavaca-culpa-a-ninez-trans-por-coronavirus/",
  "https://infanciastrans.org/rechazo-durante-la-cuarentena/",
  "https://infanciastrans.org/mitos-y-realidades-de-la-iniciativa-de-infancias-trans/",
  "https://infanciastrans.org/que-significa-ser-mujer-nina/",
  "https://infanciastrans.org/infancias-trans-en-la-ciudad-de-mexico-la-antesala-de-la-desjudicializacion-2/",
  "https://infanciastrans.org/miderechoaexistir-2/",
  "https://infanciastrans.org/cuando-una-persona-trans-se-enferma/",
  "https://infanciastrans.org/alerta-no-al-retroceso/",
  "https://www.yaajmexico.org/blog/nuestrasplumas/historico-esta-semana-avanzo-ley-de-identidad-de-genero-en-el-edomex/",
  "https://www.yaajmexico.org/blog/articulos/cientos-de-lideres-religiosos-piden-prohibir-las-terapias-de-conversion-sexual/",
  "https://www.yaajmexico.org/blog/articulos/morena-presenta-iniciativa-de-ley-para-sancionar-ecosig-en-guanajuato/",
  "https://www.yaajmexico.org/blog/articulos/se-busca-prohibir-ecosig-en-sinaloa/",
  "https://www.yaajmexico.org/blog/articulos/prohiben-ecosig-en-el-edomex/"
)


for (i in seq_along(url_list_2020_ac)) {
  url <- url_list_2020_ac[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1, p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2020_ac_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## Articulo 16 scraped correctamente
## Articulo 17 scraped correctamente
## Articulo 18 scraped correctamente
## AÑO 2021

url_list_2021_ac <- c(
  "https://infanciastrans.org/adultocentrismo-un-obstaculo-mas-para-las-infancias-trans/",
  "https://infanciastrans.org/el-reconocimiento-a-la-identidad-en-ninas-ninos-nines-y-adolescentes-transgenero-en-mexico-un-derecho-humano-pendiente/",
  "https://www.yaajmexico.org/blog/articulos/ratzinger-lanza-discursos-de-odio-contra-comunidad-lgbti/",
  "https://www.yaajmexico.org/blog/articulos/violencia-acida-el-verdadero-borrado-de-mujeres/",
  "https://www.yaajmexico.org/blog/articulos/gobierno-de-australia-apuesta-por-inclusion/",
  "https://www.yaajmexico.org/blog/comunicados/nada-que-curar-en-yucatan/",
  "https://www.yaajmexico.org/blog/nuestrasplumas/la-visibilizacion-de-puebos-indigenas-y-la-comunidad-lgbti/",
  "https://www.yaajmexico.org/blog/uncategorized/the-prom-mexico-obraconrepresentacionlesbica/",
  "https://www.yaajmexico.org/blog/articulos/discapacidad-y-diversidad-sexual/",
  "https://www.yaajmexico.org/blog/comunicados/a-un-ano-de-prohibirse-los-ecosig-cdmx/",
  "https://www.yaajmexico.org/blog/articulos/por-que-conmemoramos-el-mes-del-orgullo/",
  "https://www.yaajmexico.org/blog/articulos/deconstruyendo-lo-no-binario/"
)

for (i in seq_along(url_list_2021_ac)) {
  url <- url_list_2021_ac[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1,  p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2021_ac_", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error con el articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## AÑO 2022

url_list_2022_combined <- c(
  "https://www.yaajmexico.org/blog/notas/ley-contra-terapias-de-conversion-es-presentada-en-la-camara-de-diputados/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-terapia-hormonal-para-personas-trans-en-mexico-con-maximo-carrasco/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-terapia-hormonal-modelantes-y-arvs-de-vih-para-personas-trans-en-mexico-con-tanya-vazquez/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-terapia-hormonal-modelantes-y-arvs-de-vih-para-personas-trans-en-mexico-con-tanya-vazquez/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-pastillas-abortifacientes-en-mexico-con-dahlia-de-la-cerda/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-pastillas-abortifacientes-en-mexico-con-isabel-fulda/",
  "https://www.yaajmexico.org/blog/uncategorized/sexualidades-quimicas-antirretrovirales-de-vih-en-mexico-con-ruben-barba/",
  "https://infanciastrans.org/la-apropiacion-de-la-vida-hablemos-de-opresiones-y-normatividades/",
  "https://www.yaajmexico.org/blog/notas/ley-contra-terapias-de-conversion-es-presentada-en-la-camara-de-diputados/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-terapia-hormonal-para-personas-trans-en-mexico-con-maximo-carrasco/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-terapia-hormonal-modelantes-y-arvs-de-vih-para-personas-trans-en-mexico-con-tanya-vazquez/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-terapia-hormonal-modelantes-y-arvs-de-vih-para-personas-trans-en-mexico-con-tanya-vazquez/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-pastillas-abortifacientes-en-mexico-con-dahlia-de-la-cerda/",
  "https://www.yaajmexico.org/blog/articulos/sexualidades-quimicas-pastillas-abortifacientes-en-mexico-con-isabel-fulda/",
  "https://www.yaajmexico.org/blog/uncategorized/sexualidades-quimicas-antirretrovirales-de-vih-en-mexico-con-ruben-barba/",
  "https://infanciastrans.org/conoce-a-nuestro-consejo-consultivo/",
  "https://www.yaajmexico.org/blog/articulos/la-importancia-de-tomar-las-calles/",
  "https://www.yaajmexico.org/blog/articulos/la-alegria/",
  "https://www.yaajmexico.org/blog/articulos/trans-formando-las-acciones-afirmativas-en-mexico/",
  "https://www.yaajmexico.org/blog/articulos/ser-nuu-savi-y-o-ser-gay/",
  "https://www.yaajmexico.org/blog/comunicados/encuentro-de-liderazgos-politicos-lgbti-de-las-americas-y-el-caribe/"

)

for (i in seq_along(url_list_2022_combined)) {
  url <- url_list_2022_combined[i]
  tryCatch({
    pagina <- read_html(url)
    texto <- pagina %>%
      html_nodes("h1,  p") %>%
      html_text() %>%
      str_squish()
    nombre_archivo <- paste0("2022_ac", i, ".txt")
    writeLines(texto, nombre_archivo)
    cat("Articulo", i, "scraped correctamente\n")
  }, error = function(e) {
    cat("Error al intentar scrapeo de articulo", i, ":", conditionMessage(e), "\n")
  })
}
## Articulo 1 scraped correctamente
## Articulo 2 scraped correctamente
## Articulo 3 scraped correctamente
## Articulo 4 scraped correctamente
## Articulo 5 scraped correctamente
## Articulo 6 scraped correctamente
## Articulo 7 scraped correctamente
## Articulo 8 scraped correctamente
## Articulo 9 scraped correctamente
## Articulo 10 scraped correctamente
## Articulo 11 scraped correctamente
## Articulo 12 scraped correctamente
## Articulo 13 scraped correctamente
## Articulo 14 scraped correctamente
## Articulo 15 scraped correctamente
## Articulo 16 scraped correctamente
## Articulo 17 scraped correctamente
## Articulo 18 scraped correctamente
## Articulo 19 scraped correctamente
## Articulo 20 scraped correctamente
## Articulo 21 scraped correctamente

Funciones Centrales Por Año Noticias

se identifican los archivos de texto con su tipo de fuente y año. Al realizaresto, los archivos se guardan en una variable denominada de acuerdo al tipo de fuente y el conjunto de año que estan revisando.

# NOTICIAS

art_2018 <- list.files(pattern = "^2018_not.*\\.txt$", full.names = TRUE)
art_2019 <- list.files(pattern = "^2019_not.*\\.txt$", full.names = TRUE)
art_2020 <- list.files(pattern = "^2020_not.*\\.txt$", full.names = TRUE)
art_2021 <- list.files(pattern = "^2021_not.*\\.txt$", full.names = TRUE)
art_2022 <- list.files(pattern = "^2022_not.*\\.txt$", full.names = TRUE)

# GOBIERNO

gob_2018 <- list.files(pattern = "^2018_gob.*\\.txt$", full.names = TRUE)
gob_2019 <- list.files(pattern = "^2019_gob.*\\.txt$", full.names = TRUE)
gob_2020 <- list.files(pattern = "^2020_gob.*\\.txt$", full.names = TRUE)
gob_2021 <- list.files(pattern = "^2021_gob.*\\.txt$", full.names = TRUE)
gob_2022 <- list.files(pattern = "^2022_gob.*\\.txt$", full.names = TRUE)

# ASOCIACION CIVIL

civil_2018 <- list.files(pattern = "^2018_ac.*\\.txt$", full.names = TRUE)
civil_2019 <- list.files(pattern = "^2019_ac.*\\.txt$", full.names = TRUE)
civil_2020 <- list.files(pattern = "^2020_ac.*\\.txt$", full.names = TRUE)
civil_2021 <- list.files(pattern = "^2021_ac.*\\.txt$", full.names = TRUE)
civil_2022 <- list.files(pattern = "^2022_ac.*\\.txt$", full.names = TRUE)

LIMPIEZA

Se realiza una limpieza central, identifiando frases, signos y palabras que pueden crear ruido en el analisis. Es importante destacar que la limpieza de los archivos fue hecha antes gracias al html.nodes

limpiar_texto <- function(archivo) {
  tryCatch({
    texto <- readLines(archivo, warn = FALSE)
    texto <- paste(texto, collapse = " ")
    texto <- tolower(texto) 
    codigo_a_eliminar <- "var SubGroup = '.*?console.log\\(true\\);\\s*"
    texto <- gsub(codigo_a_eliminar, "", texto, perl = TRUE) 
    texto <- gsub("http\\S+|www\\.\\S+","",texto) 
    texto <- gsub("<.*?>","",texto) 
    texto <- gsub("[[:punct:]]","",texto)
    texto <- gsub("\\d+","",texto) 
    texto <- gsub("\\s+"," ",texto) 
  remove_numbers_es <- function(texto) gsub("\\b(uno|dos|tres|cuatro|cinco|seis|siete|ocho|nueve|diez)\\b", "", texto)
  remove_nexos <- function(texto) {
    nexos <- c("a", "ante", "bajo", "cabe", "con", "contra", "de", "desde", "en", "entre", "hacia", "hasta", "para", "por", "según", "sin", "so", "sobre", "tras", "y", "o", "u", "ni", "pero", "porque", "pues", "ya", "aunque", "si", "como", "cuando", "donde")
    words <- unlist(strsplit(texto, " ")) 
    words <- words[!tolower(words) %in% nexos]  
    paste(words, collapse = " ")
}

remove_palabras_tiempo <- function(texto) {
  palabras_tiempo <- c("lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo",
                       "ayer", "hoy", "mañana", "ahora", "tarde", "noche", "tiempo" ,"tardes" ,"buenas" ,"buenos" ,"noches" , "días" ,"semanas","meses","años")
  words <- unlist(strsplit(texto, " ")) 
  words <- words[!tolower(words) %in% palabras_tiempo]
  paste(words, collapse = " ")
}

remove_question_words <- function(texto) gsub("\\b(quién|qué|cómo|dónde|cuándo|por qué)\\b", "", texto)


  texto <- remove_nexos(texto) 
  texto <- remove_numbers_es(texto) 
  texto <- remove_question_words(texto) 
  texto <- remove_palabras_tiempo(texto) 
  
  stopwords_es <- stopwords("es")
  palabras <- unlist(strsplit(texto, " "))
  palabras_filtradas <- palabras[!palabras %in% stopwords_es]
  
  texto <- paste(palabras_filtradas, collapse = " ")
  return(texto)
  
  }, error = function(e) {
    cat("Error al leer el archivo", archivo, ":", conditionMessage(e), "\n")
    return(NULL)  # Retorna NULL en caso de error
  })
}

MATRIZ

Se aplica la limpieza central a cada variable de la fuente por año.

## NOTICIAS

limpiar_archivos <- function(archivos) {
  textos_limpios <- lapply(archivos, limpiar_texto)
  return(textos_limpios)
}
noticias_2018 <- limpiar_archivos(art_2018)
noticias_2019 <- limpiar_archivos(art_2019)
noticias_2020 <- limpiar_archivos(art_2020)
noticias_2021 <- limpiar_archivos(art_2021)
noticias_2022 <- limpiar_archivos(art_2022)


## GOBIERNO
limpiar_archivos <- function(archivos) {
  textos_limpios <- lapply(archivos, limpiar_texto)
  return(textos_limpios)
}
gobierno_2018 <- limpiar_archivos(gob_2018)
gobierno_2019 <- limpiar_archivos(gob_2019)
gobierno_2020 <- limpiar_archivos(gob_2020)
gobierno_2021 <- limpiar_archivos(gob_2021)
gobierno_2022 <- limpiar_archivos(gob_2022)


## ASOCIACION CIVIL
limpiar_archivos <- function(archivos) {
  textos_limpios <- lapply(archivos, limpiar_texto)
  return(textos_limpios)
}
ac_2018 <- limpiar_archivos(civil_2018)
ac_2019 <- limpiar_archivos(civil_2019)
ac_2020 <- limpiar_archivos(civil_2020)
ac_2021 <- limpiar_archivos(civil_2021)
ac_2022 <- limpiar_archivos(civil_2022)

CORPUS POR FUENTE.

Se crean corpus centrales de cada fuente y se dividen por año.

NOTICIAS

palabras_eliminar <- c("null", "gtagset", "function", "var", "pagetype", "presidente", "interlocutos", "pues", "aquí","ver","ahora", "también", "muy","ahí","gagobtrackerset","entonces","gracias","además","vamos","mil","bueno","así","versión","estenográfica","gaset","voy","van","conferencia","contentgroup","organizationname","interlocutora","ser","hacer","pagesgroup","señor", "prensa", "puede", "país", "méxico", "diminsión", "millones", "jesús", "ramírez", "luego", "pregunta", "dimension", "tema", "todas", "presidencia","gobierno","bue", "pesos", "caso", "nacional", "ciento", "hace", "sólo", "else", "email", "gobmx", "data", "lang", "properties", "section", "subgroup", "type", "leer", "méxico", "kcmykprocess", "además", "mil", "kcmykprocess", "presidente", "presidente", "sexual", "personas", "puede","farfalla","giuliana","larralde","publicación","compartida","Error al leer el archivo","giulianafarfalla","pst","you", "septiembre","human","rights","watch","carlos","carlosv","dariolarralde","december","pdt","dario","vela","instagram","the","sociales","parte","ciudad","nov","this","cuenta","redes","primera","vez")


# Corpus y DTM para 2018
corpus_2018 <- Corpus(VectorSource(noticias_2018))
corpus_2018 <- tm_map(corpus_2018,removeWords,stopwords("es"))
corpus_2018 <- tm_map(corpus_2018,removeWords,palabras_eliminar)
dtm_2018 <- DocumentTermMatrix(corpus_2018)
conteo_2018 <- colSums(as.matrix(dtm_2018))
inspect(dtm_2018)
## <<DocumentTermMatrix (documents: 30, terms: 2275)>>
## Non-/sparse entries: 5914/62336
## Sparsity           : 91%
## Maximal term length: 30
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs comunidad conapred derechos discriminación gay gente lgbt marcha mujer
##   11        13       10        1              2   4     4    5      0     1
##   18         0        0        0              0   0     2    0      0     0
##   19         2        0        3              2   8     4    2     16     2
##   21         0        0        0              2   0     0    0      0     4
##   22         4        0        0              0   5     5    0      0     0
##   26        13       10        0              2   4     4    5      0     0
##   3          0        0        1              0   0     2    0      0     1
##   4          2        0        3              2   8     4    2     16     2
##   6          0        0        1              2   0     0    0      0     5
##   7          4        0        0              0   5     5    0      0     0
##     Terms
## Docs solo
##   11   11
##   18    0
##   19    1
##   21    0
##   22    1
##   26   10
##   3     1
##   4     1
##   6     1
##   7     1
# Corpus y DTM para 2019
corpus_2019 <- Corpus(VectorSource(noticias_2019))
corpus_2019 <- tm_map(corpus_2019,removeWords,stopwords("es"))
corpus_2019 <- tm_map(corpus_2019,removeWords,palabras_eliminar)
dtm_2019 <- DocumentTermMatrix(corpus_2019)
conteo_2019 <- colSums(as.matrix(dtm_2019))
inspect(dtm_2019)
## <<DocumentTermMatrix (documents: 15, terms: 2368)>>
## Non-/sparse entries: 3375/32145
## Sparsity           : 90%
## Maximal term length: 35
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs comunidad deporte derechos gay gente lgbt marcha matrimonio mismo mundo
##   1          5      18        0   4    12    2      0          0     5     5
##   10         4       0        4   4     0    3      0         15     6     0
##   11         3       0        2   9     1    1      0          0     1     0
##   12         4       0        2   0     0   11      0          0     0     0
##   14         2       0        7   7     0    4      2          8     4    12
##   15         0       0        5   5     0    0     11          2     0     5
##   5          2       0        5   0     0    4      0          1     0     0
##   7          0       0        1  10     4    0      0          0     0     5
##   8          8       0        0   0     0    9      0          0     0     3
##   9          0       0        1   1     1    4      7          1     0     0
# Corpus y DTM para 2020
corpus_2020 <- Corpus(VectorSource(noticias_2020))
corpus_2020 <- tm_map(corpus_2020,removeWords,stopwords("es"))
corpus_2020 <- tm_map(corpus_2020,removeWords,palabras_eliminar)
dtm_2020 <- DocumentTermMatrix(corpus_2020)
conteo_2020 <- colSums(as.matrix(dtm_2020))
inspect(dtm_2020)
## <<DocumentTermMatrix (documents: 15, terms: 2866)>>
## Non-/sparse entries: 3897/39093
## Sparsity           : 91%
## Maximal term length: 30
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs año comunidad derechos empresas gay homosexual lgbt marcha mundo papa
##   10   2         3        7        0   1          0    4      5     4    0
##   12   1         0        1        0   6          1    1      0     1    0
##   14   4        11        0        0   6          0   10      0     0    0
##   2    1         1        0        0   2          1    0      0     1    0
##   3    2         0        1       10   1          0    8      0     1    0
##   4    1         1        2        0   1          1    0      0     2    0
##   5    0         2        1        0   0          7    2      0    12   20
##   7    1         1        3        0   0          2    0      0     0    0
##   8    3         5        2        0   4          9    4     12     0    0
##   9    6         1        4        0   3          2    1      3     0    0
# Corpus y DTM para 2021
corpus_2021 <- Corpus(VectorSource(noticias_2021))
corpus_2021 <- tm_map(corpus_2021,removeWords,stopwords("es"))
corpus_2021 <- tm_map(corpus_2021,removeWords,palabras_eliminar)
dtm_2021 <- DocumentTermMatrix(corpus_2021)
conteo_2021 <- colSums(as.matrix(dtm_2021))
inspect(dtm_2021)
## <<DocumentTermMatrix (documents: 15, terms: 2261)>>
## Non-/sparse entries: 3313/30602
## Sparsity           : 90%
## Maximal term length: 23
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs comunidad correo derechos discriminación ley lgbt noticias orgullo parque
##   10         1      0        2              6   3    2        0       1     13
##   11         0      0        2              4   1    0        0       0      7
##   13         0      0        2              4  11    3       20       1      0
##   14         6      0        0              0   0    8        0       0      0
##   15         6      2        5              0   0    2        0       0      0
##   2          5      0        3              1   0    2        1       1      0
##   4          3      0        0              2   0    0        0       1      0
##   5          3      0        1              0   4    8        0       0      0
##   7          2      8        0              1   0    3        3       1      0
##   8          5      8        3              6   2    9        3       3      0
##     Terms
## Docs tacos
##   10     0
##   11     0
##   13     0
##   14     0
##   15     0
##   2      0
##   4      0
##   5      0
##   7     18
##   8      0
# Corpus y DTM para 2022
corpus_2022 <- Corpus(VectorSource(noticias_2022))
corpus_2022 <- tm_map(corpus_2022,removeWords,stopwords("es"))
corpus_2022 <- tm_map(corpus_2022,removeWords,palabras_eliminar)
dtm_2022 <- DocumentTermMatrix(corpus_2022)
conteo_2022 <- colSums(as.matrix(dtm_2022))
inspect(dtm_2022)
## <<DocumentTermMatrix (documents: 27, terms: 4124)>>
## Non-/sparse entries: 6841/104507
## Sparsity           : 94%
## Maximal term length: 30
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs asilo binaria comunidad derechos género identidad lgbt noticias persona
##   12     0       9         0        1      0        14    2        0       8
##   13     0       0         1        3     10         5    1        1       2
##   16     0       0         2        0      0         0    1        0       0
##   19     0       0         3       12      3         2    2        0       2
##   25     0       2         1        2      4         5    1        0       2
##   26    52       0         1        4      7         4   22        0       2
##   3      0       3         1        1      5         1    0        0       1
##   4      0       0         5        0      0         0    3        0       0
##   5      0      11         0        5     10        12    2        0       6
##   8      0       4         3        7      2         2    0        1       7
##     Terms
## Docs trans
##   12     7
##   13    23
##   16     9
##   19     9
##   25    18
##   26     2
##   3      4
##   4      0
##   5      8
##   8      2
#Corpus y DTM FINAL

todas_las_noticias <- c(noticias_2018, noticias_2019, noticias_2020, noticias_2021, noticias_2022)
corpus_final <- Corpus(VectorSource(todas_las_noticias))
corpus_final <- tm_map(corpus_final, removeWords, stopwords("es"))
corpus_final <- tm_map(corpus_final, removeWords, palabras_eliminar)
dtm_final <- DocumentTermMatrix(corpus_final)
conteo_final <- colSums(as.matrix(dtm_final))
inspect(dtm_final)
## <<DocumentTermMatrix (documents: 102, terms: 8755)>>
## Non-/sparse entries: 23340/869670
## Sparsity           : 97%
## Maximal term length: 35
## Weighting          : term frequency (tf)
## Sample             :
##      Terms
## Docs  comunidad derechos discriminación gay género identidad lgbt marcha mundo
##   101         1        4              3   1      7         4   22      0     0
##   11         13        1              2   4      0         0    5      0     2
##   19          2        3              2   8      0         0    2     16     1
##   26         13        0              2   4      0         0    5      0     2
##   31          5        0              0   4      0         0    2      0     5
##   37          0        1              0  10      0         0    0      0     5
##   4           2        3              2   8      0         0    2     16     1
##   45          0        5              0   5      0         0    0     11     5
##   80          0        5              6   0     10        12    2      0     4
##   83          3        7              5   0      2         2    0      0     0
##      Terms
## Docs  trans
##   101     2
##   11      0
##   19      0
##   26      0
##   31      0
##   37      0
##   4       0
##   45      0
##   80      8
##   83      2

GOBIERNO

palabras_eliminar <- c("null", "gtagset", "function", "var", "pagetype", "presidente", "interlocutos", "pues", "aquí","ver","ahora", "también", "muy","ahí","gagobtrackerset","entonces","gracias","además","vamos","mil","bueno","así","versión","estenográfica","gaset","voy","van","conferencia","contentgroup","organizationname","interlocutora","ser","hacer","pagesgroup","señor", "prensa", "puede", "país", "méxico", "diminsión", "millones", "jesús", "ramírez", "luego", "pregunta", "dimension", "tema", "todas", "presidencia","gobierno","bue", "pesos", "caso", "nacional", "ciento", "hace", "sólo", "else", "email", "gobmx", "data", "lang", "properties", "section", "subgroup", "type", "leer", "méxico", "kcmykprocess", "además", "mil", "kcmykprocess", "presidente", "presidente", "sexual", "personas", "puede","farfalla","giuliana","larralde","publicación","compartida","Error al leer el archivo","giulianafarfalla","pst","you", "septiembre","human","rights","watch","carlos","carlosv","dariolarralde","december","pdt","dario","vela","instagram","the","sociales","parte","ciudad","nov","this","cuenta","redes","primera","vez")


# Corpus y DTM para 2018
corpus_2018_gob <- Corpus(VectorSource(gobierno_2018))
corpus_2018_gob <- tm_map(corpus_2018_gob,removeWords,stopwords("es"))
corpus_2018_gob <- tm_map(corpus_2018_gob,removeWords,palabras_eliminar)
dtm_2018_gob <- DocumentTermMatrix(corpus_2018_gob)
conteo_2018_gob <- colSums(as.matrix(dtm_2018_gob))
inspect(dtm_2018_gob)
## <<DocumentTermMatrix (documents: 7, terms: 1195)>>
## Non-/sparse entries: 1604/6761
## Sparsity           : 81%
## Maximal term length: 23
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs derechos discriminación diversidad género humanos información lgbt puedes
##    1        5              0          1      0       1           2    2      2
##    2        4              9         12      6       4           3    4      2
##    3        3              0          0      1       2           2    2      2
##    4        6              5          0      5       4           2    0      2
##    5        1              0          0      3       0           2    0      2
##    6        0              0          2      0       0           3    1      2
##    7        1              0          1      0       0           2    3      0
##     Terms
## Docs seleccionar turismo
##    1           2       0
##    2           2       0
##    3           2       0
##    4           2       0
##    5           2       0
##    6           2       0
##    7           0      16
# Corpus y DTM para 2019
corpus_2019_gob <- Corpus(VectorSource(gobierno_2019))
corpus_2019_gob <- tm_map(corpus_2019_gob,removeWords,stopwords("es"))
corpus_2019_gob <- tm_map(corpus_2019_gob,removeWords,palabras_eliminar)
dtm_2019_gob <- DocumentTermMatrix(corpus_2019_gob)
conteo_2019_gob <- colSums(as.matrix(dtm_2019_gob))
inspect(dtm_2019_gob)
## <<DocumentTermMatrix (documents: 11, terms: 2946)>>
## Non-/sparse entries: 3919/28487
## Sparsity           : 88%
## Maximal term length: 19
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs andrés derechos día discriminación diversidad información lópez manuel
##   1       0        1   0              0          4           2     0      0
##   10     34       12  19             19          8           4    35     34
##   11      0        7   0              3          1           3     0      0
##   3       0        2   1              0          3           2     0      0
##   4       0        3   0              2          3           2     0      0
##   5       0        1   4              2          7           2     0      0
##   6       0        0   0              2          1           2     0      0
##   7       0        5   1              1          2           2     0      0
##   8       0       15   0              0          2           2     0      0
##   9       0        0   2              1          3           2     0      0
##     Terms
## Docs obrador salud
##   1        0     6
##   10      34    16
##   11       0     3
##   3        0     0
##   4        0     0
##   5        0     1
##   6        0     1
##   7        0     0
##   8        0     1
##   9        0     0
# Corpus y DTM para 2020
corpus_2020_gob <- Corpus(VectorSource(gobierno_2020))
corpus_2020_gob <- tm_map(corpus_2020_gob,removeWords,stopwords("es"))
corpus_2020_gob <- tm_map(corpus_2020_gob,removeWords,palabras_eliminar)
dtm_2020_gob <- DocumentTermMatrix(corpus_2020_gob)
conteo_2020_gob <- colSums(as.matrix(dtm_2020_gob))
inspect(dtm_2020_gob)
## <<DocumentTermMatrix (documents: 8, terms: 1702)>>
## Non-/sparse entries: 2373/11243
## Sparsity           : 83%
## Maximal term length: 32
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs año comunidad día discriminación información junio lgbt secretaría trabajo
##    1   4         3   4              0           2    13    6          3       1
##    2   0         0   2              0           4     2    2          3       0
##    3   0         2   0              0           2     0    1          0       1
##    4   0         4   0              4           2     1    3          0       7
##    5   1         0   1             11           2     0    0          7       2
##    6   0         4   2              0           2     2    2          3       0
##    7   4         0   1              0           2     0    1          2       0
##    8   5         0   2              0           2     0    3          5       5
##     Terms
## Docs turismo
##    1       0
##    2       0
##    3       0
##    4       0
##    5       0
##    6       1
##    7      10
##    8      16
# Corpus y DTM para 2021
corpus_2021_gob <- Corpus(VectorSource(gobierno_2021))
corpus_2021_gob <- tm_map(corpus_2021_gob,removeWords,stopwords("es"))
corpus_2021_gob <- tm_map(corpus_2021_gob,removeWords,palabras_eliminar)
dtm_2021_gob <- DocumentTermMatrix(corpus_2021_gob)
conteo_2021_gob <- colSums(as.matrix(dtm_2021_gob))
inspect(dtm_2021_gob)
## <<DocumentTermMatrix (documents: 4, terms: 923)>>
## Non-/sparse entries: 1132/2560
## Sparsity           : 69%
## Maximal term length: 30
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs comunidad discriminación género identidad lgbtttiqa mayores mujeres
##    1         7              9      9         6        15      23       3
##    2         8              0      9         4         3       0       8
##    3         0              1      4         2         0       0       0
##    4         0             13      4         2         0       0       0
##     Terms
## Docs orientación salud vida
##    1           6     4   11
##    2           1     0    1
##    3           2     1    0
##    4           2    17    0
# Corpus y DTM para 2022
corpus_2022_gob <- Corpus(VectorSource(gobierno_2022))
corpus_2022_gob <- tm_map(corpus_2022_gob,removeWords,stopwords("es"))
corpus_2022_gob <- tm_map(corpus_2022_gob,removeWords,palabras_eliminar)
dtm_2022_gob <- DocumentTermMatrix(corpus_2022_gob)
conteo_2022_gob <- colSums(as.matrix(dtm_2022_gob))
inspect(dtm_2022_gob)
## <<DocumentTermMatrix (documents: 15, terms: 2098)>>
## Non-/sparse entries: 3055/28415
## Sparsity           : 90%
## Maximal term length: 30
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs and calidad cárdenas derechos información nancy puedes secretaría
##   10   0       1        0        6           2     0      2          0
##   11   0       1        0        0           2     0      2          0
##   13   0       2        0        2           2     0      2          3
##   14  16       1        0        0           1     0      0          1
##   15   0       1        0        0           2     0      2          2
##   3    0       1        0        0           2     0      2          3
##   4   13       1        0        0           1     0      0          1
##   6    0       1       28        7           2    20      2          1
##   7    0       1        0        1           2     0      2          2
##   9    1       1        0        2           6     0      2          6
##     Terms
## Docs seleccionar social
##   10           2      9
##   11           2      0
##   13           2      1
##   14           0      1
##   15           2      0
##   3            2      0
##   4            0      0
##   6            2      3
##   7            2      1
##   9            2      6
#Corpus y DTM FINAL

todo_gob <- c(gobierno_2018, gob_2019, gob_2020, gob_2021, gob_2022)
corpus_final_gob <- Corpus(VectorSource(todo_gob))
corpus_final_gob <- tm_map(corpus_final_gob, removeWords, stopwords("es"))
corpus_final_gob <- tm_map(corpus_final_gob, removeWords, palabras_eliminar)
dtm_final_gob <- DocumentTermMatrix(corpus_final_gob)
conteo_final_gob <- colSums(as.matrix(dtm_final_gob))
inspect(dtm_final_gob)
## <<DocumentTermMatrix (documents: 45, terms: 1201)>>
## Non-/sparse entries: 1718/52327
## Sparsity           : 97%
## Maximal term length: 23
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs 2022 derechos discriminación diversidad género gob información lgbt
##   1     0        5              0          1      0   0           2    2
##   10    0        0              0          0      0   1           0    0
##   2     0        4              9         12      6   0           3    4
##   3     0        3              0          0      1   0           2    2
##   4     0        6              5          0      5   0           2    0
##   5     0        1              0          0      3   0           2    0
##   6     0        0              0          2      0   0           3    1
##   7     0        1              0          1      0   0           2    3
##   8     0        0              0          0      0   1           0    0
##   9     0        0              0          0      0   1           0    0
##     Terms
## Docs turismo txt
##   1        0   0
##   10       0   1
##   2        0   0
##   3        0   0
##   4        0   0
##   5        0   0
##   6        0   0
##   7       16   0
##   8        0   1
##   9        0   1

ASOCIACION CIVIL

palabras_eliminar <- c("null", "gtagset", "function", "var", "pagetype", "presidente", "interlocutos", "pues", "aquí","ver","ahora", "también", "muy","ahí","gagobtrackerset","entonces","gracias","además","vamos","mil","bueno","así","versión","estenográfica","gaset","voy","van","conferencia","contentgroup","organizationname","interlocutora","ser","hacer","pagesgroup","señor", "prensa", "puede", "país", "méxico", "diminsión", "millones", "jesús", "ramírez", "luego", "pregunta", "dimension", "tema", "todas", "presidencia","gobierno","bue", "pesos", "caso", "nacional", "ciento", "hace", "sólo", "else", "email", "gobmx", "data", "lang", "properties", "section", "subgroup", "type", "leer", "méxico", "kcmykprocess", "además", "mil", "kcmykprocess", "presidente", "presidente", "sexual", "personas", "puede","farfalla","giuliana","larralde","publicación","compartida","Error al leer el archivo","giulianafarfalla","pst","you", "septiembre","human","rights","watch","carlos","carlosv","dariolarralde","december","pdt","dario","vela","instagram","the","sociales","parte","ciudad","nov","this","cuenta","redes","primera","vez")


# Corpus y DTM para 2018
corpus_2018_ac <- Corpus(VectorSource(ac_2018))
corpus_2018_ac <- tm_map(corpus_2018_ac,removeWords,stopwords("es"))
corpus_2018_ac <- tm_map(corpus_2018_ac,removeWords,palabras_eliminar)
dtm_2018_ac <- DocumentTermMatrix(corpus_2018_ac)
conteo_2018_ac <- colSums(as.matrix(dtm_2018_ac))
inspect(dtm_2018_ac)
## <<DocumentTermMatrix (documents: 10, terms: 1276)>>
## Non-/sparse entries: 2712/10048
## Sparsity           : 79%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs black color content derechos important margin pullright
##   1      3     5       3        3        30      4         4
##   10     3     5       3        5        30      4         4
##   2      3     5       3        4        30      4         4
##   3      3     5       3        1        30      4         4
##   4      3     5       3        1        30      4         4
##   5      3     5       3        4        30      4         4
##   6      3     5       3        9        30      4         4
##   7      3     5       3        2        30      4         4
##   8      3     5       3        1        30      4         4
##   9      3     5       3        3        30      4         4
##     Terms
## Docs socialfeedcontainer socialfeedelement tfbaaccesstoken
##   1                   23                 5               4
##   10                  23                 5               4
##   2                   23                 5               4
##   3                   23                 5               4
##   4                   23                 5               4
##   5                   23                 5               4
##   6                   23                 5               4
##   7                   23                 5               4
##   8                   23                 5               4
##   9                   23                 5               4
# Corpus y DTM para 2019
corpus_2019_ac <- Corpus(VectorSource(ac_2019))
corpus_2019_ac <- tm_map(corpus_2019_ac,removeWords,stopwords("es"))
corpus_2019_ac <- tm_map(corpus_2019_ac,removeWords,palabras_eliminar)
dtm_2019_ac <- DocumentTermMatrix(corpus_2019_ac)
conteo_2019_ac <- colSums(as.matrix(dtm_2019_ac))
inspect(dtm_2019_ac)
## <<DocumentTermMatrix (documents: 14, terms: 1778)>>
## Non-/sparse entries: 3095/21797
## Sparsity           : 88%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs color derechos género identidad important nacimiento nombre
##   11     0        1      2         2         0          5      6
##   12     0        1      1         0         0          4      2
##   13     0        2      8         3         0          0      1
##   14     0        1      9         8         0          3      2
##   2      0       13      7         4         0          3      4
##   3      0        2      3         6         0         10      2
##   6      0        1      2         2         0          0      6
##   7      5        2      1         1        30          0      0
##   8      5        1      1         1        30          0      0
##   9      5        3      1         0        30          0      0
##     Terms
## Docs socialfeedcontainer socialfeedelement trans
##   11                   0                 0     1
##   12                   0                 0     8
##   13                   0                 0    13
##   14                   0                 0     7
##   2                    0                 0     1
##   3                    0                 0     0
##   6                    0                 0    10
##   7                   23                 5     0
##   8                   23                 5     0
##   9                   23                 5     0
# Corpus y DTM para 2020
corpus_2020_ac <- Corpus(VectorSource(ac_2020))
corpus_2020_ac <- tm_map(corpus_2020_ac,removeWords,stopwords("es"))
corpus_2020_ac <- tm_map(corpus_2020_ac,removeWords,palabras_eliminar)
dtm_2020_ac <- DocumentTermMatrix(corpus_2020_ac)
conteo_2020_ac <- colSums(as.matrix(dtm_2020_ac))
inspect(dtm_2020_ac)
## <<DocumentTermMatrix (documents: 18, terms: 2922)>>
## Non-/sparse entries: 5584/47012
## Sparsity           : 89%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs derechos familias género identidad important infancias nombre salud
##   13        3        0      8         8         0         1      1     0
##   14        4        7     17        14         0        14      5     4
##   17        6        5      9        11         0         3      3     1
##   18        1        0     24        12         0         6      1     1
##   2        12        2     11        14         0         6      1     7
##   3         6        1      7         1         0        13      4     0
##   6         2        0      3         3        30         1      3     2
##   7         2        0      3         2        30         0      2     1
##   8         2        0      2         3        30         0      2     1
##   9         6        0      5         5        30         0      2     4
##     Terms
## Docs socialfeedcontainer trans
##   13                   0    13
##   14                   0    15
##   17                   0     4
##   18                   0     5
##   2                    0    27
##   3                    0    23
##   6                   23    15
##   7                   23     0
##   8                   23     0
##   9                   23     0
# Corpus y DTM para 2021
corpus_2021_ac <- Corpus(VectorSource(ac_2021))
corpus_2021_ac <- tm_map(corpus_2021_ac,removeWords,stopwords("es"))
corpus_2021_ac <- tm_map(corpus_2021_ac,removeWords,palabras_eliminar)
dtm_2021_ac <- DocumentTermMatrix(corpus_2021_ac)
conteo_2021_ac <- colSums(as.matrix(dtm_2021_ac))
inspect(dtm_2021_ac)
## <<DocumentTermMatrix (documents: 12, terms: 3469)>>
## Non-/sparse entries: 6371/35257
## Sparsity           : 85%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs color comunidad derechos género identidad important lgbti
##   1      1         0        4     19         7         0     1
##   10     5         9        1      0         0        30     6
##   11     5         2        4      1         0        30     4
##   12     5         1        1      0         0        30     5
##   2      5         2        9      2         0        30     5
##   3      5         4        4      0         0        30     6
##   4      5         7        1      9         5        30     6
##   5      0         1       17     30        37         0     0
##   7      5         5        7      5         0        30     5
##   8      5         5       10      1         0        30     4
##     Terms
## Docs socialfeedcontainer socialfeedelement vida
##   1                    0                 0   10
##   10                  23                 5    3
##   11                  23                 5    4
##   12                  23                 5    9
##   2                   23                 5    1
##   3                   23                 5    3
##   4                   23                 5    3
##   5                    0                 0    4
##   7                   23                 5    6
##   8                   23                 5    1
# Corpus y DTM para 2022
corpus_2022_ac <- Corpus(VectorSource(ac_2022))
corpus_2022_ac <- tm_map(corpus_2022_ac,removeWords,stopwords("es"))
corpus_2022_ac <- tm_map(corpus_2022_ac,removeWords,palabras_eliminar)
dtm_2022_ac <- DocumentTermMatrix(corpus_2022_ac)
conteo_2022_ac <- colSums(as.matrix(dtm_2022_ac))
inspect(dtm_2022_ac)
## <<DocumentTermMatrix (documents: 21, terms: 5669)>>
## Non-/sparse entries: 19866/99183
## Sparsity           : 83%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs aborto important miguel misoprostol mujeres salud socialfeedcontainer
##   15      0        30     27           0      29    16                  23
##   16      0        30     27           0      29    16                  23
##   17     47        30     11          98      49    13                  23
##   18     56        30     14          22      10    18                  23
##   19      0        30     21           0       0     7                  23
##   3       0        30     27           0      29    16                  23
##   4       0        30     27           0      29    16                  23
##   5      47        30     11          98      49    13                  23
##   6      56        30     14          22      10    18                  23
##   7       0        30     21           0       0     7                  23
##     Terms
## Docs trans vida vih
##   15    72   17  22
##   16    72   17  22
##   17     0   16   0
##   18     0   12   0
##   19     0    7  28
##   3     72   17  22
##   4     72   17  22
##   5      0   16   0
##   6      0   12   0
##   7      0    7  28
todo_ac <- c(ac_2018, ac_2019, ac_2020, ac_2021, ac_2022)
corpus_final_ac <- Corpus(VectorSource(todo_ac))
corpus_final_ac <- tm_map(corpus_final_ac, removeWords, stopwords("es"))
corpus_final_ac <- tm_map(corpus_final_ac, removeWords, palabras_eliminar)
dtm_final_ac <- DocumentTermMatrix(corpus_final_ac)
conteo_final_ac <- colSums(as.matrix(dtm_final_ac))
inspect(dtm_final_ac)
## <<DocumentTermMatrix (documents: 75, terms: 9532)>>
## Non-/sparse entries: 37628/677272
## Sparsity           : 95%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs color derechos género important miguel mujeres socialfeedcontainer
##   57     5        6      8        30     27      29                  23
##   58     5        6      8        30     27      29                  23
##   59     5       10      1        30     11      49                  23
##   60     5        4      2        30     14      10                  23
##   61     5        5      1        30     21       0                  23
##   69     5        6      8        30     27      29                  23
##   70     5        6      8        30     27      29                  23
##   71     5       10      1        30     11      49                  23
##   72     5        4      2        30     14      10                  23
##   73     5        5      1        30     21       0                  23
##     Terms
## Docs socialfeedelement trans vida
##   57                 5    72   17
##   58                 5    72   17
##   59                 5     0   16
##   60                 5     0   12
##   61                 5     0    7
##   69                 5    72   17
##   70                 5    72   17
##   71                 5     0   16
##   72                 5     0   12
##   73                 5     0    7

CREACION DE MATRIZ CONJUNTA DE TODAS LAS FUENTES

La siguiente parte del codigo se asegura de crear un corpus central, juntando las 3 fuentes.

# Function to pad the matrix with zeros
pad_matrix <- function(mat, target_cols) {
  if (ncol(mat) < target_cols) {
    diff_cols <- target_cols - ncol(mat)
    mat <- cbind(mat, matrix(0, nrow = nrow(mat), ncol = diff_cols))
  }
  return(mat)
}

# Set the target number of columns (use the maximum number of columns among DTMs)
target_cols <- max(ncol(dtm_2018), ncol(dtm_2018_gob), ncol(dtm_2018_ac),
                   ncol(dtm_2019), ncol(dtm_2019_gob), ncol(dtm_2019_ac),
                   ncol(dtm_2020), ncol(dtm_2020_gob), ncol(dtm_2020_ac),
                   ncol(dtm_2021), ncol(dtm_2021_gob), ncol(dtm_2021_ac),
                   ncol(dtm_2022), ncol(dtm_2022_gob), ncol(dtm_2022_ac))


padded_dtm_2018 <- pad_matrix(as.matrix(dtm_2018), target_cols)
padded_dtm_2018_gob <- pad_matrix(as.matrix(dtm_2018_gob), target_cols)
padded_dtm_2018_ac <- pad_matrix(as.matrix(dtm_2018_ac), target_cols)

padded_dtm_2019 <- pad_matrix(as.matrix(dtm_2019), target_cols)
padded_dtm_2019_gob <- pad_matrix(as.matrix(dtm_2019_gob), target_cols)
padded_dtm_2019_ac <- pad_matrix(as.matrix(dtm_2019_ac), target_cols)

padded_dtm_2020 <- pad_matrix(as.matrix(dtm_2020), target_cols)
padded_dtm_2020_gob <- pad_matrix(as.matrix(dtm_2020_gob), target_cols)
padded_dtm_2020_ac <- pad_matrix(as.matrix(dtm_2020_ac), target_cols)

padded_dtm_2021 <- pad_matrix(as.matrix(dtm_2021), target_cols)
padded_dtm_2021_gob <- pad_matrix(as.matrix(dtm_2021_gob), target_cols)
padded_dtm_2021_ac <- pad_matrix(as.matrix(dtm_2021_ac), target_cols)

padded_dtm_2022 <- pad_matrix(as.matrix(dtm_2022), target_cols)
padded_dtm_2022_gob <- pad_matrix(as.matrix(dtm_2022_gob), target_cols)
padded_dtm_2022_ac <- pad_matrix(as.matrix(dtm_2022_ac), target_cols)

dtm_combined_2018 <- rbind(padded_dtm_2018, padded_dtm_2018_gob, padded_dtm_2018_ac)
dtm_combined_2019 <- rbind(padded_dtm_2019, padded_dtm_2019_gob, padded_dtm_2019_ac)
dtm_combined_2020 <- rbind(padded_dtm_2020, padded_dtm_2020_gob, padded_dtm_2020_ac)
dtm_combined_2021 <- rbind(padded_dtm_2021, padded_dtm_2021_gob, padded_dtm_2021_ac)
dtm_combined_2022 <- rbind(padded_dtm_2022, padded_dtm_2022_gob, padded_dtm_2022_ac)

conteo_combined_2018 <- colSums(dtm_combined_2018)
conteo_combined_2019 <- colSums(dtm_combined_2019)
conteo_combined_2020 <- colSums(dtm_combined_2020)
conteo_combined_2021 <- colSums(dtm_combined_2021)
conteo_combined_2022 <- colSums(dtm_combined_2022)

dtm_combined_all_years <- rbind(dtm_combined_2018, dtm_combined_2019, dtm_combined_2020, dtm_combined_2021, dtm_combined_2022)

conteo_todo <- colSums(dtm_combined_all_years)
Visualizaciones

DICCIONARIO DE PALABRAS

Creamos dos diccionarios de palabras para identificar adecuadamente los terminos que pueden diferenciar palabras de identidad

# Definir diccionarios
diccionario_identidad <- list( 
  transgenero = c( "transgenero","mujer trans", "hombre trans", "trans no binario","transgeneros","transgénero","transgéneros"),
  transexual = c("transexual","transexuales"),
  no_binario = c( "demigenero", "pangenero", "bigenero", "trigenero", "poligenero", "intergenero", "agenero", "maverique","no binario","fluido","demigénero","pangénero","bigénero","trigénero","poligénero")
)

diccionario_orientacion <- list(
  lesbiana = c("lesbianas", "lesbiana","lesbiandad"),
  gay = c("gays", "gay", "homosexual", "homosexuales", "homos","homosexualidad"),
  bisexual = c("bi", "bisexual", "bisexuales", "bisexualidad", "omnisexual", "polisexual"),
  pansexual = c("pansexual", "pansexuales","pansexualidad"),
  asexual = c("asexualidad","asexual")
)
VISUALIZACIONES.

Comparacion de investigacion.

La siguiente visualizacin compara la repeticion de los idccionarios en un lapso de 5 años.

library(ggplot2)
# Filtrar palabras de conteo_final por categoría
palabras_identidad <- names(conteo_final_ac)[names(conteo_final_ac) %in% unlist(diccionario_identidad)]
palabras_orientacion <- names(conteo_final_ac)[names(conteo_final_ac) %in% unlist(diccionario_orientacion)]

# Sumar frecuencias por categoría
frecuencia_identidad <- sum(conteo_final_ac[palabras_identidad])
frecuencia_orientacion <- sum(conteo_final_ac[palabras_orientacion])

# Calcular porcentaje total de cada categoría
porcentaje_identidad <- frecuencia_identidad / sum(c(frecuencia_identidad, frecuencia_orientacion)) * 100
porcentaje_orientacion <- frecuencia_orientacion / sum(c(frecuencia_identidad, frecuencia_orientacion)) * 100

# Crear un data frame con los porcentajes totales para cada categoría
df_porcentaje <- data.frame(Categoria = c("Identidad", "Orientacion"),
                            Porcentaje = c(porcentaje_identidad, porcentaje_orientacion))

# Crear un gráfico de barras para los porcentajes con eje y hasta 100
library(ggplot2)
ggplot(df_porcentaje, aes(x = Categoria, y = Porcentaje, fill = Categoria)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(Porcentaje), "%")), vjust = -0.5, color = "black", size = 4) +  # Agregar etiquetas con los porcentajes
  labs(title = "Variables de Identidad y Orientación en 5 años", x = "Diccionario", y = "Porcentaje ") +
  theme_minimal() +
  scale_fill_manual(values = c("#3498db", "#FF6384")) +
  coord_cartesian(ylim = c(0, 100))  # Establecer el rango del eje y

Frecuencia de diccionario identidad (separado por noticias, gobierno y ac en %)

La siguiente grafica muestra una comparacion desagregada de las variabes y su comparacion de diccionarios.

palabras_identidad_noticias <- names(conteo_final)[names(conteo_final) %in% unlist(diccionario_identidad)]
palabras_orientacion_noticias <- names(conteo_final)[names(conteo_final) %in% unlist(diccionario_orientacion)]

palabras_identidad_gobierno <- names(conteo_final_gob)[names(conteo_final_gob) %in% unlist(diccionario_identidad)]
palabras_orientacion_gobierno <- names(conteo_final_gob)[names(conteo_final_gob) %in% unlist(diccionario_orientacion)]

palabras_identidad_ac <- names(conteo_final_ac)[names(conteo_final_ac) %in% unlist(diccionario_identidad)]
palabras_orientacion_ac <- names(conteo_final_ac)[names(conteo_final_ac) %in% unlist(diccionario_orientacion)]

frecuencia_identidad_noticias <- sum(conteo_final[palabras_identidad_noticias])
frecuencia_orientacion_noticias <- sum(conteo_final[palabras_orientacion_noticias])

frecuencia_identidad_gobierno <- sum(conteo_final_gob[palabras_identidad_gobierno])
frecuencia_orientacion_gobierno <- sum(conteo_final_gob[palabras_orientacion_gobierno])

frecuencia_identidad_ac <- sum(conteo_final_ac[palabras_identidad_ac])
frecuencia_orientacion_ac <- sum(conteo_final_ac[palabras_orientacion_ac])

# PORCENTAJES
porcentaje_identidad_noticias <- frecuencia_identidad_noticias / (frecuencia_identidad_noticias + frecuencia_orientacion_noticias) * 100
porcentaje_orientacion_noticias <- frecuencia_orientacion_noticias / (frecuencia_identidad_noticias + frecuencia_orientacion_noticias) * 100
porcentaje_identidad_gobierno <- frecuencia_identidad_gobierno / (frecuencia_identidad_gobierno + frecuencia_orientacion_gobierno) * 100
porcentaje_orientacion_gobierno <- frecuencia_orientacion_gobierno / (frecuencia_identidad_gobierno + frecuencia_orientacion_gobierno) * 100
porcentaje_identidad_ac <- frecuencia_identidad_ac / (frecuencia_identidad_ac + frecuencia_orientacion_ac) * 100
porcentaje_orientacion_ac <- frecuencia_orientacion_ac / (frecuencia_identidad_ac + frecuencia_orientacion_ac) * 100


df_porcentaje <- data.frame(
  Categoria = rep(c("Noticias", "Gobierno", "Asociación Civil"), each = 2),
  Tipo = rep(c("Identidad", "Orientacion"), times = 3),
  Porcentaje = c(
    porcentaje_identidad_noticias, porcentaje_orientacion_noticias,
    porcentaje_identidad_gobierno, porcentaje_orientacion_gobierno,
    porcentaje_identidad_ac, porcentaje_orientacion_ac
  )
)

# Crear un gráfico de barras para los porcentajes con eje y hasta 100
ggplot(df_porcentaje, aes(x = Categoria, y = Porcentaje, fill = Tipo)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = paste0(round(Porcentaje), "%")), vjust = -0.5, color = "black", size = 4, position = position_dodge(width = 0.9)) +
  labs(title = "Variables de Identidad y Orientación en 5 años", x = "", y = "") +
  theme_minimal() +
  scale_fill_manual(values = c("#3498db", "#FF6384")) +
  coord_cartesian(ylim = c(0, 100))  # Establecer el rango del eje y

IDENTIDAD

La siguiente grafica es una comparación de las variables dentro del diccionario de identidad y su comparativa en las tres fuentes de informacion.

# ... (código anterior)

# NOTICIAS
palabras_transgenero_noticias <- names(conteo_combined_2018[diccionario_identidad$transgenero])
palabras_transgenero_noticias <- palabras_transgenero_noticias[palabras_transgenero_noticias %in% names(conteo_combined_2018)]
palabras_transexual_noticias <- names(conteo_combined_2018[diccionario_identidad$transexual])
palabras_transexual_noticias <- palabras_transexual_noticias[palabras_transexual_noticias %in% names(conteo_combined_2018)]
palabras_no_binario_noticias <- names(conteo_combined_2018[diccionario_identidad$no_binario])
palabras_no_binario_noticias <- palabras_no_binario_noticias[palabras_no_binario_noticias %in% names(conteo_combined_2018)]

# GOBIERNO
palabras_transgenero_gobierno <- names(conteo_combined_2019[diccionario_identidad$transgenero])
palabras_transgenero_gobierno <- palabras_transgenero_gobierno[palabras_transgenero_gobierno %in% names(conteo_combined_2019)]
palabras_transexual_gobierno <- names(conteo_combined_2019[diccionario_identidad$transexual])
palabras_transexual_gobierno <- palabras_transexual_gobierno[palabras_transexual_gobierno %in% names(conteo_combined_2019)]
palabras_no_binario_gobierno <- names(conteo_combined_2019[diccionario_identidad$no_binario])
palabras_no_binario_gobierno <- palabras_no_binario_gobierno[palabras_no_binario_gobierno %in% names(conteo_combined_2019)]

# AC
palabras_transgenero_ac <- names(conteo_combined_2020[diccionario_identidad$transgenero])
palabras_transgenero_ac <- palabras_transgenero_ac[palabras_transgenero_ac %in% names(conteo_combined_2020)]
palabras_transexual_ac <- names(conteo_combined_2020[diccionario_identidad$transexual])
palabras_transexual_ac <- palabras_transexual_ac[palabras_transexual_ac %in% names(conteo_combined_2020)]
palabras_no_binario_ac <- names(conteo_combined_2020[diccionario_identidad$no_binario])
palabras_no_binario_ac <- palabras_no_binario_ac[palabras_no_binario_ac %in% names(conteo_combined_2020)]

# SUMA
frecuencia_transgenero_noticias <- sum(conteo_combined_2018[palabras_transgenero_noticias])
frecuencia_transexual_noticias <- sum(conteo_combined_2018[palabras_transexual_noticias])
frecuencia_no_binario_noticias <- sum(conteo_combined_2018[palabras_no_binario_noticias])

frecuencia_transgenero_gobierno <- sum(conteo_combined_2019[palabras_transgenero_gobierno])
frecuencia_transexual_gobierno <- sum(conteo_combined_2019[palabras_transexual_gobierno])
frecuencia_no_binario_gobierno <- sum(conteo_combined_2019[palabras_no_binario_gobierno])

frecuencia_transgenero_ac <- sum(conteo_combined_2020[palabras_transgenero_ac])
frecuencia_transexual_ac <- sum(conteo_combined_2020[palabras_transexual_ac])
frecuencia_no_binario_ac <- sum(conteo_combined_2020[palabras_no_binario_ac])

# PORCENTAJES
porcentaje_transgenero_noticias <- frecuencia_transgenero_noticias / (frecuencia_transgenero_noticias + frecuencia_transexual_noticias + frecuencia_no_binario_noticias) * 100
porcentaje_transexual_noticias <- frecuencia_transexual_noticias / (frecuencia_transgenero_noticias + frecuencia_transexual_noticias + frecuencia_no_binario_noticias) * 100
porcentaje_no_binario_noticias <- frecuencia_no_binario_noticias / (frecuencia_transgenero_noticias + frecuencia_transexual_noticias + frecuencia_no_binario_noticias) * 100

porcentaje_transgenero_gobierno <- frecuencia_transgenero_gobierno / (frecuencia_transgenero_gobierno + frecuencia_transexual_gobierno + frecuencia_no_binario_gobierno) * 100
porcentaje_transexual_gobierno <- frecuencia_transexual_gobierno / (frecuencia_transgenero_gobierno + frecuencia_transexual_gobierno + frecuencia_no_binario_gobierno) * 100
porcentaje_no_binario_gobierno <- frecuencia_no_binario_gobierno / (frecuencia_transgenero_gobierno + frecuencia_transexual_gobierno + frecuencia_no_binario_gobierno) * 100

porcentaje_transgenero_ac <- frecuencia_transgenero_ac / (frecuencia_transgenero_ac + frecuencia_transexual_ac + frecuencia_no_binario_ac) * 100
porcentaje_transexual_ac <- frecuencia_transexual_ac / (frecuencia_transgenero_ac + frecuencia_transexual_ac + frecuencia_no_binario_ac) * 100
porcentaje_no_binario_ac <- frecuencia_no_binario_ac / (frecuencia_transgenero_ac + frecuencia_transexual_ac + frecuencia_no_binario_ac) * 100

# DATA FRAME
df_porcentaje <- data.frame(
  Categoria = rep(c("Noticias", "Gobierno", "Asociación Civil"), each = 3),
  Tipo = rep(c("Transgénero", "Transexual", "No Binario"), times = 3),
  Porcentaje = c(
    porcentaje_transgenero_noticias, porcentaje_transexual_noticias, porcentaje_no_binario_noticias,
    porcentaje_transgenero_gobierno, porcentaje_transexual_gobierno, porcentaje_no_binario_gobierno,
    porcentaje_transgenero_ac, porcentaje_transexual_ac, porcentaje_no_binario_ac
  )
)



# Crear un gráfico de barras para los porcentajes con eje y hasta 100
ggplot(df_porcentaje, aes(x = Categoria, y = Porcentaje, fill = Tipo)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = paste0(round(Porcentaje), "%")), vjust = -0.5, color = "black", size = 4, position = position_dodge(width = 0.9)) +
  labs(title = "Identidades de género por categoría",
       x = "",
       y = "") +
  theme_minimal() +
  scale_fill_manual(values = c("#3498db", "#FF6384", "#FFA07A")) +
  coord_cartesian(ylim = c(0, 100))  # Establecer el rango del eje y

IDENTIDAD.

La siguiente grafica es una comparación de las variables dentro del diccionario de orientación y su comparativa en las tres fuentes de informacion.

# ... (código anterior)

# NOTICIAS
palabras_gay_noticias <- names(conteo_combined_2018[diccionario_orientacion$gay])
palabras_gay_noticias <- palabras_gay_noticias[palabras_gay_noticias %in% names(conteo_combined_2018)]
palabras_lesbiana_noticias <- names(conteo_combined_2018[diccionario_orientacion$lesbiana])
palabras_lesbiana_noticias <- palabras_lesbiana_noticias[palabras_lesbiana_noticias %in% names(conteo_combined_2018)]
palabras_bisexual_noticias <- names(conteo_combined_2018[diccionario_orientacion$bisexual])
palabras_bisexual_noticias <- palabras_bisexual_noticias[palabras_bisexual_noticias %in% names(conteo_combined_2018)]
palabras_pansexual_noticias <- names(conteo_combined_2018[diccionario_orientacion$pansexual])
palabras_pansexual_noticias <- palabras_pansexual_noticias[palabras_pansexual_noticias %in% names(conteo_combined_2018)]
palabras_asexual_noticias <- names(conteo_combined_2018[diccionario_orientacion$asexual])
palabras_asexual_noticias <- palabras_asexual_noticias[palabras_asexual_noticias %in% names(conteo_combined_2018)]

# GOBIERNO
palabras_gay_gobierno <- names(conteo_combined_2019[diccionario_orientacion$gay])
palabras_gay_gobierno <- palabras_gay_gobierno[palabras_gay_gobierno %in% names(conteo_combined_2019)]
palabras_lesbiana_gobierno <- names(conteo_combined_2019[diccionario_orientacion$lesbiana])
palabras_lesbiana_gobierno <- palabras_lesbiana_gobierno[palabras_lesbiana_gobierno %in% names(conteo_combined_2019)]
palabras_bisexual_gobierno <- names(conteo_combined_2019[diccionario_orientacion$bisexual])
palabras_bisexual_gobierno <- palabras_bisexual_gobierno[palabras_bisexual_gobierno %in% names(conteo_combined_2019)]
palabras_pansexual_gobierno <- names(conteo_combined_2019[diccionario_orientacion$pansexual])
palabras_pansexual_gobierno <- palabras_pansexual_gobierno[palabras_pansexual_gobierno %in% names(conteo_combined_2019)]
palabras_asexual_gobierno <- names(conteo_combined_2019[diccionario_orientacion$asexual])
palabras_asexual_gobierno <- palabras_asexual_gobierno[palabras_asexual_gobierno %in% names(conteo_combined_2019)]

# AC
palabras_gay_ac <- names(conteo_combined_2020[diccionario_orientacion$gay])
palabras_gay_ac <- palabras_gay_ac[palabras_gay_ac %in% names(conteo_combined_2020)]
palabras_lesbiana_ac <- names(conteo_combined_2020[diccionario_orientacion$lesbiana])
palabras_lesbiana_ac <- palabras_lesbiana_ac[palabras_lesbiana_ac %in% names(conteo_combined_2020)]
palabras_bisexual_ac <- names(conteo_combined_2020[diccionario_orientacion$bisexual])
palabras_bisexual_ac <- palabras_bisexual_ac[palabras_bisexual_ac %in% names(conteo_combined_2020)]
palabras_pansexual_ac <- names(conteo_combined_2020[diccionario_orientacion$pansexual])
palabras_pansexual_ac <- palabras_pansexual_ac[palabras_pansexual_ac %in% names(conteo_combined_2020)]
palabras_asexual_ac <- names(conteo_combined_2020[diccionario_orientacion$asexual])
palabras_asexual_ac <- palabras_asexual_ac[palabras_asexual_ac %in% names(conteo_combined_2020)]

# SUMA
frecuencia_gay_noticias <- sum(conteo_combined_2018[palabras_gay_noticias])
frecuencia_lesbiana_noticias <- sum(conteo_combined_2018[palabras_lesbiana_noticias])
frecuencia_bisexual_noticias <- sum(conteo_combined_2018[palabras_bisexual_noticias])
frecuencia_pansexual_noticias <- sum(conteo_combined_2018[palabras_pansexual_noticias])
frecuencia_asexual_noticias <- sum(conteo_combined_2018[palabras_asexual_noticias])

frecuencia_gay_gobierno <- sum(conteo_combined_2019[palabras_gay_gobierno])
frecuencia_lesbiana_gobierno <- sum(conteo_combined_2019[palabras_lesbiana_gobierno])
frecuencia_bisexual_gobierno <- sum(conteo_combined_2019[palabras_bisexual_gobierno])
frecuencia_pansexual_gobierno <- sum(conteo_combined_2019[palabras_pansexual_gobierno])
frecuencia_asexual_gobierno <- sum(conteo_combined_2019[palabras_asexual_gobierno])

frecuencia_gay_ac <- sum(conteo_combined_2020[palabras_gay_ac])
frecuencia_lesbiana_ac <- sum(conteo_combined_2020[palabras_lesbiana_ac])
frecuencia_bisexual_ac <- sum(conteo_combined_2020[palabras_bisexual_ac])
frecuencia_pansexual_ac <- sum(conteo_combined_2020[palabras_pansexual_ac])
frecuencia_asexual_ac <- sum(conteo_combined_2020[palabras_asexual_ac])

# PORCENTAJES
porcentaje_gay_noticias <- frecuencia_gay_noticias / (frecuencia_gay_noticias + frecuencia_lesbiana_noticias + frecuencia_bisexual_noticias + frecuencia_pansexual_noticias + frecuencia_asexual_noticias) * 100
porcentaje_lesbiana_noticias <- frecuencia_lesbiana_noticias / (frecuencia_gay_noticias + frecuencia_lesbiana_noticias + frecuencia_bisexual_noticias + frecuencia_pansexual_noticias + frecuencia_asexual_noticias) * 100
porcentaje_bisexual_noticias <- frecuencia_bisexual_noticias / (frecuencia_gay_noticias + frecuencia_lesbiana_noticias + frecuencia_bisexual_noticias + frecuencia_pansexual_noticias + frecuencia_asexual_noticias) * 100
porcentaje_pansexual_noticias <- frecuencia_pansexual_noticias / (frecuencia_gay_noticias + frecuencia_lesbiana_noticias + frecuencia_bisexual_noticias + frecuencia_pansexual_noticias + frecuencia_asexual_noticias) * 100
porcentaje_asexual_noticias <- frecuencia_asexual_noticias / (frecuencia_gay_noticias + frecuencia_lesbiana_noticias + frecuencia_bisexual_noticias + frecuencia_pansexual_noticias + frecuencia_asexual_noticias) * 100

porcentaje_gay_gobierno <- frecuencia_gay_gobierno / (frecuencia_gay_gobierno + frecuencia_lesbiana_gobierno + frecuencia_bisexual_gobierno + frecuencia_pansexual_gobierno + frecuencia_asexual_gobierno) * 100
porcentaje_lesbiana_gobierno <- frecuencia_lesbiana_gobierno / (frecuencia_gay_gobierno + frecuencia_lesbiana_gobierno + frecuencia_bisexual_gobierno + frecuencia_pansexual_gobierno + frecuencia_asexual_gobierno) * 100
porcentaje_bisexual_gobierno <- frecuencia_bisexual_gobierno / (frecuencia_gay_gobierno + frecuencia_lesbiana_gobierno + frecuencia_bisexual_gobierno + frecuencia_pansexual_gobierno + frecuencia_asexual_gobierno) * 100
porcentaje_pansexual_gobierno <- frecuencia_pansexual_gobierno / (frecuencia_gay_gobierno + frecuencia_lesbiana_gobierno + frecuencia_bisexual_gobierno + frecuencia_pansexual_gobierno + frecuencia_asexual_gobierno) * 100
porcentaje_asexual_gobierno <- frecuencia_asexual_gobierno / (frecuencia_gay_gobierno + frecuencia_lesbiana_gobierno + frecuencia_bisexual_gobierno + frecuencia_pansexual_gobierno + frecuencia_asexual_gobierno) * 100

porcentaje_gay_ac <- frecuencia_gay_ac / (frecuencia_gay_ac + frecuencia_lesbiana_ac + frecuencia_bisexual_ac + frecuencia_pansexual_ac + frecuencia_asexual_ac) * 100
porcentaje_lesbiana_ac <- frecuencia_lesbiana_ac / (frecuencia_gay_ac + frecuencia_lesbiana_ac + frecuencia_bisexual_ac + frecuencia_pansexual_ac + frecuencia_asexual_ac) * 100
porcentaje_bisexual_ac <- frecuencia_bisexual_ac / (frecuencia_gay_ac + frecuencia_lesbiana_ac + frecuencia_bisexual_ac + frecuencia_pansexual_ac + frecuencia_asexual_ac) * 100
porcentaje_pansexual_ac <- frecuencia_pansexual_ac / (frecuencia_gay_ac + frecuencia_lesbiana_ac + frecuencia_bisexual_ac + frecuencia_pansexual_ac + frecuencia_asexual_ac) * 100
porcentaje_asexual_ac <- frecuencia_asexual_ac / (frecuencia_gay_ac + frecuencia_lesbiana_ac + frecuencia_bisexual_ac + frecuencia_pansexual_ac + frecuencia_asexual_ac) * 100

# DATA FRAME
df_porcentaje_orientacion <- data.frame(
  Categoria = rep(c("Noticias", "Gobierno", "Asociación Civil"), each = 5),
  Tipo = rep(c("Gay", "Lesbiana", "Bisexual", "Pansexual", "Asexual"), times = 3),
  Porcentaje = c(
    porcentaje_gay_noticias, porcentaje_lesbiana_noticias, porcentaje_bisexual_noticias, porcentaje_pansexual_noticias, porcentaje_asexual_noticias,
    porcentaje_gay_gobierno, porcentaje_lesbiana_gobierno, porcentaje_bisexual_gobierno, porcentaje_pansexual_gobierno, porcentaje_asexual_gobierno,
    porcentaje_gay_ac, porcentaje_lesbiana_ac, porcentaje_bisexual_ac, porcentaje_pansexual_ac, porcentaje_asexual_ac
  )
)

# Crear un gráfico de barras para los porcentajes con eje y hasta 100
ggplot(df_porcentaje_orientacion, aes(x = Categoria, y = Porcentaje, fill = Tipo)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = paste0(round(Porcentaje), "%")), vjust = -0.5, color = "black", size = 4, position = position_dodge(width = 0.9)) +
  labs(title = "Distribución de Identidades de Orientación por Categoría", x = "", y = "") +
  theme_minimal() +
  scale_fill_manual(values = c("#3498db", "#FF6384", "#FFA07A", "#FFD700", "#C71585")) +
  coord_cartesian(ylim = c(0, 100))  # Establecer el rango del eje y

WORDCLOUD TODOS LOS AÑOS

# Obtener las 35 palabras más repetidas de cada variable
top_words_final <- head(sort(conteo_final, decreasing = TRUE), 35)
top_words_final_ac <- head(sort(conteo_final_ac, decreasing = TRUE), 35)
top_words_final_gob <- head(sort(conteo_final_gob, decreasing = TRUE), 35)

# Combinar las tres listas de palabras
all_top_words <- unique(c(names(top_words_final), names(top_words_final_ac), names(top_words_final_gob)))

# Seleccionar las frecuencias correspondientes a las palabras seleccionadas
freq_final <- conteo_final[all_top_words]
freq_final_ac <- conteo_final_ac[all_top_words]
freq_final_gob <- conteo_final_gob[all_top_words]

# Sumar las frecuencias de las tres variables
freq_combined <- freq_final + freq_final_ac + freq_final_gob

# Eliminar posibles valores NA
freq_combined <- freq_combined[!is.na(freq_combined)]

# Verificar si hay frecuencias para evitar el error
if (length(freq_combined) > 0) {
  # Instalar y cargar bibliotecas necesarias
  library(wordcloud)

  # Crear el Word Cloud
  wordcloud(words = names(freq_combined), freq = freq_combined, scale = c(3, 0.5), colors = brewer.pal(8, "Dark2"))
} else {
  print("No hay suficientes datos para crear el Word Cloud.")
}

GRAFICO 10 PALABRAS MAS MENCIONADAS EN 5 AÑOS

palabras mencionadas en noticias.

library(ggplot2)

# Obtener las 10 palabras más comunes
top_10_terminos <- head(sort(conteo_final, decreasing = TRUE), 10)

# Crear un data frame con los datos
data_top_10 <- data.frame(termino = names(top_10_terminos), repeticiones = top_10_terminos)

# Ordenar el data frame de mayor a menor
data_top_10$termino <- factor(data_top_10$termino, levels = data_top_10$termino[order(data_top_10$repeticiones, decreasing = TRUE)])

# Verificar si hay suficientes datos para graficar
if (nrow(data_top_10) > 1) {
  # Crear un gráfico de barras horizontal con colores más suaves y etiquetas de repeticiones
  ggplot(data_top_10, aes(x = repeticiones, y = termino, fill = termino)) +
    geom_bar(stat = "identity") +
    labs(title = "Top 10 Palabras Más Repetidas Noticias (2018-2022)",
         x = "  ",
         y = "") +
    theme_minimal() +
    scale_fill_manual(values = c("#FFB14E", "#FF6384", "#4CAF50", "#3498db", "#9b59b6", "#FFD700", "#FF69B4", "#00CED1", "#FF4500", "#ADFF2F",
  "#FFA07A", "#87CEEB", "#FF6347", "#20B2AA", "#DDA0DD", "#FF8C00", "#8A2BE2", "#32CD32", "#FF00FF", "#00FF7F")
, name = "Palabra") +
    coord_cartesian(xlim = c(0, max(data_top_10$repeticiones) + 10))  # Establecer el rango del eje x
} else {
  print("No hay suficientes datos para graficar.")
}

gobierno

palabras mencionadas en gobierno

library(ggplot2)

# Obtener las 10 palabras más comunes
top_10_terminos <- head(sort(conteo_final_gob, decreasing = TRUE), 10)

# Crear un data frame con los datos
data_top_10 <- data.frame(termino = names(top_10_terminos), repeticiones = top_10_terminos)

# Ordenar el data frame de mayor a menor
data_top_10$termino <- factor(data_top_10$termino, levels = data_top_10$termino[order(data_top_10$repeticiones, decreasing = TRUE)])

# Verificar si hay suficientes datos para graficar
if (nrow(data_top_10) > 1) {
  # Crear un gráfico de barras horizontal con colores más suaves y etiquetas de repeticiones
  ggplot(data_top_10, aes(x = repeticiones, y = termino, fill = termino)) +
    geom_bar(stat = "identity") +
    labs(title = "Top 10 Palabras Más Repetidas Gobierno (2018-2022)",
         x = "  ",
         y = "") +
    theme_minimal() +
    scale_fill_manual(values = c("#FFB14E", "#FF6384", "#4CAF50", "#3498db", "#9b59b6", "#FFD700", "#FF69B4", "#00CED1", "#FF4500", "#ADFF2F",
  "#FFA07A", "#87CEEB", "#FF6347", "#20B2AA", "#DDA0DD", "#FF8C00", "#8A2BE2", "#32CD32", "#FF00FF", "#00FF7F")
, name = "Palabra") +
    coord_cartesian(xlim = c(0, max(data_top_10$repeticiones) + 10))  # Establecer el rango del eje x
} else {
  print("No hay suficientes datos para graficar.")
}

gobierno

palabras mencionadas en gobierno

library(ggplot2)

# Obtener las 10 palabras más comunes
top_10_terminos <- head(sort(conteo_final_ac, decreasing = TRUE), 10)

# Crear un data frame con los datos
data_top_10 <- data.frame(termino = names(top_10_terminos), repeticiones = top_10_terminos)

# Ordenar el data frame de mayor a menor
data_top_10$termino <- factor(data_top_10$termino, levels = data_top_10$termino[order(data_top_10$repeticiones, decreasing = TRUE)])

# Verificar si hay suficientes datos para graficar
if (nrow(data_top_10) > 1) {
  # Crear un gráfico de barras horizontal con colores más suaves y etiquetas de repeticiones
  ggplot(data_top_10, aes(x = repeticiones, y = termino, fill = termino)) +
    geom_bar(stat = "identity") +
    labs(title = "Top 10 Palabras Más Repetidas AC (2018-2022)",
         x = "  ",
         y = "") +
    theme_minimal() +
    scale_fill_manual(values = c("#FFB14E", "#FF6384", "#4CAF50", "#3498db", "#9b59b6", "#FFD700", "#FF69B4", "#00CED1", "#FF4500", "#ADFF2F",
  "#FFA07A", "#87CEEB", "#FF6347", "#20B2AA", "#DDA0DD", "#FF8C00", "#8A2BE2", "#32CD32", "#FF00FF", "#00FF7F")
, name = "Palabra") +
    coord_cartesian(xlim = c(0, max(data_top_10$repeticiones) + 10))  # Establecer el rango del eje x
} else {
  print("No hay suficientes datos para graficar.")
}

library(ggplot2)

# Obtener las 10 palabras más comunes
top_10_terminos <- head(sort(conteo_final_ac, decreasing = TRUE), 10)

# Crear un data frame con los datos
data_top_10 <- data.frame(termino = names(top_10_terminos), repeticiones = top_10_terminos)

# Ordenar el data frame de mayor a menor
data_top_10$termino <- factor(data_top_10$termino, levels = data_top_10$termino[order(data_top_10$repeticiones, decreasing = TRUE)])

# Verificar si hay suficientes datos para graficar
if (nrow(data_top_10) > 1) {
  # Crear un gráfico de barras horizontal con colores más suaves y etiquetas de repeticiones
  ggplot(data_top_10, aes(x = repeticiones, y = termino, fill = termino)) +
    geom_bar(stat = "identity") +
    labs(title = "Top 10 Palabras Más Repetidas Asociacion civil (2018-2022)",
         x = "  ",
         y = "") +
    theme_minimal() +
    scale_fill_manual(values = c("#FFB14E", "#FF6384", "#4CAF50", "#3498db", "#9b59b6", "#FFD700", "#FF69B4", "#00CED1", "#FF4500", "#ADFF2F",
  "#FFA07A", "#87CEEB", "#FF6347", "#20B2AA", "#DDA0DD", "#FF8C00", "#8A2BE2", "#32CD32", "#FF00FF", "#00FF7F")
, name = "Palabra") +
    coord_cartesian(xlim = c(0, max(data_top_10$repeticiones) + 10))  # Establecer el rango del eje x
} else {
  print("No hay suficientes datos para graficar.")
}

Sentimientos

library(syuzhet)
## 
## Attaching package: 'syuzhet'
## The following object is masked from 'package:sentimentr':
## 
##     get_sentences
corpus_vector <- unlist(sapply(corpus_final , as.character))

lgbt_sentiment <- data.frame(text = corpus_vector) %>%
  unnest_tokens(word, text) %>%
   inner_join(get_sentiment_dictionary("nrc", language = "spanish")) %>%
  inner_join(get_sentiments("nrc"))%>% # Se especifica que la librería será en español
  count(sentiment)
## Joining with `by = join_by(word)`
## Warning in inner_join(., get_sentiment_dictionary("nrc", language = "spanish")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 3 of `x` matches multiple rows in `y`.
## ℹ Row 978 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
## Joining with `by = join_by(word, sentiment)`
## Tabla con la distribución de sentimientos
lgbt_sentiment
##       sentiment   n
## 1         anger  19
## 2  anticipation 122
## 3       disgust  46
## 4          fear  65
## 5           joy 119
## 6      negative 152
## 7      positive 443
## 8       sadness  77
## 9      surprise  64
## 10        trust 270
nombres_sentimientos <- get_sentiment_dictionary("nrc", language = "spanish")
head(nombres_sentimientos)
##      lang       word sentiment value
## 1 spanish       abba  positive     1
## 2 spanish  capacidad  positive     1
## 3 spanish     citada  positive     1
## 4 spanish   absoluto  positive     1
## 5 spanish absolución  positive     1
## 6 spanish  absorbido  positive     1
color_palette <- c("positive" = "#77DD77", "negative" = "#FF6961", "neutral" = "#B0C4DE",
                    "anticipation" = "#FFD700", "trust" = "#B3EE3A", "anger" = "#FF4500",
                    "fear" = "#9400D3", "surprise" = "#20B2AA", "sadness" = "#696969",
                    "disgust" = "#556B2F", "joy" = "#32CD32", "sadness" = "#696969")

# Etiquetas en español
labels_es <- c("Enojo", "Anticipación", "Disgusto", "Miedo", "Alegría", "Negativo",
               "Positivo", "Tristeza", "Sorpresa", "Confianza")

# Crear una gráfica de barras para visualizar los sentimientos
ggplot(lgbt_sentiment, aes(x = sentiment, y = n, fill = sentiment)) +
  geom_bar(stat = "identity") +
  labs(title = "Sentimientos (NRC) en Noticias LGBTI (2013-2023)",
       x = "", y = "") +
  scale_fill_manual(values = color_palette) +
  scale_x_discrete(labels = labels_es) +  # Cambiar las etiquetas del eje x
  theme_minimal() +
  theme(legend.position = "none")

  theme_minimal()
## List of 97
##  $ line                      :List of 6
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                      :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                      :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                     : NULL
##  $ aspect.ratio              : NULL
##  $ axis.title                : NULL
##  $ axis.title.x              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top          :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom       : NULL
##  $ axis.title.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left         : NULL
##  $ axis.title.y.right        :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top           :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom        : NULL
##  $ axis.text.y               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left          : NULL
##  $ axis.text.y.right         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.ticks.x              : NULL
##  $ axis.ticks.x.top          : NULL
##  $ axis.ticks.x.bottom       : NULL
##  $ axis.ticks.y              : NULL
##  $ axis.ticks.y.left         : NULL
##  $ axis.ticks.y.right        : NULL
##  $ axis.ticks.length         : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x       : NULL
##  $ axis.ticks.length.x.top   : NULL
##  $ axis.ticks.length.x.bottom: NULL
##  $ axis.ticks.length.y       : NULL
##  $ axis.ticks.length.y.left  : NULL
##  $ axis.ticks.length.y.right : NULL
##  $ axis.line                 : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x               : NULL
##  $ axis.line.x.top           : NULL
##  $ axis.line.x.bottom        : NULL
##  $ axis.line.y               : NULL
##  $ axis.line.y.left          : NULL
##  $ axis.line.y.right         : NULL
##  $ legend.background         : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.margin             : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing            : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x          : NULL
##  $ legend.spacing.y          : NULL
##  $ legend.key                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.key.size           : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height         : NULL
##  $ legend.key.width          : NULL
##  $ legend.text               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.align         : NULL
##  $ legend.title              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.align        : NULL
##  $ legend.position           : chr "right"
##  $ legend.direction          : NULL
##  $ legend.justification      : chr "center"
##  $ legend.box                : NULL
##  $ legend.box.just           : NULL
##  $ legend.box.margin         : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background     : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing        : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ panel.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.border              : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.spacing             : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ panel.spacing.x           : NULL
##  $ panel.spacing.y           : NULL
##  $ panel.grid                :List of 6
##   ..$ colour       : chr "grey92"
##   ..$ linewidth    : NULL
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major          : NULL
##  $ panel.grid.minor          :List of 6
##   ..$ colour       : NULL
##   ..$ linewidth    : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major.x        : NULL
##  $ panel.grid.major.y        : NULL
##  $ panel.grid.minor.x        : NULL
##  $ panel.grid.minor.y        : NULL
##  $ panel.ontop               : logi FALSE
##  $ plot.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ plot.title                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.title.position       : chr "panel"
##  $ plot.subtitle             :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : num 1
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 5.5points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption.position     : chr "panel"
##  $ plot.tag                  :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.tag.position         : chr "topleft"
##  $ plot.margin               : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ strip.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ strip.background.x        : NULL
##  $ strip.background.y        : NULL
##  $ strip.clip                : chr "inherit"
##  $ strip.placement           : chr "inside"
##  $ strip.text                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey10"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.x              : NULL
##  $ strip.text.x.bottom       : NULL
##  $ strip.text.x.top          : NULL
##  $ strip.text.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.y.left         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.y.right        : NULL
##  $ strip.switch.pad.grid     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.switch.pad.wrap     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

Modelado Noticias

library(tidytext)

# Corpus y DTM FINAL
todas_las_noticias <- c(noticias_2018, noticias_2019, noticias_2020, noticias_2021, noticias_2022)
corpus_final <- Corpus(VectorSource(todas_las_noticias))
corpus_final <- tm_map(corpus_final, removeWords, stopwords("es"))
corpus_final <- tm_map(corpus_final, removeWords, palabras_eliminar)
dtm_final <- DocumentTermMatrix(corpus_final)

# Convertir la DTM a un data frame con tidytext
dtm_tidy <- tidy(dtm_final)
dtm_tidy <- dtm_tidy %>%
  group_by(document) %>%
  filter(sum(count) > 0)  

# Reconstruir la DTM desde el data frame tidytext
dtm_final <- cast_dtm(dtm_tidy, document, term, count)

conteo_final <- colSums(as.matrix(dtm_final))
inspect(dtm_final)
## <<DocumentTermMatrix (documents: 99, terms: 8755)>>
## Non-/sparse entries: 23340/843405
## Sparsity           : 97%
## Maximal term length: 35
## Weighting          : term frequency (tf)
## Sample             :
##      Terms
## Docs  comunidad derechos discriminación gay género identidad lgbt marcha mundo
##   101         1        4              3   1      7         4   22      0     0
##   11         13        1              2   4      0         0    5      0     2
##   19          2        3              2   8      0         0    2     16     1
##   26         13        0              2   4      0         0    5      0     2
##   31          5        0              0   4      0         0    2      0     5
##   37          0        1              0  10      0         0    0      0     5
##   4           2        3              2   8      0         0    2     16     1
##   45          0        5              0   5      0         0    0     11     5
##   80          0        5              6   0     10        12    2      0     4
##   83          3        7              5   0      2         2    0      0     0
##      Terms
## Docs  trans
##   101     2
##   11      0
##   19      0
##   26      0
##   31      0
##   37      0
##   4       0
##   45      0
##   80      8
##   83      2
# Continuar con el análisis solo si hay documentos con al menos un término
if (nrow(dtm_final) > 0) {
  set.seed(1)
  # Generar un modelo de topic models
  lda_lgbt <- LDA(dtm_final, k = 2)
  # Obtener los términos más importantes de cada tópico
  terms_lgbt <- tidy(lda_lgbt, matrix = "beta") %>%
    group_by(topic) %>%
    top_n(4, wt = beta)

  # Generar el gráfico mejorado con tres tópicos
  ggplot(terms_lgbt, aes(x = reorder(term, -beta), y = beta, fill = factor(topic))) +
    geom_col(show.legend = FALSE) +
    coord_flip() +
    facet_wrap(~topic, ncol = 1, scales = "free") +
    labs(x = "", y = " ") +
    theme_minimal() +
    scale_fill_brewer(palette = "Dark2")
} else {
  warning("Todos los documentos están vacíos después de la limpieza. No se puede realizar el modelado de tópicos.")
}

Modelado Gobierno

library(tidytext)

# Corpus y DTM FINAL

todo_gob <- c(gobierno_2018, gob_2019, gob_2020, gob_2021, gob_2022)
corpus_final_gob <- Corpus(VectorSource(todo_gob))
corpus_final_gob <- tm_map(corpus_final_gob, removeWords, stopwords("es"))
corpus_final_gob <- tm_map(corpus_final_gob, removeWords, palabras_eliminar)
dtm_final_gob <- DocumentTermMatrix(corpus_final_gob)
conteo_final_gob <- colSums(as.matrix(dtm_final_gob))
inspect(dtm_final_gob)
## <<DocumentTermMatrix (documents: 45, terms: 1201)>>
## Non-/sparse entries: 1718/52327
## Sparsity           : 97%
## Maximal term length: 23
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs 2022 derechos discriminación diversidad género gob información lgbt
##   1     0        5              0          1      0   0           2    2
##   10    0        0              0          0      0   1           0    0
##   2     0        4              9         12      6   0           3    4
##   3     0        3              0          0      1   0           2    2
##   4     0        6              5          0      5   0           2    0
##   5     0        1              0          0      3   0           2    0
##   6     0        0              0          2      0   0           3    1
##   7     0        1              0          1      0   0           2    3
##   8     0        0              0          0      0   1           0    0
##   9     0        0              0          0      0   1           0    0
##     Terms
## Docs turismo txt
##   1        0   0
##   10       0   1
##   2        0   0
##   3        0   0
##   4        0   0
##   5        0   0
##   6        0   0
##   7       16   0
##   8        0   1
##   9        0   1
# Convertir la DTM a un data frame con tidytext
dtm_tidy <- tidy(dtm_final_gob)
dtm_tidy <- dtm_tidy %>%
  group_by(document) %>%
  filter(sum(count) > 0)  

# Reconstruir la DTM desde el data frame tidytext
dtm_final_gob <- cast_dtm(dtm_tidy, document, term, count)

conteo_final <- colSums(as.matrix(dtm_final_gob))
inspect(dtm_final_gob)
## <<DocumentTermMatrix (documents: 45, terms: 1201)>>
## Non-/sparse entries: 1718/52327
## Sparsity           : 97%
## Maximal term length: 23
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs 2022 derechos discriminación diversidad género gob información lgbt
##   1     0        5              0          1      0   0           2    2
##   10    0        0              0          0      0   1           0    0
##   2     0        4              9         12      6   0           3    4
##   3     0        3              0          0      1   0           2    2
##   4     0        6              5          0      5   0           2    0
##   5     0        1              0          0      3   0           2    0
##   6     0        0              0          2      0   0           3    1
##   7     0        1              0          1      0   0           2    3
##   8     0        0              0          0      0   1           0    0
##   9     0        0              0          0      0   1           0    0
##     Terms
## Docs turismo txt
##   1        0   0
##   10       0   1
##   2        0   0
##   3        0   0
##   4        0   0
##   5        0   0
##   6        0   0
##   7       16   0
##   8        0   1
##   9        0   1
# Continuar con el análisis solo si hay documentos con al menos un término
if (nrow(dtm_final_gob) > 0) {
  set.seed(1)
  # Generar un modelo de topic models
  lda_lgbt <- LDA(dtm_final_gob, k = 2)
  # Obtener los términos más importantes de cada tópico
  terms_lgbt <- tidy(lda_lgbt, matrix = "beta") %>%
    group_by(topic) %>%
    top_n(4, wt = beta)

  # Generar el gráfico mejorado con tres tópicos
  ggplot(terms_lgbt, aes(x = reorder(term, -beta), y = beta, fill = factor(topic))) +
    geom_col(show.legend = FALSE) +
    coord_flip() +
    facet_wrap(~topic, ncol = 1, scales = "free") +
    labs(x = "", y = " ") +
    theme_minimal() +
    scale_fill_brewer(palette = "Dark2")
} else {
  warning("Todos los documentos están vacíos después de la limpieza. No se puede realizar el modelado de tópicos.")
}

##MODELADO AC

library(tidytext)

todo_ac <- c(ac_2018, ac_2019, ac_2020, ac_2021, ac_2022)
corpus_final_ac <- Corpus(VectorSource(todo_ac))
corpus_final_ac <- tm_map(corpus_final_ac, removeWords, stopwords("es"))
corpus_final_ac <- tm_map(corpus_final_ac, removeWords, palabras_eliminar)
dtm_final_ac <- DocumentTermMatrix(corpus_final_ac)
conteo_final_ac <- colSums(as.matrix(dtm_final_ac))
inspect(dtm_final_ac)
## <<DocumentTermMatrix (documents: 75, terms: 9532)>>
## Non-/sparse entries: 37628/677272
## Sparsity           : 95%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs color derechos género important miguel mujeres socialfeedcontainer
##   57     5        6      8        30     27      29                  23
##   58     5        6      8        30     27      29                  23
##   59     5       10      1        30     11      49                  23
##   60     5        4      2        30     14      10                  23
##   61     5        5      1        30     21       0                  23
##   69     5        6      8        30     27      29                  23
##   70     5        6      8        30     27      29                  23
##   71     5       10      1        30     11      49                  23
##   72     5        4      2        30     14      10                  23
##   73     5        5      1        30     21       0                  23
##     Terms
## Docs socialfeedelement trans vida
##   57                 5    72   17
##   58                 5    72   17
##   59                 5     0   16
##   60                 5     0   12
##   61                 5     0    7
##   69                 5    72   17
##   70                 5    72   17
##   71                 5     0   16
##   72                 5     0   12
##   73                 5     0    7
# Convertir la DTM a un data frame con tidytext
dtm_tidy <- tidy(dtm_final_ac)
dtm_tidy <- dtm_tidy %>%
  group_by(document) %>%
  filter(sum(count) > 0)  

# Reconstruir la DTM desde el data frame tidytext
dtm_final_ac <- cast_dtm(dtm_tidy, document, term, count)

conteo_final <- colSums(as.matrix(dtm_final_ac))
inspect(dtm_final_ac)
## <<DocumentTermMatrix (documents: 75, terms: 9532)>>
## Non-/sparse entries: 37628/677272
## Sparsity           : 95%
## Maximal term length: 44
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs color derechos género important miguel mujeres socialfeedcontainer
##   57     5        6      8        30     27      29                  23
##   58     5        6      8        30     27      29                  23
##   59     5       10      1        30     11      49                  23
##   60     5        4      2        30     14      10                  23
##   61     5        5      1        30     21       0                  23
##   69     5        6      8        30     27      29                  23
##   70     5        6      8        30     27      29                  23
##   71     5       10      1        30     11      49                  23
##   72     5        4      2        30     14      10                  23
##   73     5        5      1        30     21       0                  23
##     Terms
## Docs socialfeedelement trans vida
##   57                 5    72   17
##   58                 5    72   17
##   59                 5     0   16
##   60                 5     0   12
##   61                 5     0    7
##   69                 5    72   17
##   70                 5    72   17
##   71                 5     0   16
##   72                 5     0   12
##   73                 5     0    7
# Continuar con el análisis solo si hay documentos con al menos un término
if (nrow(dtm_final_ac) > 0) {
  set.seed(1)
  # Generar un modelo de topic models
  lda_lgbt <- LDA(dtm_final_ac, k = 2)
  # Obtener los términos más importantes de cada tópico
  terms_lgbt <- tidy(lda_lgbt, matrix = "beta") %>%
    group_by(topic) %>%
    top_n(4, wt = beta)

  # Generar el gráfico mejorado con tres tópicos
  ggplot(terms_lgbt, aes(x = reorder(term, -beta), y = beta, fill = factor(topic))) +
    geom_col(show.legend = FALSE) +
    coord_flip() +
    facet_wrap(~topic, ncol = 1, scales = "free") +
    labs(x = "", y = " ") +
    theme_minimal() +
    scale_fill_brewer(palette = "Dark2")
} else {
  warning("Todos los documentos están vacíos después de la limpieza. No se puede realizar el modelado de tópicos.")
}