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/
Primer paso: Se instalan las librerias que se utilizaran durante todo el proceso.
library(rvest)
library(magrittr)
library(httr)
# Ruta de la carpeta donde se guardaran los archivos seleccionados
carpeta_destino <- "/Users/ahtzirigarcia/Desktop/1 parcial"
Sys.setlocale("LC_TIME","es_ES.UTF-8")
## [1] "es_ES.UTF-8"
# Se localizan las paginas y las fechas seleccionadas
fechas <- seq.Date(as.Date("2020-07-01"), as.Date("2020-07-31"), by="days")
paginas <- c(1:2)
userAgent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
for(fecha in fechas){
for(pagina in paginas){
fecha <- as.Date(fecha, origin = "1970-01-01")
dia <- as.numeric(format(fecha, "%d"))
mes <- format(fecha, "%B")
ano <- format(fecha, "%Y")
if(pagina == 2){
fecha_url <- paste(dia, paste("/conferencia", dia, "de", mes, pagina, sep="-"), sep = "")
}else{
fecha_url <- paste(dia, paste("/conferencia", dia, "de", mes, sep="-"), sep = "")
}
url_covid <- paste("https://coronavirus.gob.mx/2020/07", fecha_url, sep = "/")
# Valida que la página exista
validacion_url <- GET(
url = url_covid,
user_agent(userAgent)
)
# Si la página existe
if(validacion_url$status_code == 200){
web <- read_html(validacion_url)
texto <- web %>%
html_nodes(xpath = '//div[@class="elementor-text-editor elementor-clearfix"]/ul[@class="ul1 leer-esto"]') %>% # <-- reemplaza ".contenido-conferencia" con el selector CSS correcto
html_text()
# Crea el nombre del archivo y lo guarda
nombre_archivo <- paste("conferencia_", ano, "_", sprintf("%02d", dia), "_", mes, ".txt")
writeLines(texto, nombre_archivo)
}
}
}
# 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 )
# 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)
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.:
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
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"))
# 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"))
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.