Восстановить исходный идентификатор документа из объекта lda

Я пытаюсь сравнить «консенсусное» предсказание темы (бета) по терминам (в заданном документе) с наиболее вероятной предсказанной темой из самого документа (гамма), используя функции из topicmodels. Хотя легко извлечь наиболее вероятную предсказанную тему из документа, используя groupby() над документом и выбирая top_n() в гамме, но в «бета-оценке» уникальный идентификатор документа будет подавлен в выводе, вывод содержит только три столбца (topic , term, beta). Это не позволяет получить «консенсусное» предсказание темы (бета) из терминов для данного документа.

Используя мои собственные данные в качестве примера:

Sys.setlocale("LC_ALL","Chinese")  # reset to simplified Chinese encoding as the text data is in Chinese
library(foreign)
library(dplyr)
library(plyr)
library(tidyverse)
library(tidytext)
library(tm)
library(topicmodels)

sample_dtm <- readRDS(gzcon(url("https://www.dropbox.com/s/gznqlncd9psx3wz/sample_dtm.rds?dl=1")))

lda_out <- LDA(sample_dtm, k = 2, control = list(seed = 1234))

word_topics <- tidy(lda_out, matrix = "beta")

head(word_topics, n = 4)
# A tibble: 6 x 3
  topic term      beta
  <int> <chr>    <dbl>
1     1 费解  8.49e- 4
2     2 费解  1.15e- 9
3     1 上    2.92e- 3

document_gamma <- tidy(lda_out, matrix = "gamma")

head(document_gamma, n = 4)
# A tibble: 6 x 3
  document topic   gamma
  <chr>    <int>   <dbl>
1 1203232      1 0.00374
2 529660       1 0.0329 
3 738921       1 0.00138
4 963374       1 0.302

Могу ли я в любом случае восстановить идентификатор документа из вывода lda и объединить его с оценкой beta (word_topics, которая хранится как объект data.frame)? Таким образом, будет намного проще сравнить предполагаемую тему из консенсуса beta с темой из gamma.


person Chris T.    schedule 16.05.2019    source источник


Ответы (1)


Если я правильно вас понимаю, я считаю, что вам нужна функция augment(), который возвращает таблицу с одной строкой на исходную пару документ-термин, связанную с темами.

Sys.setlocale("LC_ALL","Chinese")  # reset to simplified Chinese encoding as the text data is in Chinese
#> Warning in Sys.setlocale("LC_ALL", "Chinese"): OS reports request to set
#> locale to "Chinese" cannot be honored
#> [1] ""
library(foreign)
library(dplyr)
library(plyr)
#> -------------------------------------------------------------------------
#> You have loaded plyr after dplyr - this is likely to cause problems.
#> If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
#> library(plyr); library(dplyr)
#> -------------------------------------------------------------------------
#> 
#> Attaching package: 'plyr'
#> The following objects are masked from 'package:dplyr':
#> 
#>     arrange, count, desc, failwith, id, mutate, rename, summarise,
#>     summarize
library(tidyverse)
library(tidytext)
library(tm)
library(topicmodels)

sample_dtm <- readRDS(gzcon(url("https://www.dropbox.com/s/gznqlncd9psx3wz/sample_dtm.rds?dl=1")))

lda_out <- LDA(sample_dtm, k = 2, control = list(seed = 1234))

augment(lda_out, sample_dtm)
#> # A tibble: 18,676 x 4
#>    document term     count .topic
#>    <chr>    <chr>    <dbl>  <dbl>
#>  1 649      作揖         1      1
#>  2 649      拳头         1      1
#>  3 649      赞           1      1
#>  4 656      住           1      1
#>  5 656      小区         1      1
#>  6 656      没           1      1
#>  7 656      注意         2      1
#>  8 1916     中国         1      1
#>  9 1916     中国台湾     1      1
#> 10 1916     反对         1      1
#> # … with 18,666 more rows

Создано 4 июня 2019 г. с помощью пакета reprex (v0.2.1)

Это связывает идентификатор документа из модели LDA с темами. Похоже, вы это уже поняли, но повторюсь:

  • матрица beta - это вероятности слова-темы
  • матрица gamma - это вероятности темы документа
person Julia Silge    schedule 04.06.2019
comment
Вау, большое спасибо @Julia за разъяснения, это намного проще, чем я думал. (Извините, что не заметил вашего ответа раньше) - person Chris T.; 01.08.2019