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