Machine-Learning
主題模型中的主題穩定性
我正在做一個項目,我想提取一些關於一系列開放式論文內容的信息。在這個特定的項目中,148 人寫了關於一個假設的學生組織的文章,作為一個更大的實驗的一部分。雖然在我的領域(社會心理學)中,分析這些數據的典型方法是手工編寫文章,但我想定量地做這件事,因為手工編碼對我來說既費力又有點過於主觀品嚐。
在我對定量分析自由響應數據的方法進行調查時,我偶然發現了一種稱為主題建模(或潛在狄利克雷分配,或 LDA)的方法。主題建模採用數據的詞袋表示(術語文檔矩陣),並使用有關詞共現的信息來提取數據的潛在主題。這種方法似乎非常適合我的應用程序。
不幸的是,當我將主題建模應用於我的數據時,我發現了兩個問題:
- 主題建模揭示的主題有時難以解釋
- 當我使用不同的隨機種子重新運行主題模型時,主題似乎發生了巨大變化
問題 2 尤其令我擔憂。因此,我有兩個相關的問題:
- 我可以在 LDA 程序中做些什麼來優化我的模型擬合程序的可解釋性和穩定性嗎?就個人而言,我不太關心找到具有最低困惑度和/或最佳模型擬合的模型——我主要想使用這個程序來幫助我理解和描述本研究參與者在他們的論文中寫的內容。但是,我當然不希望我的結果成為隨機種子的產物!
- 與上述問題相關,是否有關於您需要多少數據進行 LDA 的標準?我看到的大多數使用這種方法的論文都分析了大型語料庫(例如,過去 20 年所有科學論文的存檔),但是,由於我使用的是實驗數據,我的文檔語料庫要小得多。
我已經在這里為任何想要弄髒他或她的手的人發布了論文數據,並且我在下面粘貼了我正在使用的 R 代碼。
require(tm) require(topicmodels) # Create a corpus from the essay c <- Corpus(DataframeSource(essays)) inspect(c) # Remove punctuation and put the words in lower case c <- tm_map(c, removePunctuation) c <- tm_map(c, tolower) # Create a DocumentTermMatrix. The stopwords are the LIWC function word categories # I have a copy of the LIWC dictionary, but if you want to do a similar analysis, # use the default stop words in tm dtm <- DocumentTermMatrix(c, control = list(stopwords = c(dict$funct, dict$pronoun, dict$ppron, dict$i, dict$we, dict$you, dict$shehe, dict$they, dict$inpers, dict$article, dict$aux))) # Term frequency inverse-document frequency to select the desired words term_tfidf <- tapply(dtm$v/rowSums(as.matrix(dtm))[dtm$i], dtm$j, mean) * log2(nDocs(dtm)/colSums(as.matrix(dtm))) summary(term_tfidf) dtm <- dtm[, term_tfidf >= 0.04] lda <- LDA(dtm, k = 5, seed = 532) perplexity(lda) (terms <- terms(lda, 10)) (topics <- topics(lda))
編輯:
我嘗試
nstart
按照 Flounderer 在評論中的建議進行修改。不幸的是,如下所示,即使設置nstart
為 1000 也會導致從隨機種子到隨機種子的主題差異很大。再次強調一下,我在下面兩個模型的估計中唯一改變的是用於開始模型估計的隨機種子,但是在這兩個運行中主題似乎根本不一致。lda <- LDA(dtm, k = 5, seed = 535, control = list(nstart = 1000)) (terms <- terms(lda, 10)) Topic 1 Topic 2 Topic 3 Topic 4 Topic 5 [1,] "international" "ethnicity" "free" "credit" "kind" [2,] "communicate" "true" "team" "mandatory" "bridge" [3,] "gain" "asians" "cooperate" "music" "close" [4,] "use" "hand" "order" "seen" "deal" [5,] "big" "hold" "play" "barrier" "designed" [6,] "communication" "effective" "big" "stereotypes" "effort" [7,] "america" "emphasis" "beginning" "asians" "implemented" [8,] "chinese" "halls" "china" "fantastic" "websites" [9,] "ethnicity" "minorities" "difference" "focusing" "planned" [10,] "networks" "population" "easier" "force" "body" lda <- LDA(dtm, k = 5, seed = 536, control = list(nstart = 1000)) (terms <- terms(lda, 10)) Topic 1 Topic 2 Topic 3 Topic 4 Topic 5 [1,] "kind" "international" "issue" "willing" "play" [2,] "easier" "ethnicity" "close" "use" "trying" [3,] "gain" "communication" "currently" "hand" "unity" [4,] "websites" "communicate" "implemented" "networks" "decision" [5,] "credit" "bridge" "particularly" "stereotypes" "gap" [6,] "effort" "america" "credit" "communicate" "normally" [7,] "barriers" "connection" "fulfill" "came" "asians" [8,] "effects" "kind" "grew" "asians" "created" [9,] "established" "order" "perspectives" "big" "effective" [10,] "strangers" "skills" "big" "budget" "prejudice"
為了我自己的好奇心,我將我一直在研究的聚類算法應用於這個數據集。
我暫時把結果放在這裡(選擇essays dataset)。
似乎問題不在於起點或算法,而在於數據。即使有 147 個實例,只要有一些隱藏的主題/概念/主題/集群(無論您想調用什麼),您都可以“合理地”(主觀地,以我有限的經驗)獲得良好的集群。
如果數據沒有很好地分離主題,那麼無論您使用哪種算法,您都可能得不到好的答案。