Могу ли я вручную изменить порядок LDA_Gibbs topicmodel

#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,]