R-为什么LDA预测不正确



步骤1

我正在使用R和"主题模型"软件包来从4.5k文档语料库中构建LDA模型。我采取了通常的预处理步骤(停止词,剪裁低/高词频率,捕捉),最终得到了我很满意的100个主题模型。实际上,这几乎是满足我需求的完美模型。

justlda <- LDA(k=100, x=dtm_lemma, method="Gibbs", control=control_list_gibbs)

步骤2

然后,

i然后使用与上述新的相同的过程(模型看不见的)300文档语料库进行预处理,然后将其转换为文档 - 期限矩阵,然后使用同一软件包的"后验"功能来预测新数据的主题。此语料库来自同一作者,与训练集非常相似。

我的问题

我得到的预测(后验概率)是完全错误的。这是我用来获取后验的代码:

topics = posterior(justlda, dtm_lemma, control = control_list_gibbs)$topics
  • JustLda是在步骤1中使用整个语料库构建的模型。
  • dtm_lemma是新数据的预处理的文档矩阵。
  • 控制是LDA参数(两者相同)。

我觉得预测不仅是错误的,而且主题的权重很低。没有什么可以作为主题的主题。(对于这100个主题模型,大多数主题的出现为0.08,我很幸运能获得0.20重量,甚至不相关...)

我获得了NLP/LDA和R语言的经验不到一年。我觉得我可以在某个地方犯一个非常业余的错误,可以解释错误的预测?

这种结果是正常的吗?我可能会做什么错?

我不是100%确定您的意思是'错误'。我进行了快速测试,以查看posterior是否在新数据上工作。首先,我运行一个模型,其中包括AssociatedPress数据集的所有文档:

library(topicmodels)
data("AssociatedPress")
ap_lda <- LDA(AssociatedPress, k = 5, control = list(seed = 1234))

从您的问题中,我怀疑您在此处查看每个文档的主题。为了保持可比性,我根据一些整洁的软件包建立自己的方式来在这里找到这些方法:

library(tidytext)
library(dplyr)
library(tidyr)
ap_documents <- tidy(ap_lda, matrix = "gamma")
ap_documents %>% 
  group_by(document) %>% 
  top_n(1, gamma) %>% # keep only most likely topic
  arrange(document)
# A tibble: 2,246 x 3
# Groups:   document [2,246]
   document topic gamma
      <int> <int> <dbl>
 1        1     4 0.999
 2        2     2 0.529
 3        3     4 0.999
 4        4     4 0.518
 5        5     4 0.995
 6        6     2 0.971
 7        7     1 0.728
 8        8     2 0.941
 9        9     4 0.477
10       10     5 0.500
# ... with 2,236 more rows

现在,我再次运行相同的LDA,但拒绝前10个文档:

AssociatedPress_train <- AssociatedPress[11:nrow(AssociatedPress), ]
AssociatedPress_test <- AssociatedPress[1:10, ]
ap_lda <- LDA(AssociatedPress_train, k = 5, control = list(seed = 1234))

我使用 posterior获取每个文档的伽马值,然后再次保留最有可能的伽马值:

posterior(object = ap_lda, newdata = AssociatedPress_test)$topics %>%
  as_tibble() %>% 
  mutate(document = seq_len(nrow(.))) %>% 
  gather(topic, gamma, -document) %>% 
  group_by(document) %>% 
  top_n(1, gamma) %>% # keep only most probable topic
  arrange(document)
# A tibble: 10 x 3
# Groups:   document [10]
   document topic gamma
      <int> <chr> <dbl>
 1        1 4     0.898
 2        2 2     0.497
 3        3 4     0.896
 4        4 4     0.468
 5        5 4     0.870
 6        6 2     0.754
 7        7 1     0.509
 8        8 2     0.913
 9        9 4     0.476
10       10 2     0.399

除文档10外,所有内容都具有与以前相同的主题。所以一切似乎都很好!因此,我看不到您的代码直接问题。

我尚未测试的一件事是,如果培训和测试集的DTM具有不同的列,会发生什么。我怀疑这是一个问题。

这是您如何处理的一个快速示例:

text1 <- tibble(doc = 1, word = LETTERS[1:10])
text2 <- tibble(doc = 1, word = LETTERS[2:11])
dtm1 <- text1 %>%
  count(doc, word) %>%
  arrange(word) %>%
  cast_dtm(doc, word, n)
dtm2 <- text2 %>%
  count(doc, word) %>%
  arrange(word) %>%
  cast_dtm(doc, word, n)
all.equal(dtm1$dimnames$Terms, dtm2$dimnames$Terms)
[1] "10 string mismatches"

我做了两个DTM,其中第二个具有额外的术语,并且缺少一个术语。因此,昏暗的名称是不同的。我们可以通过将DTM重新带回整洁的格式,删除额外的术语并添加缺失的术语,然后再施放DTM之前,将它们与众不同:

dtm2_clean <- tidy(dtm2) %>% 
  filter(term %in% dtm1$dimnames$Terms) %>% 
  rbind(tibble(document = 1, 
               term = dtm1$dimnames$Terms, # adding term but no counts
               count = 0)) %>% 
  arrange(term) %>% 
  cast_dtm(document, term, count)
all.equal(dtm1$dimnames$Terms, dtm2_clean$dimnames$Terms)
[1] TRUE

您现在可以将其用作后部的newdata。

相关内容

  • 没有找到相关文章

最新更新