Hola a todos.
He realizado un modulado de tópicos de respuestas a una pregunta abierta realizada en una encuesta. SIn embargo, mi interés es poder crear una red de palabras de cada tópico de manera independiente y crear posteriormente una red de palabras de todos los temas, donde se puedan observar las conexiones entre los tópicos obtenidos.
A continuación adjunto mi código, con la esperanza de que alguien me pueda orientar en la construcción de redes de palabras
options(repos = c(CRAN = "https://cloud.r-project.org"))
library(tidyverse)
library(tidytext)
library(readxl)
library(dplyr)
library(topicmodels)
library(udpipe)
encuesta <- read_xlsx("D:/University/Ayudantías/Trabajo con BD final/Nueva carpeta/Socialización digital adultos. Base en crudo (1).xlsx")
glimpse(encuesta)
##Preprocesamiento del texto##
#Cargo el modelo udpipe#
modelo_sp <- udpipe_load_model(file = "D:/University/Ayudantías/Trabajo con BD final/Nueva carpeta/spanish-ancora-ud-2.5-191206.udpipe") # cargamos el modelo en memoria
encuesta_anotadas <- udpipe_annotate(
object = modelo_sp, # el modelo de idioma
x = encuesta$significado_particip, # el texto a anotar,
doc_id = encuesta$id, # el id de cada oracion (el resultado tendrá 1 palabra x fila)
trace = 20
) %>% as.data.frame(.) # convertimos el resultado en data frame
#Filtro palabras m'as significativas#
library(stopwords)
encuesta_anotadas2 <- encuesta_anotadas %>%
filter(upos=="ADJ"| upos=="VERB"| upos=="NOUN") %>% # filtramos por tipo de palabra
select( doc_id, lemma ) %>% # seleccionamos solo las columnas que nos interesan, esto no es necesario
filter(!lemma %in% stopwords::stopwords(language = "es")) %>% # filtrar las que no están en la tabla de stopwords
filter(!lemma %in% c("d", "dar", "Dar", "día", "pais", "q", "ver", "y", "o", "ser", "decir", "tener", "haber", "estar", "hacer", "ver", "leer","ir")) %>% # filtramos verbos muy comunes
filter(!lemma %in% c("año","dia","vez")) # filtramos palabras típicas del género de los documentos
glimpse(encuesta_anotadas2)
###Vectorizacion del texto#####
encuesta_dtm <- encuesta_anotadas2 %>%
count(doc_id, lemma, sort = TRUE) %>% # contamos palabras x documento
cast_dtm(doc_id, lemma, n) # convertimos a vector
encuesta_dtm
###APLICAR LDA##
library(topicmodels)
k_topics <- 7 # numero de topicos
encuesta_tm <- topicmodels::LDA(
encuesta_dtm, # vector de terminos por documentos
k = k_topics, # cantidad de topicos
method = "Gibbs", # metodo de sampleo de los documentos
control = list(seed = 1:5, nstart=5, verbose=1000))
encuesta_tm
####Exportar resultados en formato beta y gamma###
encuesta_tm_beta <- tidy(encuesta_tm, matrix = "beta")
encuesta_tm_gamma <- tidy(encuesta_tm, matrix = "gamma")
glimpse(encuesta_tm_beta)
glimpse(encuesta_tm_gamma)
####listamos los terminos que mas contribuyen a cada topico####
encuesta_tm_beta %>% # principales términos en cada tópico
group_by(topic) %>%
top_n(15) %>%
ungroup() %>%
arrange(topic, -beta) %>% # vamos a mostrarlo como grafico
ggplot(aes(x=reorder(term, (beta)),y=beta)) +
geom_col() +
facet_wrap(~topic, scales = "free_y") +
coord_flip() +
theme_minimal()