#r #lda #topicmodels
#r #lda #topicmodels
Вопрос:
У меня есть LDA_Gibbs topicmodel из topicmodels
библиотеки. У меня также есть интерактивная визуализация LDAvis.
Моя проблема в том, что темы расположены не в том же порядке в объекте LDA и в LDAvis.
Я бы хотел, чтобы один отображался на другой (неважно, какой). Мой подход пока не работает:
ldavis_data <- fromJSON(json_lda)
topic_order <- ldavis_data$topic.order
lda@gamma[order(topic_order), ]
lda@beta[, order(topic_order)]
вдохновленный этой проблемой github — другой пакет модели темы
однако это полностью блокирует мой объект LDA.
Нет reprex / MWE (пока; я мог бы связать файл .rds) — но вывод glimpse (lda):
<snip>
..@ beta :num [1:45, 1:333...]
..@ gamma :num [1:111..., 1:45]
</snip>
на данный момент я вручную сопоставляю темы ldavis с параллелями объектов LDA().
—- РЕДАКТИРОВАТЬ —-
Я нашел разумную временную остановку, почти: мой дальнейший анализ опирается на порядок.Функция LDA из tidytext, чтобы я мог добавить правильный порядок сопоставления тематических терминов следующим образом:
# terms to topics
tidy(lda, matrix = "beta") %>%
# probably unnecessary, but make sure we're in topic order
arrange(topic) %>%
# turn topics into a factor, with levels according to new order
mutate(topic = factor(topic, levels = topic_order) %>%
# group by new factor order
group_by(topic) %>%
# make the current group id the current topic
mutate(topic = cur_group_id()) %>%
# dont forget! had me scratching my head for a few minutes
ungroup
# documents to topics
tidy(lda, matrix = "gamma") %>%
arrange(topic) %>%
mutate(topic = factor(topic, levels = topic_order) %>%
group_by(topic) %>%
mutate(topic = cur_group_id()) %>%
ungroup
Да, работает и для сопоставления документов. Теперь, чтобы свернуть их в функцию 😉
Ответ №1:
Повторяю мою правку в качестве ответа, но пока не склонен ее принимать.
Я получаю желаемые результаты, конечно; но не так, как я хотел.
Я нашел разумную временную остановку, почти: мой дальнейший анализ опирается на tidy.LDA()
функцию из tidytext, поэтому я могу добавить правильный порядок сопоставления тематических терминов следующим образом:
# terms to topics
tidy(lda, matrix = "beta") %>%
# probably unnecessary, but make sure we're in topic order
arrange(topic) %>%
# turn topics into a factor, with levels according to new order
mutate(topic = factor(topic, levels = topic_order) %>%
# group by new factor order
group_by(topic) %>%
# make the current group id the current topic
mutate(topic = cur_group_id()) %>%
# dont forget! had me scratching my head for a few minutes
ungroup
# documents to topics
tidy(lda, matrix = "gamma") %>%
arrange(topic) %>%
mutate(topic = factor(topic, levels = topic_order) %>%
group_by(topic) %>%
mutate(topic = cur_group_id()) %>%
ungroup
Да, работает и для сопоставления документов. Теперь, чтобы свернуть их в функцию 😉
Ответ №2:
Я думаю order()
, что это проблема, а также я думаю, что вы пытались упорядочить столбцы, когда вам нужно упорядочить строки, и наоборот. Предполагая, что вы создали хороший LDAvis на основе вашего подхода topicmodels, это должно помочь их синхронизировать:
ldavis_data <- fromJSON(json_lda)
topic_order <- ldavis_data$topic.order
lda@gamma[,topic_order]
lda@beta[topic_order,]
Кроме того, если вы хотите, чтобы данные phi и theta отображались в LDAvis из модели, созданной с помощью пакета topicmodels, вы можете сделать следующее:
lda_posterior <- posterior(lda)
lda_theta <- lda_posterior $topics[,topic_order]
lda_phi <- lda_posterior $terms[topic_order,]