[英]Topic Modelling: LDA , word frequency in each topic and Wordcloud
問題:如何計算和編碼每個主題中的單詞出現頻率? 我的目標是從每個主題創建“詞雲”。
PS>我對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))
謝謝(我試圖使問題盡可能簡潔,因此,如果您需要更多詳細信息,我可以添加更多內容。)
如果要為每個主題創建一個詞雲,則需要的是每個主題的熱門術語,即,從每個主題生成的最有可能的單詞。 這個概率叫做beta
; 這是每個主題每個單詞的概率。 該概率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)
根據每個主題的詞( dtm[,topterms]
)獲取DTM
的子集,並獲取子集的文檔術語矩陣的列總和( 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)
))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.