1

问题:我如何计算和码字的各主题中的频率是多少? 我的目标是从每个主题创建“词云”。主题建模:LDA,词频每个主题和Wordcloud

附注:>我有wordcloud没有问题。

从代码,

burnin <- 4000 #We do not collect this. 
    iter <- 4000 
    thin <- 500 
    seed <-list(2017,5,63,100001,765) 
    nstart <- 5 
    best <- TRUE 
    #Number of topics: 
    k <- 4 
    LDA_results <-LDA(DTM,k, method="Gibbs", control=list(nstart=nstart, 
          seed = seed, best=best, 
          burnin = burnin, iter = iter, thin=thin)) 

谢谢 (我尽量让问题尽可能简明,所以如果你需要进一步的细节,我可以添加更多)。

回答

2

如果你想创建一个wordcloud每个主题,你想要的是每个主题,即从每个主题中产生的最有可能的话顶条款。这个概率被称为beta;它是每个词的每个词的概率。 β的概率越高,从该主题生成该单词的概率就越高。

您可以使用tidytext中的tidy从您的LDA主题模型中整理数据框中的beta概率。我们来看一个示例数据集,并使用两个主题来拟合一个模型。

library(tidyverse) 
library(tidytext) 
library(topicmodels) 

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

您的模型现在已经合体!现在,我们可以弄清楚概率。

ap_topics <- tidy(ap_lda, matrix = "beta") 

ap_topics 
#> # A tibble: 20,946 x 3 
#> topic  term   beta 
#> <int>  <chr>  <dbl> 
#> 1  1  aaron 1.686917e-12 
#> 2  2  aaron 3.895941e-05 
#> 3  1 abandon 2.654910e-05 
#> 4  2 abandon 3.990786e-05 
#> 5  1 abandoned 1.390663e-04 
#> 6  2 abandoned 5.876946e-05 
#> 7  1 abandoning 2.454843e-33 
#> 8  2 abandoning 2.337565e-05 
#> 9  1  abbott 2.130484e-06 
#> 10  2  abbott 2.968045e-05 
#> # ... with 20,936 more rows 

他们都混在那里。让我们使用dplyr来获取每个主题的最可能的术语。

ap_top_terms <- ap_topics %>% 
    group_by(topic) %>% 
    top_n(200, beta) %>% 
    ungroup() %>% 
    arrange(topic, -beta) 

现在,您可以使用此做出wordcloud(有一些整形)。 beta概率是你想要对应的单词有多大。

library(wordcloud) 
library(reshape2) 

ap_top_terms %>% 
    mutate(topic = paste("topic", topic)) %>% 
    acast(term ~ topic, value.var = "beta", fill = 0) %>% 
    comparison.cloud(colors = c("#F8766D", "#00BFC4"), 
        max.words = 100) 

+0

谢谢Julia!我正在研究你的代码和下面这位先生的代码....谢谢! –

+0

请你给我一些指导如何从矩阵“测试版”中绘制wordcloud。我的代码中的厚度在频率范围内。 wordcloud(字= d $术语,FREQ = d $频率,min.freq = 1, max.words = 200,random.order = FALSE,rot.per = 0.35, 颜色= brewer.pal(8“ Dark2“)) –

+0

编辑帖子以添加wordcloud的代码。 –

1

采取的一个子集您DTM根据每个主题的话(dtm[,topterms]),并采取子集化的文档词矩阵的列总和(slam::col_sums)。例如: -

library(topicmodels) 
library(tm) 
library(wordcloud) 
txt <- c(world="Hello hello world world world foo", foo="foo foo bar fizz") 
dtm <- DocumentTermMatrix(VCorpus(VectorSource(txt))) 
lda <- LDA(dtm, control = list(alpha = 0.1), k = 2) 
freqlst <- lapply(
    terms(lda, thres=.2, simplify=F), 
    function(topterms) slam::col_sums(dtm[,topterms]) 
) 
par(mfrow = c(1,2)) 
invisible(lapply(freqlst, function(x) 
    wordcloud(names(x), x, min.freq = 0) 
)) 
+0

嗨LukeA只是一个快速回复....谢谢你的回复。我会试一试,稍后再回复。 –

+0

@Schatchawan无后顾之忧。 – lukeA