suppressPackageStartupMessages({
library(tidyverse)
library(tidytext)
library(magick)
library(RColorBrewer)
library(wordcloud)
library(topicmodels)
} )
Cachitos 2022. Tercera parte
Vamos ya con la última entrada del cachitos de este año. Las anteriores, las tenemos en esta y esta otra
El csv con el texto de los rótulos para 2022 lo tenemos en este enlace
Vamos al lío
Librerías
Lectura de datos, y vistazo datos
= "/media/hd1/canadasreche@gmail.com/public/proyecto_cachitos/"
root_directory <- "2022" anno
Leemos el csv. Uso DT y así podéis ver todos los datos o buscar cosas, por ejemplo emérito
o Ayuso
<- read_csv(str_glue("{root_directory}{anno}_txt_unido.csv"))
subtitulos_proces
%>%
subtitulos_proces select(texto, n_fichero, n_caracteres) %>%
::datatable() DT
Pues nos valdría con esto para buscar términos polémicos.
Algo de minería de texto
Quitamos stopwords y tokenizamos de forma que tengamos cada palabra en una fila manteniendo de qué rótulo proviene
<- c(tm::stopwords("es"),
to_remove "110", "4","1","2","7","10","0","ñ","of",
"5","á","i","the","3", "n", "p",
"ee","uu","mm","ema", "zz",
"wr","wop","wy","x","xi","xl","xt",
"xte","yí", "your")
<- subtitulos_proces %>%
subtitulos_proces_one_word unnest_tokens(input = texto,
output = word) %>%
filter(! word %in% to_remove) %>%
filter(nchar(word) > 1)
# Se nos quedan 3766 filas/palabras de los 488 rótulos
dim(subtitulos_proces_one_word)
#> [1] 3766 5
::datatable(subtitulos_proces_one_word) DT
Contar ocurrencias de cosas es lo más básico.
<- subtitulos_proces_one_word %>%
palabras_ordenadas_1 group_by(word) %>%
summarise(veces = n()) %>%
arrange(desc(veces))
%>%
palabras_ordenadas_1 slice(1:20) %>%
ggplot(aes(x = reorder(word, veces), y = veces)) +
geom_col(show.legend = FALSE) +
ylab("veces") +
xlab("") +
coord_flip() +
theme_bw()
Y como el año pasado la palabra más común es “canción” . ¿Y si añadimos las 20 palabras como stopword, junto con algunas como [“tan”, “sólo”,“así”, “aquí”, “hoy”] . La tarea de añadir palabras como stopwords requiere trabajo, tampoco nos vamos a parar tanto.
<- palabras_ordenadas_1 %>%
(add_to_stop_words slice(1:25) %>%
pull(word) )
#> [1] "canción" "si" "año" "años" "después" "menos"
#> [7] "mismo" "ahora" "banda" "grupo" "versión" "letra"
#> [13] "ser" "siempre" "bien" "cantante" "dos" "momento"
#> [19] "parece" "sigue" "tema" "ver" "aquí" "así"
#> [25] "casa"
<- unique(c(to_remove,
to_remove
add_to_stop_words,"tan",
"sólo",
"así",
"aquí",
"hoy",
"va"))
<- subtitulos_proces %>%
subtitulos_proces_one_word unnest_tokens(input = texto,
output = word) %>%
filter(! word %in% to_remove) %>%
filter(nchar(word) > 1)
<- subtitulos_proces_one_word %>%
palabras_ordenadas_2 group_by(word) %>%
summarise(veces = n()) %>%
arrange(desc(veces))
%>%
palabras_ordenadas_2 slice(1:20) %>%
ggplot(aes(x = reorder(word, veces), y = veces)) +
geom_col(show.legend = FALSE) +
ylab("veces") +
xlab("") +
coord_flip() +
theme_bw()
También podemos ver ahora una nube de palabras
<- brewer.pal(8,"Dark2")
pal
%>%
subtitulos_proces_one_word group_by(word) %>%
count() %>%
with(wordcloud(word, n, random.order = FALSE, max.words = 80, colors=pal))
¿Polémicos?
Creamos lista de palabras polémicas (se aceptan otras, podéis poner en los comentarios)
<- c("abascal", "almeida", "ayuso", "belarra", "bloqueo",
palabras_polem "borbon", "borras", "calvo", "celaa", "cgpj", "cis",
"ciudada", "comunidad", "conde", "constitucional", "coron",
"democr", "democracia", "derech", "díaz", "dioni",
"errejon", "extremadura", "fach", "falcon", "feij",
"gobierno", "guardia", "iglesias", "illa", "ivan",
"izquier", "ley", "madrid","manipulador", "marlaska",
"marruecos","melilla", "militares", "minist", "monarca",
"montero","negacion", "negacionismo", "olona", "oposición",
"page", "pandem", "pp", "principe", "prisión", "psoe",
"redondo", "republic", "rey", "rufian", "rufián",
"sabina", "sanchez", "sánchez", "sanz","tezanos",
"toled", "trans", "transición", "tren", "ultra",
"vicepre", "vox", "yolanda", "zarzu", "zarzuela")
Y construimos una regex simple
<- paste0("^",paste(palabras_polem, collapse = "|^")))
(exp_regx #> [1] "^abascal|^almeida|^ayuso|^belarra|^bloqueo|^borbon|^borras|^calvo|^celaa|^cgpj|^cis|^ciudada|^comunidad|^conde|^constitucional|^coron|^democr|^democracia|^derech|^díaz|^dioni|^errejon|^extremadura|^fach|^falcon|^feij|^gobierno|^guardia|^iglesias|^illa|^ivan|^izquier|^ley|^madrid|^manipulador|^marlaska|^marruecos|^melilla|^militares|^minist|^monarca|^montero|^negacion|^negacionismo|^olona|^oposición|^page|^pandem|^pp|^principe|^prisión|^psoe|^redondo|^republic|^rey|^rufian|^rufián|^sabina|^sanchez|^sánchez|^sanz|^tezanos|^toled|^trans|^transición|^tren|^ultra|^vicepre|^vox|^yolanda|^zarzu|^zarzuela"
Y nos creamos una variable para identificar si es palabra polémica
<- subtitulos_proces_one_word %>%
subtitulos_proces_one_word mutate(polemica= str_detect(word, exp_regx))
<- subtitulos_proces_one_word %>%
subtitulos_polemicos filter(polemica) %>%
pull(n_fichero) %>%
unique()
subtitulos_polemicos#> [1] "00000018.jpg.subtitulo.tif.txt" "00000086.jpg.subtitulo.tif.txt"
#> [3] "00000100.jpg.subtitulo.tif.txt" "00000113.jpg.subtitulo.tif.txt"
#> [5] "00000127.jpg.subtitulo.tif.txt" "00000193.jpg.subtitulo.tif.txt"
#> [7] "00000209.jpg.subtitulo.tif.txt" "00000225.jpg.subtitulo.tif.txt"
#> [9] "00000242.jpg.subtitulo.tif.txt" "00000258.jpg.subtitulo.tif.txt"
#> [11] "00000289.jpg.subtitulo.tif.txt" "00000377.jpg.subtitulo.tif.txt"
#> [13] "00000475.jpg.subtitulo.tif.txt" "00000483.jpg.subtitulo.tif.txt"
#> [15] "00000522.jpg.subtitulo.tif.txt" "00000551.jpg.subtitulo.tif.txt"
#> [17] "00000563.jpg.subtitulo.tif.txt" "00000564.jpg.subtitulo.tif.txt"
#> [19] "00000566.jpg.subtitulo.tif.txt" "00000643.jpg.subtitulo.tif.txt"
#> [21] "00000706.jpg.subtitulo.tif.txt" "00000814.jpg.subtitulo.tif.txt"
#> [23] "00000846.jpg.subtitulo.tif.txt" "00000939.jpg.subtitulo.tif.txt"
#> [25] "00000945.jpg.subtitulo.tif.txt" "00000946.jpg.subtitulo.tif.txt"
#> [27] "00000997.jpg.subtitulo.tif.txt" "00001005.jpg.subtitulo.tif.txt"
#> [29] "00001006.jpg.subtitulo.tif.txt" "00001026.jpg.subtitulo.tif.txt"
#> [31] "00001030.jpg.subtitulo.tif.txt" "00001031.jpg.subtitulo.tif.txt"
#> [33] "00001061.jpg.subtitulo.tif.txt" "00001072.jpg.subtitulo.tif.txt"
#> [35] "00001112.jpg.subtitulo.tif.txt" "00001122.jpg.subtitulo.tif.txt"
#> [37] "00001132.jpg.subtitulo.tif.txt" "00001200.jpg.subtitulo.tif.txt"
#> [39] "00001231.jpg.subtitulo.tif.txt" "00001232.jpg.subtitulo.tif.txt"
#> [41] "00001276.jpg.subtitulo.tif.txt"
Y podemos ver en el texto original antes de tokenizar qué rótulos hemos considerado polémicos y qué texto
%>%
subtitulos_proces filter(n_fichero %in% subtitulos_polemicos) %>%
arrange(n_fichero) %>%
pull(texto) %>%
unique()
#> [1] "bienvenidos si estáis todos es porque habéis recordado que tras los cuartos van tu banco hacienda y el rey emérito"
#> [2] "la orquesta gente joven fue posponiendo el cambio de nombre como el psoe con la ley trans"
#> [3] "hace chacachá entonces podemos llamarlo y q tren de altas prestaciones de extremadura"
#> [4] "debieron traducir la letra con el google translate de la época el collins no phil sino el diccionario"
#> [5] "de imagen y de mensaje iban sobrados pp como samantha hudson pero con musicón"
#> [6] "rocío ya cumplía la ley de transparencia 23 años antes de su aproba"
#> [7] "en 2022 cayeron los muros de metacrilato ya sólo llevamos mascarilla en transporte orgías y atracos"
#> [8] "si tuviera sólo una pizca más de clase habría que aplicarle la ley celaá"
#> [9] "es muy raro ver actuar con tanta coordinación a quienes están a la izquierda"
#> [10] "como feos de pleno derecho por eso somos guionistas vamos a ofendernos un poco y ahora seguimos"
#> [11] "oes del silencio roe de leyenda"
#> [12] "la primera comunión 7 de macarena olona rena olona"
#> [13] "pa así eran las fiestas de nochevieja a antes de la ley antitabaco"
#> [14] "midge fue líder de ultravox y como veis domina el arte o del falsete el santiago abascal escocés"
#> [15] "niños no os preocupéis que en cuanto terminen la actuación los reyes magos se ponen con lo de los regalos"
#> [16] "su hombre blandengue ha servido para una campaña del ministerio de igualdad a ver cuándo le toca a la mandanga"
#> [17] "mn poner resistiré y salir al balcón a aplaudir a los militares"
#> [18] "recuperar el lema de la transición a follar que el mundo se va a acabar"
#> [19] "82 negarlo todo y seguir viviendo no como el resto de borregos que creen a los medios manipuladores"
#> [20] "esta leyenda de la música italiana cultivó con éxito el look llevo 15 días durmiendo en un ford fiesta"
#> [21] "necesitaron una pandemia mundial para dar el pelotazo a almeida le bastó con un saque de honor"
#> [22] "desde la atrevida ignorancia de algún panfleto le definieron como transformista supremacista asturiano"
#> [23] "me tienes aquí colgado es originalmente de las supremes hoy se canta en los centros médicos de la comunidad de madrid"
#> [24] "y se entiende perfectamente los disfraces de ardilla pp lo que más"
#> [25] "nos ha pedido pedro sánchez que os digamos que esta subida también es culpa de la guerra en ucrania"
#> [26] "izquierda derecha como veis tienen la postura tan sólidamente definida como el gobierno respecto al sahara"
#> [27] "la relación entre rufián y borrás tiene menos roces"
#> [28] "no dirás que no es doble negacionismo"
#> [29] "venga que esta nos la sabemos todos de mario conde al dioni"
#> [30] "sin documentos es mejor no quedarse q entreespaña y marruecos"
#> [31] "quín sabina to entre caballeros"
#> [32] "sabina pactó con unos ladrones hacerles esta copla y cumplió como lo del cgpj pero con gente responsable"
#> [33] "es incomprensible que los negacionistas no usaran este tema para protestar por las mascarillas"
#> [34] "y ahora que hemos localizado a la prima de mari carmen del hermano de ayuso sabéis algo"
#> [35] "en su último disco se han disfrazado de star wars ángeles de leia y dioni de maestro jedi"
#> [36] "transitando la fina línea que separa a danny zuko att del protagonista de una peli de eloy de la iglesia"
#> [37] "desde 2013 tina es ciudadana suiza allí disfruta de sus paisajes alpinos y un poco también de su régimen fiscal"
#> [38] "esas hombreras nos habrían venido muy bien para mantener la distancia social durante la pandemia"
#> [39] "catar no es una democracia sino una monarquía absoluta sin respeto por los derechos humanos dos"
#> [40] "el esfuerzo del coreógrafo es inútil la única forma de bailar esto es haciendo el trenecito"
#> [41] "g 1 cachitos es como el roscón de reyes a a siempre suele llevar abba dentro"
Y podemos ver los fotogramas.
# identificamos nombre del archivo jpg con los rótulos polémicos
<- unique(substr(subtitulos_polemicos, 1,12))
polemica_1_fotogramas
head(polemica_1_fotogramas)
#> [1] "00000018.jpg" "00000086.jpg" "00000100.jpg" "00000113.jpg" "00000127.jpg"
#> [6] "00000193.jpg"
# creamos la ruta completa donde están
<- paste0(str_glue("{root_directory}video/{anno}_jpg/"), polemica_1_fotogramas)
polemica_1_fotogramas_full
# añadimos sufijo subtitulo.tif para tenr localizado la imagen que tiene solo los rótulos
<- paste0(polemica_1_fotogramas_full,".subtitulo.tif") subtitulos_polemicos_1_full
Con la función image_read
del paquete magick
leemos las imágenes polémicas y los rótulos
<- map(polemica_1_fotogramas_full, image_read)
fotogramas_polemicos_img <- map(subtitulos_polemicos_1_full, image_read) subtitulos_polemicos_img
25]] subtitulos_polemicos_img[[
25]] fotogramas_polemicos_img[[
Podemos ver una muestra de algunos de ellos.
No es perfecto ( al meter ley o tren como palabras polémticas) pero bueno, nos vale.
set.seed(2023)
<- sort(sample(1:length(fotogramas_polemicos_img), 9))
indices
<- lapply(fotogramas_polemicos_img[indices], grid::rasterGrob)
lista_fotogram_polemicos ::grid.arrange(grobs=lista_fotogram_polemicos ) gridExtra
Y el recorte de los subtítulos que hicimos enla primera entrega.
<- lapply(subtitulos_polemicos_img[indices], grid::rasterGrob)
lista_subtitulos ::grid.arrange(grobs=lista_subtitulos) gridExtra
Tópicos
Aquí no me refiero a los tópicos de este país nuestro, sino a identificar si hay temas comunes a varios documentos.
Ya aviso que con tan pocos “documentos”, unos 488 y siendo tan cortos cada rótulo, es muy probable que no salga mucho..
Tópicos usando conteo de palabras.
Contamos palabras con 3 caracteres o más.
Guardamos la variable name
que nos indica en qué rótulo ha aparecido
<- subtitulos_proces_one_word %>%
word_counts group_by(name, word) %>%
count(sort=TRUE) %>%
mutate(ncharacters = nchar(word)) %>%
filter(
>= 3) %>%
ncharacters select(-ncharacters) %>%
ungroup()
length(unique(word_counts$name))
#> [1] 488
head(word_counts, 15)
#> # A tibble: 15 × 3
#> name word n
#> <dbl> <chr> <int>
#> 1 433 duran 3
#> 2 924 boom 3
#> 3 51 palabra 2
#> 4 181 voz 2
#> 5 269 enemigos 2
#> 6 269 john 2
#> 7 269 wayne 2
#> 8 355 plano 2
#> 9 377 olona 2
#> 10 396 iba 2
#> 11 455 montar 2
#> 12 492 gusta 2
#> 13 558 ropa 2
#> 14 598 calderón 2
#> 15 598 carlos 2
Ahora convertimos este data.frame
a un DocumentTermMatrix
# usamos como peso la TermFrequency de la palabra
<- word_counts %>%
rotulos_dtm cast_dtm(name, word, n, weighting = tm::weightTf)
rotulos_dtm#> <<DocumentTermMatrix (documents: 488, terms: 2478)>>
#> Non-/sparse entries: 3257/1206007
#> Sparsity : 100%
#> Maximal term length: 24
#> Weighting : term frequency (tf)
Podríamos haberlo visto en forma de filas = palabras y columnas = rótulo
%>%
word_counts cast_dfm(word, name, n)
#> Document-feature matrix of: 2,478 documents, 488 features (99.73% sparse) and 0 docvars.
#> features
#> docs 433 924 51 181 269 355 377 396 455 492
#> duran 3 0 0 0 0 0 0 0 0 0
#> boom 0 3 0 0 0 0 0 0 0 0
#> palabra 0 0 2 0 0 0 0 0 0 0
#> voz 0 0 0 2 0 0 0 0 0 0
#> enemigos 0 0 0 0 2 0 0 0 0 0
#> john 0 0 0 0 2 0 0 0 0 0
#> [ reached max_ndoc ... 2,472 more documents, reached max_nfeat ... 478 more features ]
Vamos a ver si sale algo haciendo un LDA (Latent Dirichlet Allocation)
Considero 7 tópicos porque me gusta el número 7. El que quiera elegir con algo más de criterio que se mire esto
# Cons
<- LDA(rotulos_dtm, k = 7, control = list(seed = 1234))
rotulos_lda
rotulos_lda#> A LDA_VEM topic model with 7 topics.
<- tidy(rotulos_lda)
rotulos_lda_td
rotulos_lda_td#> # A tibble: 17,346 × 3
#> topic term beta
#> <int> <chr> <dbl>
#> 1 1 duran 3.39e-75
#> 2 2 duran 3.55e-75
#> 3 3 duran 6.13e- 3
#> 4 4 duran 3.56e-75
#> 5 5 duran 3.18e-75
#> 6 6 duran 3.75e-75
#> 7 7 duran 3.63e-75
#> 8 1 boom 6.21e- 3
#> 9 2 boom 4.49e-75
#> 10 3 boom 4.23e-75
#> # … with 17,336 more rows
# se suele ordenar por beta que ahora mismo no recuerdo que era,
<- rotulos_lda_td %>%
top_terms group_by(topic) %>%
top_n(3, beta) %>%
ungroup() %>%
arrange(topic, -beta)
top_terms#> # A tibble: 34 × 3
#> topic term beta
#> <int> <chr> <dbl>
#> 1 1 disco 0.0124
#> 2 1 juan 0.0104
#> 3 1 hacer 0.00878
#> 4 2 mundo 0.0130
#> 5 2 gusta 0.00651
#> 6 2 bueno 0.00651
#> 7 2 salir 0.00651
#> 8 2 peret 0.00651
#> 9 3 fama 0.0123
#> 10 3 voz 0.00817
#> # … with 24 more rows
%>%
top_terms mutate(term = reorder_within(term, beta, topic)) %>%
ggplot(aes(term, beta)) +
geom_bar(stat = "identity") +
scale_x_reordered() +
facet_wrap(~ topic, scales = "free_x") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Pues la verdad es que yo no veo nada interesante
Tópicos usando tfidf como peso
Vamos a probar usando tfidf
Como la función LDA
no permite usar un DocumentTermMatrix
que se haya construido con cast_dtm
y usando como parámetro de weighting
el peso tm::weightTfIdf
nos construimos los datos de otra forma.
<- subtitulos_proces_one_word %>%
tf_idf_data filter(nchar(word)>2) %>%
group_by(name,word) %>%
summarise(veces_palabra = n()) %>%
bind_tf_idf(word, name, veces_palabra) %>%
ungroup()
%>%
tf_idf_data arrange(desc(veces_palabra)) %>%
head()
#> # A tibble: 6 × 6
#> name word veces_palabra tf idf tf_idf
#> <dbl> <chr> <int> <dbl> <dbl> <dbl>
#> 1 433 duran 3 0.6 6.19 3.71
#> 2 924 boom 3 0.75 6.19 4.64
#> 3 51 palabra 2 0.286 5.50 1.57
#> 4 181 voz 2 0.5 4.24 2.12
#> 5 269 enemigos 2 0.25 5.50 1.37
#> 6 269 john 2 0.25 4.80 1.20
Para cada palabra tenemos su tf_idf
dentro de cada rótulo en el que aparece
%>%
tf_idf_data filter(word== "izquierda")
#> # A tibble: 2 × 6
#> name word veces_palabra tf idf tf_idf
#> <dbl> <chr> <int> <dbl> <dbl> <dbl>
#> 1 242 izquierda 1 0.2 5.50 1.10
#> 2 946 izquierda 1 0.111 5.50 0.611
Como de nuevo LDA solo acepta peso con valores enteros, pues simplemente multiplicamos por 100 el tf_idf
y redondeamos
<- tf_idf_data %>%
dtm_long mutate(tf_idf_integer = round(100*tf_idf)) %>%
cast_dfm(name, word, tf_idf_integer)
<- LDA(dtm_long, k = 7, control = list(seed = 1234)) lda_model_long_1
<- tidy(lda_model_long_1, 'beta')
result
%>%
result group_by(topic) %>%
top_n(5, beta) %>%
ungroup() %>%
arrange(topic, -beta) %>%
mutate(term = reorder(term, beta)) %>%
ggplot(aes(term, beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free", ncol = 4) +
coord_flip()
Y claramente , yo sigo sin ver nada claro. Aunque me daría pistas para añadir más palabras a las stopwords
y para aceptar que para el tamaño de los documentos (unas pocas palabras por rótulo), quizá no valga el LDA.
Esta es la vida del analista de datos, prueba y error y sólo de vez en cuándo algún éxito.
Sólo con los rótulos polémicos
Asumiendo que parece que no tiene sentido hacer topicmodelling
sobre estos datos, me picó la curiosidad de ver qué pasaba si sólo usaba los rótulos polémicos.
<- subtitulos_proces_one_word %>%
tf_idf_data_polem filter(nchar(word)>2, polemica == TRUE) %>%
group_by(name,word) %>%
summarise(veces_palabra = n()) %>%
bind_tf_idf(word, name, veces_palabra) %>%
ungroup()
%>%
tf_idf_data_polem arrange(desc(veces_palabra)) %>%
head()
#> # A tibble: 6 × 6
#> name word veces_palabra tf idf tf_idf
#> <dbl> <chr> <int> <dbl> <dbl> <dbl>
#> 1 377 olona 2 1 3.66 3.66
#> 2 18 rey 1 1 3.66 3.66
#> 3 86 ley 1 0.333 2.28 0.759
#> 4 86 psoe 1 0.333 3.66 1.22
#> 5 86 trans 1 0.333 3.66 1.22
#> 6 100 extremadura 1 0.5 3.66 1.83
Topic modelling usando conteo de palabras
<- tf_idf_data_polem %>%
dtm_long_polem # filter(tf_idf > 0.00006) %>%
# filter(veces_palabra>1) %>%
cast_dtm(name, word, veces_palabra)
<- LDA(dtm_long_polem, k = 7, control = list(seed = 1234))
lda_model_long_polem
<- tidy(lda_model_long_polem, 'beta') result_polem
%>%
result_polem group_by(topic) %>%
top_n(5, beta) %>%
ungroup() %>%
arrange(topic, -beta) %>%
mutate(term = reorder(term, beta)) %>%
ggplot(aes(term, beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free", ncol = 4) +
coord_flip()
Y bueno parece que en el tópico 3 se meten juntos rótulos que hablan de pandemia y de negacionistas, ha podido ser casalidad, quién sabe.
Si vemos en qué tópico cae cada documento.
<- tidy(lda_model_long_polem, 'gamma')
result_documento_polem
%>%
result_documento_polem group_by(topic) %>%
top_n(5, gamma) %>%
ungroup() %>%
arrange(topic, -gamma) %>%
mutate(document = reorder(document, gamma)) %>%
ggplot(aes(document, gamma, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free", ncol = 4) +
coord_flip()
Veamos algunos subtítulos del tópico 3
%>%
subtitulos_proces filter(name %in% c(100, 706, 1061, 563)) %>%
pull(texto)
#> [1] "hace chacachá entonces podemos llamarlo y q tren de altas prestaciones de extremadura"
#> [2] "mn poner resistiré y salir al balcón a aplaudir a los militares"
#> [3] "necesitaron una pandemia mundial para dar el pelotazo a almeida le bastó con un saque de honor"
#> [4] "es incomprensible que los negacionistas no usaran este tema para protestar por las mascarillas"
<- result_documento_polem %>%
top_10_topic3 group_by(topic) %>%
top_n(10, gamma) %>%
filter(topic==3) %>%
pull(document)
%>%
subtitulos_proces filter(name %in% top_10_topic3) %>%
pull(texto)
#> [1] "hace chacachá entonces podemos llamarlo y q tren de altas prestaciones de extremadura"
#> [2] "es muy raro ver actuar con tanta coordinación a quienes están a la izquierda"
#> [3] "mn poner resistiré y salir al balcón a aplaudir a los militares"
#> [4] "necesitaron una pandemia mundial para dar el pelotazo a almeida le bastó con un saque de honor"
#> [5] "nos ha pedido pedro sánchez que os digamos que esta subida también es culpa de la guerra en ucrania"
#> [6] "no dirás que no es doble negacionismo"
#> [7] "quín sabina to entre caballeros"
#> [8] "es incomprensible que los negacionistas no usaran este tema para protestar por las mascarillas"
#> [9] "desde 2013 tina es ciudadana suiza allí disfruta de sus paisajes alpinos y un poco también de su régimen fiscal"
#> [10] "esas hombreras nos habrían venido muy bien para mantener la distancia social durante la pandemia"
Y bueno si que parece que ha agrupado algunos rótulos relacionados con la pandemia
Topic modelling usando tf_idf
<- tf_idf_data_polem %>%
dtm_long_polem_tf_idf mutate(tf_idf_integer = round(100 * tf_idf)) %>%
cast_dfm(name, word, tf_idf_integer)
<- LDA(dtm_long_polem_tf_idf, k = 7, control = list(seed = 1234))
lda_model_long_polem_tf_idf
<- tidy(lda_model_long_polem_tf_idf, 'beta') result_polem_tf_idf
%>%
result_polem_tf_idf group_by(topic) %>%
top_n(5, beta) %>%
ungroup() %>%
arrange(topic, -beta) %>%
mutate(term = reorder(term, beta)) %>%
ggplot(aes(term, beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free", ncol = 4) +
coord_flip()
Y no parece tan diferente. Veamos el tópico 4
<- tidy(lda_model_long_polem_tf_idf, 'gamma')
result_documento_polem_tf_idf
%>%
result_documento_polem_tf_idf group_by(topic) %>%
top_n(5, gamma) %>%
ungroup() %>%
arrange(topic, -gamma) %>%
mutate(document = reorder(document, gamma)) %>%
ggplot(aes(document, gamma, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free", ncol = 4) +
coord_flip()
Veamos algunos subtítulos del tópico 4
<- result_documento_polem_tf_idf %>%
top_5_topic4 group_by(topic) %>%
top_n(5, gamma) %>%
filter(topic==4) %>%
pull(document)
%>%
subtitulos_proces filter(name %in% top_5_topic4) %>%
pull(texto)
#> [1] "la orquesta gente joven fue posponiendo el cambio de nombre como el psoe con la ley trans"
#> [2] "como feos de pleno derecho por eso somos guionistas vamos a ofendernos un poco y ahora seguimos"
#> [3] "izquierda derecha como veis tienen la postura tan sólidamente definida como el gobierno respecto al sahara"
#> [4] "es incomprensible que los negacionistas no usaran este tema para protestar por las mascarillas"
#> [5] "el esfuerzo del coreógrafo es inútil la única forma de bailar esto es haciendo el trenecito"
Y bueno no lo veo tan poco muy claro.
Otras pruebas realizadas
- En vez de considerar que cada rótulo es un documento, consideré los rótulos correspondientes a la primera parte del programa, a la segunda, y así hasta 10. pero no se obtuvo nada consistente
Y bueno aquí acaba el análisis del cachitos de este año, salvo que alguien tenga interés en que haga alguna prueba o mejore algo.
Feliz 2023 a todos