El propósito del siguiente reporte es proporcionar una guía de cómo aplicar herramientas de procesamiento de lenguaje natural y análisis de discurso a un video de youtube. Para este caso utilizaremos un video de youtube titulado “¿Qué piensas de Michael Jackson? (1984)” publicado el 31 de enero del 2023 por el canal de youtube N+ Archivo el cual contiene un registro de entrevistas, coberturas y reportajes periodísticos realizados por la Televisora Mexicana Televisa.
El siguiente procesamiento también es aplicable para cualquier archivo en formato txt.
Este análisis cobra relevancia ya que, tan solo dos años antes, Michael Jackson lanzó su álbum “Thriller”, el cual se convirtió en el álbum más exitoso de todos los tiempos con más de 66 millones de copias vendidas, por tanto, es seguro afirmar que en ese momento el artista se encontraba en el momento cúspide de su carrera.
El video consiste en una serie de personas en las calles de México respondiendo la pregunta ¿Usted conoce a Michael Jackson? y en caso de responder afirmativamente se les hacía una serie de preguntas de seguimiento como:
¿Que opina usted de él? ¿Le gusta como baila/Canta? y ¿Te gustaría bailar/cantar como él?
Los entrevistados del video abarcan tanto hombres como mujeres de todas las edades, lo que lo hace una buena fuente de datos para conocer la opinión pública de los mexicanos generada en torno a la figura del artista en ese momento. A continuación se describe la metodología empleada para el análisis:
El primer paso para realizar el análisis es obtener la transcripción del video de Youtube en cuestión, existen múltiples herramientas que permiten realizar esto, sin embargo, la que es recomendable utilizar debido a su accesibilidad es Download Youtube Subtitles disponible en el siguiente enlace: https://www.downloadyoutubesubtitles.com/es/?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D6sKWg-3s24k%26t%3D55s.
Una vez que ingreses a la página únicamente deberás copiar el link del video en cuestión en la barra y dar click en el recuadro para descargar la transcripción del mismo en formato txt. Se muestra el procedimiento en seguida:
Una vez descargada la transcripción en formato txt es necesario guardarla en nuestro directorio de trabajo de R para poder acceder a ella.
Una vez realizado esto, podremos comenzar a procesar el texto siguiendo los siguientes pasos:
Primero definiremos las librerías que contienen las funciones que utilizaremos en el procesamiento
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rvest)
## Warning: package 'rvest' was built under R version 4.2.3
##
## Attaching package: 'rvest'
##
## The following object is masked from 'package:readr':
##
## guess_encoding
library(magrittr)
##
## Attaching package: 'magrittr'
##
## The following object is masked from 'package:purrr':
##
## set_names
##
## The following object is masked from 'package:tidyr':
##
## extract
library(tm)
## Warning: package 'tm' was built under R version 4.2.3
## Loading required package: NLP
##
## Attaching package: 'NLP'
##
## The following object is masked from 'package:ggplot2':
##
## annotate
library(wordcloud)
## Warning: package 'wordcloud' was built under R version 4.2.3
## Loading required package: RColorBrewer
library(tidytext)
## Warning: package 'tidytext' was built under R version 4.2.3
library(tidyr)
library(ggplot2)
library(stringr)
library(tidytext)
library(textdata)
## Warning: package 'textdata' was built under R version 4.2.3
library(janeaustenr)
## Warning: package 'janeaustenr' was built under R version 4.2.3
library(dslabs)
## Warning: package 'dslabs' was built under R version 4.2.3
library(ggplot2)
library(syuzhet)
## Warning: package 'syuzhet' was built under R version 4.2.3
library (dplyr)
library(topicmodels)
## Warning: package 'topicmodels' was built under R version 4.2.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.2.3
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
Las funciones específicas de las librerías son las siguientes: - tidyverse: Contiene muchas librerías de R. - rvest: Extrae datos de páginas web. - magrittr: Permite la composición de funciones, facilitando la escritura de código de R más conciso y expresivo. - tm: Proporciona herramientas para el procesamiento del lenguaje natural (NLP), como tokenización, eliminación de stopwords y stemming. - wordcloud: Crea nubes de palabras, que representan palabras en función de su frecuencia. - tidytext: Permite trabajar con datos de texto en el formato tidy, facilitando el análisis de datos. - tidyr: Permite manipular datos en el formato tidy, como fusionar, dividir y reordenar columnas. - ggplot2: Facilita la visualización de datos en gráficos para una mejor comprensión. - stringr: Permite trabajar con cadenas de caracteres, como extraer subcadenas, reemplazar caracteres y eliminar espacios en blanco. - janeaustenr: Proporciona datos sobre las obras de Jane Austen, útiles para análisis de texto. - dslabs: Ofrece datos y ejercicios para aprender sobre ciencia de datos, incluyendo análisis de texto. - syuzhet: Permite realizar análisis de sentimiento, identificando la emoción o tono de un texto. - dplyr: Facilita operaciones comunes de manipulación de datos, como filtrar, ordenar y agrupar. - topicmodels: Permite identificar temas presentes en un conjunto de datos textuales. - kableExtra:proporciona funcionalidades adicionales y personalización para tablas en RMarkdown
Ya que las librerías están cargadas se procederá a leer el archivo en formato txt que contiene la transcripción del video creando un objeto en R a partir del nombre y extensión del archivo entre comillas, lo cual queda de la siguiente manera:
Michael_Jackson_1984 <- read_csv("Michael_Jackson_1984.txt",
col_names = FALSE, show_col_types = FALSE)
Para comprobar que el archivo se cargo correctamente solo deberemos de correr la siguiente linea de código:
head(Michael_Jackson_1984$X1)
## [1] "Muy buenas tardes conoce usted a Michael"
## [2] "Jackson señor no no lo conozco no lo"
## [3] "conozco usted señora"
## [4] "Señorita Usted conoce a Michael Jackson"
## [5] "conocer a Michael Jackson yo creo que"
## [6] "todo mundo no es como conocer a Dios"
Ya exportado correctamente será posible continuar con el procesamiento del texto.
Este chunk toma el objeto Michael_Jackson_1984 el cual se encuentra en formato de dataframe, selecciona la columna X1, y luego divide el texto en palabras utilizando la función unnest_tokens. El resultado es un nuevo data frame llamado tidy_MJ con una columna llamada “word” que contiene cada palabra individual del texto.
tidy_MJ <- Michael_Jackson_1984 %>%
select(X1) %>%
unnest_tokens("word", X1)
head(tidy_MJ)
## # A tibble: 6 × 1
## word
## <chr>
## 1 muy
## 2 buenas
## 3 tardes
## 4 conoce
## 5 usted
## 6 a
Para limpiar nuestro texto es necesario correr los siguientes dos chunks de código, donde el primero crea un diccionario con palabras que no poseen valor analítico, también conocidas como stopwords, mientras que el segundo crea un conjunto de datos llamado top_words, que contiene las palabras más frecuentes en el data frame tidy_MJ después de excluir aquellas en el diccionario definido anteriormente y algunas palabras específicas mencionadas en el filtro. Las palabras están ordenadas por frecuencia de aparición en orden descendente.
## Se crea el diccionario
diccionario=as.data.frame(stopwords(kind="es"))
names(diccionario)[1] <- "word"
tidy_MJ_limpia<-
tidy_MJ %>%
anti_join(diccionario) %>%
filter(!(word=="a"|
word=="conoce"|
word=="de"|
word=="es"|
word=="jackson"|
word=="michael"|
word=="no"|
word=="que"|
word=="sí"|
word=="usted"|
word=="que"|
word=="opina"|
word=="quisiera"|
word=="cantar"|
word=="bailar"|
word=="pues"|
word=="artista"|
word=="canta"|
word=="baila"|
word=="conozco"|
word=="muchas"|
word=="gracias"|
word=="quien"|
word=="señor"|
word=="señora"|
word=="aquí"|
word=="gusta"|
word=="quién"|
word=="así"|
word=="buenas"|
word=="cree"|
word=="creo"|
word=="señorita"|
word=="si"|
word=="sé"|
word=="visto"|
word=="ahorita"|
word=="pienso"|
word=="cuál"|
word=="cómo"|
word=="sabe"|
word=="realmente"|
word=="definitivamente"|
word=="tardes"))
## Joining with `by = join_by(word)`
top_words<-
tidy_MJ %>%
anti_join(diccionario) %>%
filter(!(word=="a"|
word=="conoce"|
word=="de"|
word=="es"|
word=="jackson"|
word=="michael"|
word=="no"|
word=="que"|
word=="sí"|
word=="usted"|
word=="que"|
word=="opina"|
word=="quisiera"|
word=="cantar"|
word=="bailar"|
word=="pues"|
word=="artista"|
word=="canta"|
word=="baila"|
word=="conozco"|
word=="muchas"|
word=="gracias"|
word=="quien"|
word=="señor"|
word=="señora"|
word=="aquí"|
word=="gusta"|
word=="quién"|
word=="así"|
word=="buenas"|
word=="cree"|
word=="creo"|
word=="señorita"|
word=="si"|
word=="sé"|
word=="visto"|
word=="ahorita"|
word=="pienso"|
word=="cuál"|
word=="cómo"|
word=="sabe"|
word=="realmente"|
word=="definitivamente"|
word=="tardes")) %>%
count(word) %>%
arrange(desc(n))
## Joining with `by = join_by(word)`
La primera visualización que se propone es una nube de palabras, como la siguiente, en donde el tamaño de la palabra indica su frecuencia en el texto:
Esta será hecha con el diccionario (Wordcloud).
Para esto primero, obtendremos los 100 términos más comunes de nuestro texto, ya que estos son los que serán representados en la visualización. Posteriormente se define una paleta de colores para las palabras y finalmente se plasma el código de creación que resultarpa en una nube de palabras con los términos más comunes mencionados en el video, los cuales nos permiten darnos una idea de la opinión que tenían los mexicanos acerca de Michael Jackson.
# Obtener las 100 palabras más comunes
terminos_comunes <- head(arrange(top_words, desc(n)), 100)
# Crear una paleta de colores
colores_personalizados = c("#104E8B","#CD2626", "#FFB90F")
# Aumentar el valor de "scale" para hacer la nube de palabras más grande
wordcloud(words = terminos_comunes$word, freq = terminos_comunes$n,
scale = c(5, 0.5), colors = colores_personalizados, random.order = FALSE)
Interpretación: La nube de palabras es un primer
análisis exploratorio, esta indica que los entrevistados consideraron
que Michael Jackson es un buen cantante que hace buena música,
principalmente orientado a los jóvenes ya que las palabras “jovenes” y
“juventud” aparecen en la visualización. Además, se deja ver la
importancia de la publicidad y la televisión en la difusión del material
artístico del cantante.
Otra forma de visualizar esto es con una gráfica de barras de los 20 términos más comunes mencionados en el video. Para crearlo se emplea
# Definición de Paleta de colores personalizada
colores_personalizados <- c("#008B8B", "#009E73", "#D55E00", "#8B6508", "#CD3333", "#56B4E9", "#E69F00", "#B3EE3A", "#2F4F4F", "#5F9EA0", "#556B2F", "#F0E442", "#66CD00", "darkgreen", "#8B1A1A", "#4EEE94", "#D55E00", "#CC79A7", "#6959CD", "#FF4040")
top_words %>%
slice(1:20) %>%
ggplot(aes(x=reorder(word, -n), y=n, fill=word))+
geom_bar(stat="identity")+
# Personalizar el tema y colores
theme_minimal() +
theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 13)) +
theme(plot.title = element_text(hjust = 0.5, size = 14)) + # Tamaño del título reducido
theme(panel.background = element_rect(fill = "white", color = "gray90")) +
# Asignar la paleta de colores personalizada
scale_fill_manual(values = colores_personalizados) +
# Etiquetas de ejes y título
ylab("Frecuencia") +
xlab("") +
ggtitle("Palabras más frecuentes al hablar de Michael Jackson (1984)")+
guides(fill=FALSE)
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Interpretación: Esta grafica de barras muestra las
palabras más mencionadas y nos deja conocer aspectos, como por ejemplo,
que la gente conocía más a Michael Jackson por cantar que por bailar, de
igual manera se menciona que los mexicanos conocían o incluso poseían
discos del artista en sus hogares. También se habla acerca de lo
atractiva que era la figura del cantante pues las palabras “sexy” y
“bailarín” aparecen en el gráfico. La palabra rock es mencionada,
probablemente porque este género coexistía con la música de Michael
Jackson en dicha época.
En caso de que gustes mirar la información de manera más detallada, la siguiente tabla muestra las 30 palabras que más se mencionaron durante el video. En esta tabla word es la palabra en el texto y n es la frecuencia con la cual esta es mencionada. Si gustas puedes remplazar el 30 en esta sección “top_words[1:30,]” para extender el largo de la tabla.
# Crear la tabla con estilo html
tabla_palabras <- kable(top_words[1:30,], format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
# Mostrar la tabla
tabla_palabras
word | n |
---|---|
bien | 24 |
bueno | 12 |
cantante | 12 |
música | 12 |
discos | 8 |
mujer | 7 |
baile | 6 |
casa | 5 |
fama | 5 |
mejor | 5 |
rock | 5 |
sexy | 5 |
televisión | 5 |
tipo | 5 |
atención | 4 |
atractivo | 4 |
bailarín | 4 |
bastante | 4 |
buen | 4 |
hecho | 4 |
juventud | 4 |
llama | 4 |
muchacho | 4 |
persona | 4 |
publicidad | 4 |
ritmo | 4 |
tan | 4 |
toda | 4 |
años | 3 |
buena | 3 |
Esta sección del código da 3 opciones de visualización para los términos más comunes.
Una vez realizado un análisis exploratorio, se proceserá a realizar el análisis de sentimiento.
Esta sección describirá como analizar los sentimientos presentes en nuestros archivos.
Crear un análisis de sentimiento permite comprender las emociones expresadas en textos, lo que es fundamental para empresas o los gobiernos en la evaluación de la percepción de sus productos o servicios, y para estudios sociales en el análisis de opiniones públicas y tendencias. Además, este procedimiento proporciona insights que pueden guiar estrategias de marketing, toma de decisiones empresariales o públicas y, como en el caso de este documento, investigaciones académicas basadas en la interpretación de actitudes y emociones en textos.
En nuestro caso, donde se busca analizar la percpeción de una figura pública, el análisis de sentimiento permite evaluar la percepción del público sobre ellos. Esto es crucial para adaptar discursos o acciones en respuesta a las tendencias y opiniones cambiantes.
El análisis de sentimiento NRC es un enfoque que asigna etiquetas de sentimiento a palabras en un texto basándose en un conjunto de datos predefinido que asocia palabras con emociones o sentimientos específicos. Finalmente, contamos los sentimientos utilizando count(). Con el objetivo de que nuestro análisis sea apropiado es necesario adecuar el diccionario a español
MJ_sentiment <- tidy_MJ %>%
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 1 of `x` matches multiple rows in `y`.
## ℹ Row 5067 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
MJ_sentiment
## # A tibble: 2 × 2
## sentiment n
## <chr> <int>
## 1 positive 4
## 2 trust 3
Si se desea profundizar, es posible visualizar como el diccionario nrc le asigna sentimientos a las palabras en español
# Obtener los nombres predeterminados de los sentimientos del diccionario NRC
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
Una vez hecho nuestro análisis de sentimiento exitosamente, es posible graficarlo
Este código crea una visualización del análisis de sentimiento realizado anteriormente utilizando ggplot.
# Define una paleta de colores y etiquetas en español para los sentimientos
color_palette <- c("positive" = "#77DD77", "trust" = "#B3EE3A")
# Etiquetas en español
labels_es <- c("Positivo", "Confianza")
# Crear una gráfica de barras para visualizar los sentimientos
ggplot(MJ_sentiment, aes(x = sentiment, y = n, fill = sentiment)) +
geom_bar(stat = "identity") +
labs(title = "Sentimientos (NRC) acerca de Michael Jackson (1984)",
x = "Sentimiento", y = "Cantidad") +
scale_fill_manual(values = color_palette) +
scale_x_discrete(labels = labels_es) + # Cambiar las etiquetas del eje x
theme_minimal() +
theme(legend.position = "none")
Interpretación: Esta gráfica de modelado de
sentimientos deja ver que los sentimientos asociados con Michael Jackson
eran favorables, pues los únicos sentimientos manifestados son los
Positivos y de Confianza. Se aclara que este no es un modelado común y
que textos más complejos contienen un mayor rango de sentimientos.
Otro procedimiento analítico aplicable es el modelato de tópicos
El modelado de tópicos es un método de análisis textual que busca descubrir los temas principales presentes en un conjunto de documentos sin etiquetas previas. Utilizando algoritmos como el Modelo de Tópicos Latentes (LDA), se identifican patrones en las palabras para agrupar documentos en torno a temas comunes. Este tipo de análisis proporciona una visión estructurada de la información al revelar los tópicos más relevantes y su relación con cada documento, facilitando la comprensión y búsqueda de información en grandes conjuntos de texto.
Para es necesario realizar lo siguiente:
Un Corpus es conjunto estructurado de textos o datos lingüísticos recolectados y organizados para su análisis, estudio y aplicación en diversas áreas como lingüística, inteligencia artificial, análisis de datos, entre otros. Se crea de la siguiente manera vectorizando nuestro data frame “Tidy_MJ”.
# Suponiendo que MJ_corpus es tu corpus
MJ_corpus <- Corpus(VectorSource(as.vector(tidy_MJ)))
El corpus ya fue creado, sin embargo, este guardo el objeto tidy_MJ antes de su limpieza, por lo tanto es necesario volver a limpiarlo para eliminar los elementos que puedan restarle validez al modelado de tópicos.
tidy_MJ_limpia<-
tidy_MJ %>%
anti_join(diccionario) %>%
filter(!(word=="a"|
word=="conoce"|
word=="de"|
word=="es"|
word=="jackson"|
word=="michael"|
word=="no"|
word=="que"|
word=="sí"|
word=="usted"|
word=="que"|
word=="opina"|
word=="quisiera"|
word=="cantar"|
word=="bailar"|
word=="pues"|
word=="artista"|
word=="canta"|
word=="baila"|
word=="conozco"|
word=="muchas"|
word=="gracias"|
word=="quien"|
word=="señor"|
word=="señora"|
word=="aquí"|
word=="gusta"|
word=="quién"|
word=="así"|
word=="buenas"|
word=="cree"|
word=="creo"|
word=="señorita"|
word=="si"|
word=="sé"|
word=="visto"|
word=="ahorita"|
word=="pienso"|
word=="cuál"|
word=="cómo"|
word=="sabe"|
word=="realmente"|
word=="definitivamente"|
word=="tardes"))
## Joining with `by = join_by(word)`
Se sobreescribe el corpus para posicionar el objeto tidy_MJ_limpia
# Suponiendo que MJ_corpus es tu corpus
MJ_corpus <- Corpus(VectorSource(as.vector(tidy_MJ_limpia)))
Ya con el corpus limpio, será necesario crear una matriz término documento, la cual es una estructura de datos que representa la frecuencia de términos en un conjunto de documentos. Esto se hace aplicandole el parámetro DocumentTermMatrx a nuestro corpus limpio.
# Crear la matriz término-documento (Document-Term Matrix, DTM)
dtm <- DocumentTermMatrix(MJ_corpus)
# Inspeccionar la DTM
inspect(dtm)
## <<DocumentTermMatrix (documents: 1, terms: 294)>>
## Non-/sparse entries: 294/0
## Sparsity : 0%
## Maximal term length: 19
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs "baile", "bien", "bueno", "cantante", "casa", "discos", "fama", "mejor",
## 1 6 24 12 12 5 8 5 5
## Terms
## Docs "mujer", "música",
## 1 7 12
# Calcular el conteo total de palabras en cada documento
conteo_total <- colSums(as.matrix(dtm))
Una vez creada será posible saber su número de términos totales, los 50 términos más comunes, y los términos más comunes en el primer documento al correr el siguiente chunk de código:
# Calcular el número total de términos únicos en la colección
num_terminos <- sum(dtm > 0)
print(paste("Número total de términos en la DTM:", num_terminos))
## [1] "Número total de términos en la DTM: 294"
# Conteo total de palabras en todos los documentos
conteo_total <- colSums(as.matrix(dtm))
# Encontrar los términos más comunes en todo el corpus
terminos_comunes <- sort(conteo_total, decreasing = TRUE)
# Mostrar los 50 términos más comunes
print("Los 50 términos más comunes:")
## [1] "Los 50 términos más comunes:"
head(terminos_comunes, 50)
## "bien", "bueno", "cantante", "música", "discos",
## 24 12 12 12 8
## "mujer", "baile", "casa", "fama", "mejor",
## 7 6 5 5 5
## "rock", "sexy", "televisión", "tipo", "atención",
## 5 5 5 5 4
## "atractivo", "bailarín", "bastante", "buen", "hecho",
## 4 4 4 4 4
## "juventud", "llama", "muchacho", "persona", "publicidad",
## 4 4 4 4 4
## "ritmo", "tan", "toda", "años", "buena",
## 4 4 4 3 3
## "empeño", "estilo", "hace", "hijos", "imagino",
## 3 3 3 3 3
## "jóvenes", "mucha", "unidos", "ven", "verdad",
## 3 3 3 3 3
## "álbum", "ahora", "ahí", "americano", "cada",
## 3 2 2 2 2
## "canciones", "cantando", "claro", "comercial", "cosas",
## 2 2 2 2 2
El siguiente código realiza un análisis de tópicos sobre el corpus creado con el texto de Michael Jackson representado por la matriz de término-documento dtm, y visualiza los términos más importantes de cada tópico mediante un gráfico de barras. La k es el número de tópicos o temas, y puedes expandirla a tu gusto.
# Generar un modelo de topic models
lda_mj <- LDA(dtm, k = 2)
# Obtener los términos más importantes de cada tópico
terms_mj <- tidy(lda_mj, matrix = "beta") %>%
group_by(topic) %>%
top_n(4, wt = beta)
# Generar el gráfico
ggplot(terms_mj, aes(x = term, y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
theme_minimal() +
coord_flip() +
facet_wrap(~topic, ncol = 2)
terms <- tidy(lda_mj, matrix = "beta")
terms <- terms %>%
select(term, beta)
Interpretación: En el primer tópico evidencia que Michael Jackson es percibido como un buen cantante y bailarín. Mientras que el segundo reafirma lo anterior a su vez que sus discos son mencionados
Una forma de visualzicación alterna que facilita la comprensión del modelado de tópicos, es la siguiente:
# Generar el gráfico mejorado con tres tópicos
ggplot(terms_mj, aes(x = reorder(term, -beta), y = beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~topic, ncol = 1, scales = "free") + # Muestra un tópico por fila
labs(x = "Términos", y = "Puntuación del término") + # Etiquetas de ejes
theme_minimal() + # Estilo del gráfico
scale_fill_brewer(palette = "Dark2") # Cambia el esquema de color
### Conclusión El siguiente documento muestra un ejemplo de herramientas
de procesamiento de lenguaje natural con R aplicadas a un archivo txt
que usa como fuente la transcripción de un video de Youtube. Se subraya
que este documento solo es de utilidad cuanto la fuente es UN solo
archivo txt, ya que con una lista de archivos el procedimiento de
análisis es distinto. Este código es de utilidad para procesar texto y
generar visualizaciones, sin embargo, se destaca la importancia de la
interpretación de los gráficos generados, ya que esto es lo que
construye el análisis.
Este documento fue creado por Emiliano Montalo Vásquez: https://www.linkedin.com/in/emiliano-montalvo-v%C3%A1squez-979247281/
¡Que viva el rey del pop!