LDA訓練出主題之後,怎麼再通過主題計算出一篇文檔對於所有主題的分布呢?

如題

從文檔中已經訓練出主題

然後想得到所有主題對於每篇文檔的分布

lda菜鳥,求大大們幫忙解答一下


謝邀。

其實當題主取得模型後,那麼便可以做預測。先用訓練模型時處理文檔的方法做預處理,然後放到模型計算(算一個概率而已)。

如果你用gensim,請參:https://radimrehurek.com/gensim/wiki.html#latent-dirichlet-allocation


因為最近我也遇到類似的問題,所以就特地用心去了解了一下LDA的工作原理也順便來解答一下這位小哥的困惑。實際上LDA主題模型是一種對文本進行無監督聚類的方法,每一個主題實際上對應的就是一個類(注意理解這句話),而當每個文檔被解釋成基於各個主題的一個分布的向量時,其在各個主題上的概率(載荷)對應的是對各個類別進行「軟分類」的隸屬度。既然如此的話,那麼我們就容易理解為什麼很多文獻上並不對LDA主題模型在新文檔測試的問題上進行詳細解釋說明了,因為,對一個聚類演算法,沒什麼好進行測試的,沒有預測的意義。

那麼話又說回來了,LDA主題分析真的沒有測試新文檔的意義么?當被認為是一個聚類演算法的時候固然沒有,往往一次性就把信息解析出來了,然後呈遞分析結果。但是,LDA主題分析的作用不僅僅是聚類,也是可以用於分析新文檔的。在對新文檔進行分析時,主要源於如下幾個需求:

1) 對模型的優劣程度進行判斷

Blei最早的對LDA主題模型的文章中提到,LDA主題模型使用過程中有很多超參數不能確定,因此需要用一些客觀指標來對超參數的選擇進行調試。測評模型優劣的關鍵在於必須有一個客觀指標,這個指標就是Perplexity(關於Perplexity怎麼回事兒參考: https://www.52ml.net/14623.html),但是Perplexity對模型的評估卻依賴於主題模型在新的測試文檔集合中的應用。儘管Blei的文章中只提到了測試集合,但沒說已有的主題如何在測試集合中進行新文檔的分析,可能因為這事兒對於大牛來說太簡單不屑一顧吧。後來Thomas Griffiths的文章提出了大家所熟知的MCMC的方法,也提到了Perplexity的評估方法,但是依然沒有提出如何進行相應的操作……哎,大牛就是這麼任性…

2) 測試集合和訓練集合不來自於同一個語料庫

有時候需要對多個語料庫進行分析,不同語料庫的語言結構可能不同,但是都會涉及同樣的領域,這種情況下不建議將兩個語料庫放在一起進行主題分析,而最好分開對其進行操作,一個用作訓練集而另一個用作測試集。

3) 待分析文檔全集太大不能一次性訓練操作

在對某一個語料庫中的文檔進行基於LDA主題模型的聚類操作時,可能文檔集合太大,一次性放入內存構造過長的Markov鏈進行分析很容易把內存撐壞。雖然很多人說PC硬體不是問題,但是仍有一部分研究者是還沒有獨立研究機構給自己撐腰的屌絲博士生,很難找到合適的硬體計算資源,這種情況下,可以考慮分批次處理文檔,一小部分訓練,另外那些放不進內存的數據分批進行測試,從而把所有文檔進行降維。

好了,扯了半天言歸正傳,如何對訓練集進行測試。首先你要清楚如何用MCMC的方法對文檔進行訓練,不懂的可以看一下Thomas Griffths的文章。Thomas Griffths認為,在對文檔的主題進行估計時,按照:

進行Markov狀態轉移,不斷調整隱含變數,即各個辭彙位置的主題。第一部分是特定主題生成特定辭彙的概率,第二部分是特定文檔生成特定主題的概率。當我們考慮測試文檔時,認為通過訓練集訓練已經把所有的辭彙-主題分布確定了下來,所以第一部分不用再進行調整,只調整第二部分。第一部分直接用已經估計出來的各個主題上的辭彙分布帶入即可。即:

其中varphi _{k,t} 是通過訓練集合訓練出的辭彙項在特定主題上的概率分布~~

如果想了解詳細內容,可以參考文獻:《Finding Scientific Topics》, Thomas L.Griffths and Mark Steyvers,2004.


有人寫了本非常漂亮非常系統的講述LDA的書《LDA演算法漫遊指南》在百度閱讀上:http://yuedu.baidu.com/ebook/d0b441a8ccbff121dd36839a?fr=booklist,你可以去看看。


實際上用collapsed Gibbs sampling對模型進行inference的時候,最終估計的結果就是phi,所有單詞在主題上的分布,和theta,所有主題在文檔上的分布。

理解collapsed Gibbs sampling的關鍵點在於理解這個採樣過程到底是在對什麼東西採樣。沒錯,就是z向量,也就是生成語料庫所有詞的隱含主題。因為隱含主題z和詞是一一對應的,所以很容易就能夠用z向量推算出phi和theta了。


樓主這麼一說忽然想到一問題。。。

lda算的是文檔中主題分布的分布(P(theta|alpha, beta, D, d))。。。(theta是主題的分布,alpha是它的prior, beta是P(word|topic)的prior, D是training data, d是要拿來分析的doc。。。)

那當我們試圖用一個theta表徵一篇文檔時究竟用的什麼?theta的期望值還是什麼?這合適嗎?用起來有沒有什麼要注意的?做inference的時候可是直接用P(theta|blahblah)的。。。

沒錯。。。我就是傳說中的借樓同問的。。。


樓主現在知不知道這個問題的答案呢,最近在學LDA也卡到這了。


根據大家的回答和我自己的理解,ldamodel可以得到P(w}t),也就是每個topic的詞分布

那麼多將詞和主題反過來,可以得到每個詞在不同topic中出的分布,這樣就可以得到p(t}w),但是這個貌似有點問題,比如一個詞在所有的topic的詞分布中都不高,那麼也就是這個詞對於每個topic的分布都比較低嗎?也有可能這個詞只是在這個主題下才出現,但是對這個主題來說,這個詞也不是重要的,那麼這種請看貌似就比較難區分『

另外我再提個問題,gensim計算完之後,我怎麼得到一篇文檔中每個詞對應的topic的分布?應該是跟整個document相關的吧?


你模型訓練好之後應該可以得到一個可以計算概率分布的輸出,比如每個topic下面每個詞出現的次數,然後你就可以估算每個詞在每個topic下面出現的概率,套一下貝葉斯公式就可以用來計算一篇文檔在每個topic下面的概率


同借樓問下,得到主題上的詞語分布,如何得到詞語的主題分布呢?


推薦閱讀:

IBM spss modeler 是什麼?
如何從數據挖掘入門到數據挖掘高手?
數據降維和特徵選取有什麼區別?
如何通俗易懂地解釋支持向量回歸(support vector regression)?
作為數據挖掘研究生需要補充哪些數學知識?

TAG:數據挖掘 | 機器學習 | 自然語言處理 | LDA | 文本挖掘 |