LDA 实践

R 自然语言处理入门

Kasey Jones

Research Data Scientist

确定 LDA 结果

  • 选择主题数量
    • 困惑度/其他指标
    • 适合您情境的可行方案
R 自然语言处理入门

困惑度(Perplexity)

  • 衡量概率模型对新数据的拟合程度
  • 越低越好
  • 用于比较模型
    • 用于 LDA 参数调优
    • 选择主题数
sample_size <- floor(0.90 * nrow(doc_term_matrix))
set.seed(1111)
train_ind <- sample(nrow(doc_term_matrix), size = sample_size)
train <- matrix[train_ind, ]
test <- matrix[-train_ind, ]
1 https://en.wikipedia.org/wiki/Perplexity
R 自然语言处理入门

R 中的困惑度

library(topicmodels)
values = c()
for(i in c(2:35)){
  lda_model <- LDA(train, k = i, method = "Gibbs",
                   control = list(iter = 25, seed = 1111))
  values <- c(values, perplexity(lda_model, newdata = test))  
}
plot(c(2:35), values, main="Perplexity for Topics", 
     xlab="Number of Topics", ylab="Perplexity")
R 自然语言处理入门

再次看困惑度!

困惑度衡量模型对新数据的泛化能力。

R 自然语言处理入门

实用选择

  • 情境可承载多少主题
    • 20 个可能难以覆盖
  • 如何展示结果
    • 显示 5 个主题的图表比 100 个更易读
  • 经验法则:
    • 用较少主题,每个主题由多篇文档代表
    • 仅在有时间深入探索和拆解每个主题时使用大量主题
R 自然语言处理入门

使用结果

  • 审核或请评审为每个主题找出"主题词"
    • 向评审提供该主题的高频词列表
    • 向评审提供该主题的代表性文档列表
R 自然语言处理入门

审阅输出

betas <- tidy(lda_model, matrix = "beta")
betas %>%
  filter(topic == 1) %>%
  arrange(desc(beta)) %>%
  select(term)
# A tibble: 2,000 x 1
   term    
   <chr>   
 1 athletic   
 2 quick 
 3 strong    
 4 tough    
...
gammas <- tidy(lda_model, matrix = "gamma")
gammas %>%
  filter(topic == 1) %>%
  arrange(desc(gamma)) %>%
  select(document)
# A tibble: 1,000 x 1
   document
   <chr>   
 1 232     
 2 292     
 3 921    
 4 643    
 5 468
R 自然语言处理入门

汇总输出

gammas <- tidy(lda_model, matrix = "gamma")
gammas %>%
  group_by(document) %>%
  arrange(desc(gamma)) %>%
  slice(1) %>%
  group_by(topic) %>% 
  tally(topic, sort=TRUE)
  topic     n
1     1  1326
2     5  1215
3     4   804
...
R 自然语言处理入门

再次汇总输出

gammas %>%
  group_by(document) %>%
  arrange(desc(gamma)) %>%
  slice(1) %>%
  group_by(topic) %>% 
  summarize(avg=mean(gamma)) %>%
  arrange(desc(avg))
  topic   avg
1     1 0.696
2     5 0.530
3     4 0.482
...
R 自然语言处理入门

LDA 练习。

R 自然语言处理入门

Preparing Video For Download...