1

質問:各トピックの単語の頻度をどのように計算してコード化できますか? 私の目標は、各トピックから「Word Cloud」を作成することです。トピックモデリング:LDA、各トピックの単語頻度とWordcloud

P.S.>私はワードクラウドに問題はありません。コードから

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確率を出すことができます。サンプルのデータセットを見て、2つのトピックを使用してモデルを適合させましょう。

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

ありがとうジュリア!あなたのコードと下の紳士のコードを勉強しています....ありがとう! –

+0

行列「ベータ」から単語をプロットする方法を教えてください。厚さは私のコードでは頻度です。 wordcloud(words = d $ term、freq = d $ freq、min.freq = 1、 max.words = 200、random.order = FALSE、rot.per = 0.35、 colors = brewer.pal(8、 Dark2 ")) –

+0

投稿を編集してwordcloudのコードを追加しました。 –

1

サブセットを取ります各トピックの単語(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) 
)) 
+0

こんにちはLukeAだけ迅速な返信....返信いただきありがとうございます。私はそれを試し、あなたに後で戻ってきます。 –

+0

@Schatchawan心配する必要はありません。 – lukeA

関連する問題