library(dplyr)
library(tidytext)
library(ggplot2)
library(highcharter)
# Cargamos el tema de ggplot del blog El arte del dato
theme_set(theme_elartedeldato())
# Cargamos el discurso transcrito
<- readLines('discurso-pedro-sanchez.txt')
discurso
# Alamcenamos como dataframe el texto
<- length(discurso)
n <- tibble(line = 1:n, text = discurso)
df_discurso
# Eliminamos las stopwords y añadimos otras utiliadas en el discurso
<- get_stopwords('es')
stop_words_es <- c('hacer','vamos','pues', 'creo', 'ser', 'va','también','solo','si','ello', 'más', 'sí', 'será' ,'aún')
new_stop_words <- tibble(word = c(stop_words_es$word, new_stop_words))
stop_words_es
|>
df_discurso unnest_tokens(word, text) |>
anti_join(stop_words_es) -> df_discurso_word
Esta mañana hemos escuchado el discurso de investidura del candidato a la Presidencia del Gobierno de España, Pedro Sánchez. El discurso fue recogido en directo por algunos medios. En concreto hemos utilizado el editado por La Moncloa que puedes encontrar aquí. En este post analizaremos los términos más empleados por el candidato así como la evolución del discurso en función del tono del mismo.
Una vez cargado y editado el texto, visualizamos las palabras más utilizadas durante el discurso. Para ello utilizaremos un gráfico de barras.
|>
df_discurso_word count(word, sort = TRUE) -> df_discurso_count
|>
df_discurso_count filter(n > 15) |>
mutate(word = reorder(word, n)) |>
ggplot(aes(word, n)) +
geom_col(fill = "#e30614") +
coord_flip() +
labs(title = "Palabras más utilizadas en el discurso \nde investidura",
subtitle = "Intervención de Pedro Sánchez",
x = "", y = "")
Por otro lado, otra forma común de visualizar frecuencias de términos en un texto, es a través del gráfico de wordcloud.
set.seed(10)
|>
df_discurso_count with(wordcloud::wordcloud(min.freq = 7,
words = word,
freq = n,
random.order = FALSE,
family = "Bebas Neue"))
Ten en cuenta que no todas las palabras se muestran, puesto que se han filtrado aquellas de frecuencia más baja.
Puedes consultar la lista entera aquí:
::reactable(df_discurso_count, sortable = FALSE, showPageSizeOptions = TRUE,
reactablefullWidth = FALSE, height = "auto",
columns = list(word = reactable::colDef(name = "Palabra", filterable = TRUE)),
style = list(fontFamily = "Bebas Neue"))
Análisis de sentimiento
Pasamos ahora a analizar el sentimiento de cada una de las frases del discurso desde un punto de vista general. Para ello utilizaremos la librería de R syuzhet
.
Este análisis sólo pretende mostrar un ejemplo de visualización de sentimiento de texto, pero en ningún caso está supervisado por un lingüista experta/o.
# Calculamos sentimiento en cada frase
::get_sentiment(discurso, method = "nrc", language = "spanish") -> sentimiento
syuzhet<- data.frame(sentimiento)
df_sentimiento $frase <- discurso
df_sentimiento$momento <- 1:n
df_sentimiento
hchart(
df_sentimiento,type = "area",
hcaes(x = momento, y = sentimiento),
zones = list(
list(value = 0,
color= '#ff6968',
fillColor = list(linearGradient = list(x1 = 0, y1 = 0, x2 = 0, y2 = 1),
stops = list(list(0, paste0('#ff6968', '00')), list(1, '#ff6968')))),
list(color='#94caae',
fillColor = list(linearGradient = list(x1 = 0, y1 = 0, x2 = 0, y2 = 1),
stops = list(list(0, '#94caae'), list(1, paste0('#94caae',"00")))))
)|>
) hc_tooltip(
headerFormat = "Sentimiento: {point.y}<br>",
pointFormat = "{point.frase}"
|>
) hc_title(text = "<b>Análisis de sentimiento</b>") |>
hc_subtitle(text = "<i>Discurso de investidura Pedro Sánchez</i>") |>
hc_credits(enabled = TRUE, text = "http://elartedeldato.com")
Como nota final, aclarar que el análisis de sentimiento sirve como herramienta de apoyo para extraer conclusiones generales sobre el tono del discurso palabra a palabra, no tanto del fondo del mismo que debe ser estudiado en detalle por expertos de la materia.