Este trabajo se centra en realizar un análisis de sentimientos básico en discursos presidenciales de américa latina con el propósito de identificar tendencias y características de interés. En este proceso, también se realizarán algunos análisis sobre legibilidad del texto, preprocesado de texto, dispersión léxica, correlaciones entre discursos y algunos gráficos que nos permitirán visualizar y entender de la mejor manera los resultados obtenidos del análisis. Para realizar este trabajo se usó el software RStudio y se hizo uso esencialmente del paquete “quanteda” que permite realizar análisis cuantitativo de texto desde el preprocesamiento hasta construir gráficos exclusivos para el análisis de texto.
This paper focuses on conducting a basic sentiment analysis in Latin American presidential speeches in order to identify trends and characteristics of interest. In this process, we will also perform some analyses on text readability, text preprocessing, lexical dispersion, correlations between speeches and some graphics that will allow us to visualize and understand in the best way the results obtained from the analysis. The RStudio software was used to carry out this work and essentially the “quanteda” package was used, which allows quantitative text analysis from preprocessing to the construction of exclusive graphics for text analysis.
El Text Mining es una rama específica del análisis de datos que se enfoca en analizar y encontrar insigths de información proveniente de textos. A partir de la correlación existente entre los términos de un texto o de la implementación de algoritmos más complejos, se pueden encontrar patrones y medidas que permiten encontrar información que no es explícita para el analista o lector.
La minería de textos
se centra en el análisis de información textual, es una rama de creciente interés ya que la escritura abarca a todas las disciplinas y actividades comunes del ser humano. A partir de esta técnica se pueden realizar aplicaciones orientadas a la comprensión del discurso, la traducción automática, sistemas de corrección ortográfica, análisis de sentimientos sobre algo específico, entre otras aplicaciones de interés.
Este trabajo se centra en el análisis y comparación de discursos presidenciales con la intención de identificar patrones y poder establecer algunas diferenciaciones desde el punto de vista discursivo. Esto es importante en muchos ámbitos de la vida diaria. Por ejemplo, en este caso se realiza para diferentes personalidades políticas, pero también podría ser fácilmente aplicable a analizar los discursos de varias empresas que compiten para seducir una población o clientela específica, entre muchos otros ejemplos.
Para llevar a cabo este trabajo se hizo uso de 6 paquetes de R: quanteda para todo el análisis de texto, readtext posibilita una correcta lectura de los archivos, ggplot2 se usa para toda la gestión gráfica, kableExtra permite realizar tablas presentables para los resultados, cluster y factoextra para un análisis de clustering jerárquico de texto.
El análisis del discurso si bien es un problema que pareciera pertenecer al área de la lingüística, es hoy en día una práctica interdisciplinaria e interpretativa que tiene como objetivo entender el lenguaje en uso y estudiar sistemáticamente el discurso escrito, audiovisual y oral.
Actualmente hay muchas ramas que se preocupan por estudiar el discurso desde diferentes miradas. En la cuestión política, se estudia cómo el discurso influye en la producción, reproducción y transformación de las relaciones de poder. Sin embargo, también puede ser aplicado a diferentes disciplinas y contextos, potenciando áreas del conocimiento, del mercado y del bienestar social.
Me centraré en hacer un análisis de sentimientos de los discursos de 10 presidentes latinoamericanos, entre ellos los presidentes Colombianos desde el año 2002. Este trabajo se realizará en el software RStudio, cuya tercera versión se conoció el día 6 de abril de 2021. quanteda
Bajo la idea de fortalecer la generación de conocimientos y desarrollos en software libre, el fortalecimiento de la minería de texto usando un paquete tan potencial y tan reciente como quanteda y generando alternativas a otros lenguajes de programación, se propone este trabajo.
El análisis de texto crece cada vez más de acuerdo a las necesidades que van surgiendo en los diferentes sectores de la sociedad. Es una herramienta necesaria dentro del análisis de datos y se hace necesario potenciar las herramientas desarrolladas bajo software libre, promover su uso y ampliar su base de acción social.
Realizar este trabajo es interesante porque promueve el uso de RStudio y plataformas como Github para la promoción del mismo. Abre el camino para que en un futuro más estudiantes puedan usar estas herramientas, que, complementándolas con Python, pueden gestar proyectos y habilidades nuevas.
Fue de mi interés realizar este análisis de discursos presidenciales porque me apasiona la política, nunca la había visto desde este tipo de análisis y fue realmente de mi interés y de mi asombro encontrar tantas herramientas que me permitieron avanzar en la idea propuesta. Es posible seguir profundizando en el uso de técnicas y algoritmos de aprendizaje automático para realizar este tipo de tareas desde el software RStudio y el paquete quanteda en integración con otros paquetes de interés.
Para la realización de este trabajo se procedió a buscar los discursos presidenciales a través de Google y el cuerpo de texto de interés fue elegido para construir archivos txt. Una vez construidos estos documentos de manera independiente, se crea el corpus con todos los textos, se hace un breve análisis con algunas métricas de legibilidad y preprocesamiento del corpus para limpiarlo de algunos elementos indeseados para futuros análisis. A partir de esta fase, se realizan algunos análisis de dispersión léxica, correlación y similitud entre los textos a partir del espacio de representación vectorial y se hace un análisis de sentimientos basado en el Lexicoder Sentiment Dictionary (2015) del paquete quanteda.
En esta etapa se realiza la carga de los documentos, se crea el corpus y se organizan los datos de manera que puedan leerse de una manera fácil y cómoda. Adicionalmente, se crea una tabla resumen del corpus.
data <- "C:/Users/USUARIO/Desktop/NLP/Trabajo final Procesamiento de Lenguaje Natural/Aplicaciones de Data Science"
texts<- readtext(paste0(data, "\\Discursos\\*"), encoding = "UTF-8")
texts$doc_id <- gsub(".txt","",texts$doc_id)
discursos <- corpus(texts)
docvars(discursos, "Presidente") <- gsub(".txt","",substring(docnames(texts), 6))
docvars(discursos, "Año") <- as.integer(substring(docnames(texts), 1, 4))
summary <- summary(discursos)
kable(summary, "html" ,caption = "Resumen del Corpus") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width= F, position = "center")
Text | Types | Tokens | Sentences | Presidente | Año |
---|---|---|---|---|---|
1999-Hugo_Chavez | 2654 | 13110 | 336 | Hugo_Chavez | 1999 |
2002-Alvaro_Uribe | 1042 | 2627 | 111 | Alvaro_Uribe | 2002 |
2006-Alvaro_Uribe | 1577 | 4480 | 179 | Alvaro_Uribe | 2006 |
2006-Evo_Morales | 1892 | 9514 | 334 | Evo_Morales | 2006 |
2007-Rafael_Correa | 1672 | 5325 | 150 | Rafael_Correa | 2007 |
2010-Juan_Manuel_Santos | 1724 | 5948 | 213 | Juan_Manuel_Santos | 2010 |
2010-Pepe_Mujica | 1738 | 5544 | 239 | Pepe_Mujica | 2010 |
2014-Juan_Manuel_Santos | 1195 | 3792 | 193 | Juan_Manuel_Santos | 2014 |
2018-Ivan_Duque | 1618 | 5710 | 217 | Ivan_Duque | 2018 |
2018-Lopez_Obrador | 2014 | 6852 | 251 | Lopez_Obrador | 2018 |
2019-Nicolas_Maduro | 2112 | 9140 | 200 | Nicolas_Maduro | 2019 |
2020-Luis_Arce | 1084 | 3440 | 106 | Luis_Arce | 2020 |
Las métricas de legibilidad de texto permiten identificar la facilidad con que se puede leer y entender un texto. Esto es bastante importante ya que algunas de estas métricas pueden ayudarnos a entender cuán fácil se puede leer lo que escribimos. En este trabajo, se evaluarán 3 métricas de legibilidad aplicadas a los discursos presidenciales elegidos.
Índice de niebla de Gunning (Gunning 1944) FOG El índice de niebla de Gunning es una medida de la legibilidad de un escrito que se utiliza en lingüística. El índice se basa en dos indicadores: la longitud de las frases y de las palabras. Se recomienda que este índice esté entre 8 y 12, aunque depende del nivel de formación del lector.
Prueba de nivel de grado de Flesch-Kincaid (Flesch and Kincaid 1975) En la prueba de facilidad de lectura de Flesch, las puntuaciones más altas indican material que es más fácil de leer; los números más bajos marcan los pasajes que son más difíciles de leer, la escala se da entre 0 a 100.
“ELF” Easy Listening Formula (Fang 1966) ELF = número de sílabas por encima de una por palabra en una oración. Una oración promedio debe tener una puntuación ELF por debajo de 12 para que sea fácil de escuchar.
textstat_readability(discursos, measure = c("FOG", "Flesch.Kincaid", "ELF"))
## document FOG Flesch.Kincaid ELF
## 1 1999-Hugo_Chavez 24.12009 20.43627 18.261905
## 2 2002-Alvaro_Uribe 22.58042 17.69423 11.522523
## 3 2006-Alvaro_Uribe 23.35124 18.34812 12.201117
## 4 2006-Evo_Morales 22.90234 18.98439 14.529940
## 5 2007-Rafael_Correa 25.56613 21.35888 17.480000
## 6 2010-Juan_Manuel_Santos 22.16532 17.88705 13.281690
## 7 2010-Pepe_Mujica 20.23318 16.17289 11.301255
## 8 2014-Juan_Manuel_Santos 17.75550 13.86043 8.740933
## 9 2018-Ivan_Duque 22.26126 17.81859 12.940092
## 10 2018-Lopez_Obrador 21.71377 17.63485 13.107570
## 11 2019-Nicolas_Maduro 28.66213 24.52016 22.115000
## 12 2020-Luis_Arce 24.11587 20.00833 15.877358
infodiscursos <- summary(discursos)
Este gráfico muuestra de forma comparativa la extensión del discurso a través de la sumatoria de frases encontradas en el cuerpo textual.
ggplot(data = infodiscursos, aes(x=reorder(x=Presidente,-Sentences), y= Sentences, group = 1, fill=Presidente))+
geom_bar(stat = "identity", show.legend = F)+
geom_text(aes(label=Sentences), vjust=-0.2, hjust=0.5)+
ggtitle("Extensión del discurso Presidencial")+
xlab("Presidente")+
ylab("Frases")+ theme(legend.position = "none", axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
scale_fill_brewer(palette = "Paired")
Se representa la frecuencia de uso de las palabras del corpus a través de una nube de palabras. Esto es importante para analizar de manera general cuales son los temas más mencionados.
dfm_inaug <- corpus_subset(discursos) %>% dfm(remove = stopwords('spanish'), remove_punct = TRUE, remove_numbers = TRUE, tolower = TRUE) %>% dfm_trim(min_termfreq = 10, verbose = FALSE)
set.seed(30)
textplot_wordcloud(dfm_inaug)
Se realiza una nube de palabras para analizar cuales son las más mencionadas por algunos presidentes en particular. Este análisis permite observar de manera independiente pero en una misma nube.
corpus_subset(discursos, Presidente %in% c("Hugo_Chavez", "Evo_Morales", "Ivan_Duque", "Alvaro_Uribe", "Juan_Manuel_Santos")) %>% dfm(groups = "Presidente", remove = stopwords("spanish"), stem = TRUE, remove_punct = TRUE, remove_numbers = TRUE) %>% dfm_trim(min_termfreq = 20, verbose = TRUE) %>% textplot_wordcloud(comparison = TRUE, color = rev(RColorBrewer::brewer.pal(3,"Set1")))
Este análisis es importante porque permite observar la frecuencia de uso y el momento del discurso en el que se utilizó una palabra clave buscada, en este caso son dos palabras que están en el contexto de un discurso político. Se realizará este análisis para algunas palabras que pueden ser de interés en una contienda electoral.
Para el caso de las palabras clave: pueblo y presidente:
keyw<-corpus_subset(discursos)
plot<- textplot_xray(
kwic(keyw, pattern = "pueblo"),
kwic(keyw, pattern = "presidente")
)
plot + aes(color = keyword)+
ggtitle("Uso de la Keyword en el discurso inaugural presidencial")
Para el caso de las palabras clave: educación y democracia:
plot<- textplot_xray(
kwic(keyw, pattern = "educación"),
kwic(keyw, pattern = "democracia")
)
plot + aes(color = keyword)+
ggtitle("Uso de la Keyword en el discurso inaugural presidencial")
Finalmente, las palabras clave: economía y empleo
plot<- textplot_xray(
kwic(keyw, pattern = "economía"),
kwic(keyw, pattern = "empleo")
)
plot + aes(color = keyword)+
ggtitle("Uso de la Keyword en el discurso inaugural presidencial")
Otro análisis interesante es la comparación de palabras clave entre diferentes discursos. Esto nos permite identificar tendencias entre discursos de una misma línea política o en su defecto antagónicas.Para este ejercicio se compararán los discursos entre el presidente Luis Arce de Bolivia y el presidente Evo Morales de Bolivia, el presidente Andrés Manuel López Obrador de México y Hugo Chávez de Venezuela.
Comparación del discurso de Luís Arce con el de Evo Morales
pres_bolivia <- corpus_subset(discursos,
Presidente %in% c("Evo_Morales","Luis_Arce"))
pres_dfm <- dfm(pres_bolivia, groups = "Presidente", remove = stopwords("Spanish"),
remove_punct = TRUE)
result_keyness <- textstat_keyness(pres_dfm, target = "Luis_Arce")
textplot_keyness(result_keyness)
Comparación del discurso de López Obrador con el de Hugo Chávez
pres_vzlmx <- corpus_subset(discursos,
Presidente %in% c("Hugo_Chavez","Lopez_Obrador"))
pres_dfm <- dfm(pres_vzlmx, groups = "Presidente", remove = stopwords("Spanish"),
remove_punct = TRUE)
result_keyness2 <- textstat_keyness(pres_dfm, target = "Lopez_Obrador")
textplot_keyness(result_keyness2)
Los análisis de similitudes y correlaciones son ampliamente utilizados en la minería de texto ya que permiten encontrar patrones o tendencias orientadas a agrupar las entradas de texto de acuerdo a sus características.
En este caso usaremos el análisis de distancia “coseno”, el cual es ampliamente utilizado en el análisis de texto en planos de representación vectorial. Este se encarga de conocer el ángulo entre dos vectores n-dimensionales en un espacio n-dimensional y así determinar la similitud existente ente 2 o más documentos.
dotchart(as.list(simi_discursos)$"2018-Ivan_Duque", xlab = "Similitud del discurso de Iván Duque (min=0, max=1)", pch = 19)
Existen varias geometrías para explicar la distancia entre dos puntos, dos de las más conocidas son la euclidiana y la Manhattan. En este caso usaremos la geometría Euclideana para calcular la distancia entre los discursos de los presidentes.
dotchart(as.list(distancia_discursos)$"1999-Hugo_Chavez", xlab = "Distancia euclideana del discurso de Hugo Chavez", pch = 19)
Con este agrupamiento jerárquico lo que se busca es tratar de agrupar los discursos en diferentes tendencias. Para este caso, se trabajo con 2 grupos tratando de simular desde el punto de vista discursivo lo que corresponde a un discurso de izquierd y a uno de derecha.
hc_euclidea <- hclust(d = dist(x = sim, method = "euclidean"),
method = "complete")
fviz_dend(x = hc_euclidea, k = 2, cex = 0.7) +
geom_hline(yintercept = 215, linetype = "dashed") +
labs(title = "Clustering jerárquico para discursos presidenciales")
El gráfico de red excelente para poder evaluar la interacción y la co-ocurrencia que hay entre diferentes palabras del discurso. Muchas veces un grupo de palabras puede proporcionarle más perspectiva que una sola palabra. Veamos la red de palabras identificadas en el discurso de Álvaro Uribe Velez
Alv <- corpus_subset(discursos, Presidente=="Alvaro_Uribe" )
red_Alv <-
tokens(Alv, remove_punct = TRUE, remove_numbers = TRUE) %>%
tokens_tolower() %>%
tokens_remove(stopwords("spanish"), padding = FALSE) %>%
fcm(context = "window", window = 5, tri = FALSE)
topfeats <- names(topfeatures(red_Alv, 30))
set.seed(110)
net_Alv <-textplot_network(fcm_select(red_Alv, topfeats), min_freq = 0.8, edge_color = "#0000cc")
net_Alv + labs(title = "Red de palabras usadas en el discurso de Alvaro Uribe",
subtitle = "La frecuencia representada en el grosor de la linea")
Ahora veamos la red de palabras del discurso de Evo Morales
evo <- corpus_subset(discursos, Presidente=="Evo_Morales" )
red_evo <-
tokens(evo, remove_punct = TRUE, remove_numbers = TRUE) %>%
tokens_tolower() %>%
tokens_remove(stopwords("spanish"), padding = FALSE) %>%
fcm(context = "window", window = 5, tri = FALSE)
topfeats <- names(topfeatures(red_evo, 30))
set.seed(100)
net_evo <- textplot_network(fcm_select(red_evo, topfeats), min_freq = 0.8, edge_color = "#FF6600")
net_evo + labs(title = "Red de palabras usadas en el discurso de Evo Morales",
subtitle = "La frecuencia representada en el grosor de la línea")
El sentiment analysis consiste básicamente en evaluar emociones, actitudes y opiniones de manera que se pueda extraer información valiosa de los sentimientos generados en algún tipo de texto. Puede ser un discurso, una opinión de un producto, un comentario o reacción en redes sociales, etc.
En este caso, se va a realizar un análisis de sentimientos para cada uno de los discursos presidenciales. quanteda provee algunas herramientas para poder realizar esta tarea, como lo es el Lexicoder LSD2015. Si bien hay formas más avanzadas de realizar estos análisis de sentimientos con aprendizaje de máquina, me fue complejo poder desarrollar algún algoritmo que clasificara los sentimientos de los discursos desde el aprendizaje no supervisado. Aunque mi intención es seguir avanzando en ello desde el uso de este paquete tan vérsatil, por lo pronto hice uso de la herramienta que por excelencia trae quanteda integrada para este tipo de análisis.
Sentimientos por tokens del discurso:
sentimiento <- tokens(discursos, remove_punct = TRUE)
sent <- tokens_lookup(sentimiento, dictionary = data_dictionary_LSD2015[1:2])
head(sent)
## Tokens consisting of 6 documents and 2 docvars.
## 1999-Hugo_Chavez :
## [1] "positive" "positive" "positive" "positive" "positive" "positive"
## [7] "negative" "positive" "positive" "positive" "positive" "positive"
## [ ... and 189 more ]
##
## 2002-Alvaro_Uribe :
## [1] "positive" "negative" "positive" "negative" "positive" "positive"
## [7] "positive" "positive" "negative" "positive" "positive" "negative"
## [ ... and 63 more ]
##
## 2006-Alvaro_Uribe :
## [1] "positive" "negative" "positive" "negative" "negative" "positive"
## [7] "negative" "positive" "negative" "negative" "negative" "negative"
## [ ... and 137 more ]
##
## 2006-Evo_Morales :
## [1] "positive" "positive" "positive" "positive" "positive" "positive"
## [7] "positive" "positive" "negative" "positive" "negative" "negative"
## [ ... and 141 more ]
##
## 2007-Rafael_Correa :
## [1] "positive" "negative" "negative" "positive" "negative" "negative"
## [7] "positive" "positive" "positive" "negative" "positive" "positive"
## [ ... and 128 more ]
##
## 2010-Juan_Manuel_Santos :
## [1] "positive" "positive" "positive" "positive" "positive" "positive"
## [7] "positive" "positive" "positive" "positive" "positive" "positive"
## [ ... and 113 more ]
Se presenta una tabla donde se organizan las emociones positivas y negativas para cada uno de los discursos presidenciales.
df_sentiment <- dfm(sent)
kable(df_sentiment,"html", caption = "Resumen de sentimientos extraídos") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width= F, position = "center")
doc_id | negative | positive |
---|---|---|
1999-Hugo_Chavez | 101 | 100 |
2002-Alvaro_Uribe | 38 | 37 |
2006-Alvaro_Uribe | 66 | 83 |
2006-Evo_Morales | 59 | 94 |
2007-Rafael_Correa | 71 | 69 |
2010-Juan_Manuel_Santos | 55 | 70 |
2010-Pepe_Mujica | 40 | 49 |
2014-Juan_Manuel_Santos | 27 | 35 |
2018-Ivan_Duque | 69 | 59 |
2018-Lopez_Obrador | 59 | 69 |
2019-Nicolas_Maduro | 50 | 89 |
2020-Luis_Arce | 47 | 34 |