En este examen, se espera que apliquen las técnicas de procesamiento de texto aprendidas en el módulo 2 para analizar y visualizar un nuevo conjunto de datos, en este caso serán TODAS las conferencias sobre coronavirus del mes de julio de 2020. Se evaluará la correcta aplicación de las técnicas de preprocesamiento de texto, la calidad y relevancia de las visualizaciones generadas, así como la claridad y coherencia en la documentación y la interpretación de los resultados.

Aquí se te proporcionan 4 días de conferencias ejemplo para que detectes el patrón de links que se usa, pero como sabes, julio tiene 31 días. Conferencia 1 de julio de 2020: https://coronavirus.gob.mx/2020/07/01/conferencia-1-de-julio-2/ Conferencia 2 de julio de 2020: https://coronavirus.gob.mx/2020/07/02/conferencia-2-de-julio-2/ Conferencia 30 de julio de 2020: https://coronavirus.gob.mx/2020/07/30/conferencia-30-de-julio-2/ Conferencia 31 de julio de 2020: https://coronavirus.gob.mx/2020/07/31/conferencia-31-de-julio-2/

Instrucciones:

2. Crea una función que se llame limpiar_texto que realice las siguientes acciones con el texto [20 puntos]:
  • Convierte todas las palabras a minúsculas.
  • Elimina URLs. LISTO
  • Elimina etiquetas HTML. LISTO
  • Remueve todos los signos de puntuación (puntos, comas, comillas, etc.) del texto. LISTO
  • Elimina números. LISTO
  • Elimina espacios extra. LISTO
  • Elimina stopwords en español (LISTO)
  • Devuelva el texto limpio
# Limpieza de archivos existentes en la misma carpeta de destino
archivos.Covid <- list.files(path = carpeta_destino, pattern = "*.txt")

#list.files(pattern = "*.txt"): Lista todos los archivos en el directorio de trabajo actual que tengan la extensión .txt. Estos nombres de archivos se guardan en el vector archivos.

# Función para limpiar el texto
limpiar_texto_covid <- function(archivo.COVID) {
  texto <- readLines(archivo.COVID, warn = FALSE)
  texto <- paste(texto, collapse = " ")
  
  #Eliminar URLs:gsub("http\S+|www\.\S+", "", texto): Usa una expresión regular para encontrar URLs que comiencen con "http" o "www" y las reemplaza con una cadena vacía, esencialmente eliminándolas.
  
  texto <- gsub("http\\S+|www\\.\\S+", "", texto)
  
  # Eliminar etiquetas HTML (si las hubiera): gsub("<.*?>", "", texto): Si hubiera alguna etiqueta HTML en el texto, esta expresión regular las identificaría y las eliminaría.
  
  texto <- gsub("<.*?>", "", texto)
  
  # Eliminar puntuación: gsub("[[:punct:]]", "", texto): Elimina cualquier carácter de puntuación del texto.
  
  texto <- gsub("[[:punct:]]", "", texto)
  
  # Eliminar números: gsub("\d+", "", texto): Elimina cualquier secuencia de números.
  
  texto <- gsub("\\d+", "", texto)
  
  # Eliminar espacios extra: gsub("\s+", " ", texto): Reemplaza cualquier secuencia de espacios (uno o más) con un único espacio.
 
   texto <- gsub("\\s+", " ", texto)
  
  # tolower(texto): Convierte todo el texto a minúsculas para que el análisis y limpieza sean uniformes.
  texto <- tolower(texto)
  return(texto)
  
  # stopwoeds_es: elimina todas las stopwords en español
  stopwords_es <- stopwords("es")

}
# Aplicar la función de limpieza a cada archivo
textos_limpios <- lapply(archivos.Covid, limpiar_texto_covid )
3. Vectorización [10 puntos]:
  • Crea un vector llamado “Texto Limpio” con el conjunto de datos procesado. Es decir, aplica la función anterior a cada uno de las conferencias y únelas en un mismo vector.
# Crear un vector llamado "Texto Limpio"
textos_limpios <- lapply(archivos.Covid, limpiar_texto_covid)

# Combinar los textos limpios en un solo vector
TextoLimpio <- unlist(textos_limpios)
4. Lematización [20 puntos]:
  • Realiza el proceso de lematización del texto limpio utilizando la librería “udpipe”. Para esto debes crear una función que se llame lematizar_texto, misma que con lapply aplicarás después al “Texto Limpio” que creaste en el paso anterior. Deberás guardar estos nuevos textos como “Texto Lematizado” Recuerda que lematizar es el proceso de reducir una palabra a su forma canónica o de diccionario, toma en cuenta el contexto y convierte la palabra a su forma base significativa.
library(udpipe)
# Descarga y carga del modelo de lenguaje en español
ud_model <- udpipe_download_model(language = "spanish", overwrite = FALSE)
ud_model_loaded <- udpipe_load_model(ud_model$file_model)

# Definir una función para lematizar un texto
lematizar_texto <- function(texto) {
  annotation <- udpipe_annotate(ud_model_loaded, x = texto)
  df <- as.data.frame(annotation)
  lemas <- df$lemma
  return(paste(lemas, collapse = " "))
}

# Aplicar la lematización a los textos limpios
textos_lematizados <- lapply(textos_limpios, lematizar_texto)
## Warning in read_connlu(x, is_udpipe_annotation = TRUE, ...): No parsed data in
## x$conllu, returning default empty data.frame. Error message at x$error
## indicates e.g.:

## Warning in read_connlu(x, is_udpipe_annotation = TRUE, ...): No parsed data in
## x$conllu, returning default empty data.frame. Error message at x$error
## indicates e.g.:

## Warning in read_connlu(x, is_udpipe_annotation = TRUE, ...): No parsed data in
## x$conllu, returning default empty data.frame. Error message at x$error
## indicates e.g.:

## Warning in read_connlu(x, is_udpipe_annotation = TRUE, ...): No parsed data in
## x$conllu, returning default empty data.frame. Error message at x$error
## indicates e.g.:
5. Análisis Exploratorio [10 puntos]:
  • Crea el corpus con el texto lematizado
  • Crea la Matriz de Términos de Documento
  • Identifica y lista los 25 términos más frecuentes en el conjunto de datos.
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following object is masked from 'package:httr':
## 
##     content
# Crear un Corpus con los textos lematizados
corpus <- Corpus(VectorSource(textos_lematizados))

#corpus: colección de documentos limpios los vectoriza y a partir de ese se hace matriz

# Crear la matriz de términos de documento
#Documetn Term Matrix
dtm <- DocumentTermMatrix(corpus)

#Ver la Matriz
inspect(dtm)
## <<DocumentTermMatrix (documents: 31, terms: 1230)>>
## Non-/sparse entries: 6525/31605
## Sparsity           : 83%
## Maximal term length: 18
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs con covid él haber más para persona poder que ser
##   1   11    11 19    23   6    6      15    13  22  12
##   16   5     9 22    16  11   10       6     9  18  11
##   17   6    13 19    12   9   12       9    10  23  16
##   18   5    10 16    21  13    8       9     4  12  13
##   2   15    14 28    17   9   12      22    15  35  15
##   22   6    19 16    22   9    7       5     7  13  11
##   29   9    15 22    20  10    9       9     8  15  15
##   3   14    10 15    16   9    8      15    15  23  16
##   4   14    11 18    16  10    8      15    18  28  18
##   9    9     5 14    11  11    7      13     6  16  16
#Crear corpus con textos limpios
#corpus <- Corpus(VectorSource(textos_limpios))

#Documetn Term Matrix
#dtm <- DocumentTermMatrix(corpus)

#Ver la Matriz
#inspect(dtm)
# Sumar las columnas para obtener el conteo total de cada término. Matriz solamente de términos, y con colSums hace un total de cada columna. Suma de cada una de las veces que se dice un término
conteo_total <- colSums(as.matrix(dtm))

# Ordenar y mostrar los términos más comúnes
terminos_comunes <- sort(conteo_total, decreasing = TRUE)
head(terminos_comunes, 25) # Mostrar los 50 términos más comunes
##      él     que   haber     ser persona   covid     más     con    para   poder 
##     456     445     413     318     289     271     253     197     197     180 
##    todo     uno   tener  estado   mucho  méxico    caso     por   estar  seguir 
##     174     165     157     156     142     138     137     133     120     115 
##    casa    este    cada    cama     mil 
##     107     105      96      95      95
6. Visualización [10 puntos]:
  • Crea una nube de palabras con las 150 palabras más frecuentes en el texto lematizado.
library(wordcloud)
## Loading required package: RColorBrewer
# Crear la nube de palabras
# se van a plotear los términos comunes (base) que aparecen más de una vez y máximo 150. 
wordcloud(names(terminos_comunes), terminos_comunes, min.freq = 1, max.words = 150, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(8, "Dark2"))

Quitar las stopwords y palabras especificas no deseadas: No se pudo extraer las stopwords en la fase dos, por ello se creó un nuevo corpus con su propio dtm para poder extraer las palabras no deseadas así como aquellas que podían no ser útiles para el análisis de texto
# eliminar stopwords de nuestro corpus
corpus_limpio <- tm_map(corpus, removeWords, stopwords("es")) #Usar "es" (español) para stopwords en español
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("es")):
## transformation drops documents
# Definir una lista de palabras específicas que deseas eliminar
palabras_a_eliminar <- c("ser","haber","él","que","más", "con", "para","sar","luis","león","cuatro","país","este","por","cada","otro","uno","estado","tener","mil","hacer","mucho","deber","durante","todo","poder","municipio","bajo","tú","diez","domingo","roo","baja","donde","coahuilo","quien","ahora","semana","tuyo","sonoro","bien","pero","porque","hasta","color","poco","sólo","desde","decir","número","casi","seguir","ese","sobre","seguido","sur","entre","medio","entre","parte","california","alguno","minuto","actualmente","normalidadtambién","rojo","naranja","jaliscocovidpor","díasi")

# Eliminar las palabras específicas del corpus
corpus_limpio <- tm_map(corpus, removeWords, palabras_a_eliminar)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, palabras_a_eliminar):
## transformation drops documents
# El resto del código permanece igual
dtm_limpio <- DocumentTermMatrix(corpus_limpio)

# Creamos nuevo dtm
dtm_limpio <- DocumentTermMatrix(corpus_limpio)

#Ver matriz
inspect(dtm_limpio)
## <<DocumentTermMatrix (documents: 31, terms: 1164)>>
## Non-/sparse entries: 5001/31083
## Sparsity           : 86%
## Maximal term length: 18
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs cama casa caso covid epidemia estar méxico nuevo persona salud
##   1     4    4    3    11        3     9      9     6      15     4
##   16    3    4    6     9        4     4      4     3       6     3
##   17    3    5    6    13        2     3      5     3       9     4
##   18    7    3    7    10        4     5      4     3       9     2
##   2     4    7    5    14        4    12     11     3      22     7
##   29    3    4    6    15        3     2      3     3       9     2
##   3     5    5    2    10        4     8      7     6      15     3
##   31    3    3    2     9        2     1      4     3       8     7
##   4     4    5    2    11        3     8      6     7      15     1
##   9     4    4    3     5        4     5      4     4      13     2
# Sumar las columnas para obtener el conteo total de cada término
conteo_total_limpio <- colSums(as.matrix(dtm_limpio))

# Ordenar y mostrar los términos más comúnes
terminos_comunes_limpio <- sort(conteo_total_limpio, decreasing = TRUE)
head(terminos_comunes_limpio, 25)
##    persona      covid     méxico       caso      estar       casa       cama 
##        289        271        138        137        120        107         95 
##      nuevo   epidemia      salud       mano     muerte enfermedad   semáforo 
##         95         88         82         77         75         66         66 
##  confirmar   gobierno    enferma   contagio    ocupado   enfermar     ciudad 
##         62         60         58         57         57         56         55 
##       como    quédate    tabasco  complicar 
##         55         54         51         50

Última WordCloud

# Crear la nube de palabras
# se van a plotear los términos comunes (base) que aparecen más de una vez y máximo 150. 
wordcloud(names(terminos_comunes_limpio), terminos_comunes_limpio, min.freq = 1, max.words = 150, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(8, "Dark2"))

7. Interpretación [10 puntos]:
  • Considerando las fechas, las palabras principales que se aprecian en el texto lematizado, ¿qué interpretación le das a estos resultados obtenidos?

En el análisis presentado, se examinaron las conferencias realizadas durante los 31 días del mes de julio de 2020. Estas conferencias proporcionaban orientación y actualizaciones que la población de México debía seguir para afrontar de manera efectiva la prolongada crisis pandémica que afectó al país durante varios años.

Uno de los puntos destacados de este análisis fue el nombre con el que la comunidad internacional se refirió al virus (cabe mencionar que el número “19” no es visible debido a que, en el proceso de limpieza del texto, se eliminó toda numeración). Además, resulta evidente que este virus tuvo un impacto significativo en la salud de las personas, provocando un elevado número de casos de enfermedad que a menudo resultaron en hospitalizaciones y, en ocasiones, en muertes. Como respuesta a esta situación, el gobierno implementó un sistema de semáforo para regular el contagio del virus. Se recomendó a la población cubrirse la boca al estornudar, quedarse en sus hogares para mantenerse sanos, asimismo, se enfatizó la importancia de lavarse las manos con frecuencia. Además, se le pidió a la población llamar a los servicios de emergencia cuando fuera necesario y acudir a los doctores a hacerse las pruebas.

Con el fin de llevar a cabo un análisis más específico, tomé la decisión de no filtrar los nombres de los estados para poder identificar cuáles de ellos se mencionaron con mayor frecuencia durante las conferencias. Esta información podría ser un indicador de las áreas geográficas en las que el virus estuvo más presente. Cabe destacar que hubo algunas excepciones, como los nombres de estados conformados por dos palabras o que aparecieron con errores de escritura en la base de datos.

La información recopilada se representa en la nube de palabras que se muestra arriba. Teniendo en cuenta las fechas y las palabras clave que se destacan en el texto lematizado, se puede interpretar que durante el mes de julio de 2020, la crisis sanitaria causada por el virus estaba en su punto más álgido, lo que justifica la atención gubernamental y la necesidad de proporcionar orientación continua a la población. Las palabras y conceptos más prominentes en la nube de palabras, como el nombre del virus, las medidas preventivas y los nombres de los estados, reflejan la gravedad de la situación y las acciones tomadas para hacer frente a la pandemia en distintas regiones de México.