1. 程式人生 > >主題模型-LDA小結

主題模型-LDA小結

一.主題模型

傳統判斷兩個文件相似性的方法是通過檢視兩個文件共同出現的單詞的多少,如TF-IDF等,這種方法沒有考慮到文字背後的語義關聯,可能在兩個文件共同出現的單詞很少甚至沒有,但兩個文件是相似的。

        舉個例子,有兩個句子分別如下:

                “喬布斯離我們而去了。”

                “蘋果價格會不會降?”

        可以看到上面這兩個句子沒有共同出現的單詞,但這兩個句子是相似的,如果按傳統的方法判斷這兩個句子肯定不相似,所以在判斷文件相關性的時候需要考慮到文件的語義,而語義挖掘的利器是主題模型,LDA就是其中一種比較有效的模型。

        在主題模型中,主題表示一個概念、一個方面,表現為一系列相關的單詞,是這些單詞的條件概率。形象來說,主題就是一個桶,裡面裝了出現概率較高的單詞,這些單詞與這個主題有很強的相關性。

        怎樣才能生成主題?對文章的主題應該怎麼分析?這是主題模型要解決的問題。

        首先,可以用生成模型來看文件和主題這兩件事。所謂生成模型,就是說,我們認為一篇文章的每個詞都是通過“以一定概率選擇了某個主題,並從這個主題中以一定概率選擇某個詞語”這樣一個過程得到的。那麼,如果我們要生成一篇文件,它裡面的每個詞語出現的概率為:


        這個概率公式可以用矩陣表示:


        其中”文件-詞語”矩陣表示每個文件中每個單詞的詞頻,即出現的概率;”主題-詞語”矩陣表示每個主題中每個單詞的出現概率;”文件-主題”矩陣表示每個文件中每個主題出現的概率。

        給定一系列文件,通過對文件進行分詞,計算各個文件中每個單詞的詞頻就可以得到左邊這邊”文件-詞語”矩陣。主題模型就是通過左邊這個矩陣進行訓練,學習出右邊兩個矩陣。

        主題模型有早起使用SVD的LSA(隱形語義分析),然後引入基於概率的pLSA(ProbabilisticLatent Semantic Analysis),其引數學習採用EM演算法和後來改進PLSA,引入hyperparameter的

LDA(Latent Dirichlet Allocation),其引數學習主要採用EM和Gibbs sampling,下面主要介紹LDA。

二.LDA

LDA要乾的事情簡單來說就是為一堆文件進行聚類(所以是非監督學習),一種topic就是一類,要聚成的topic數目是事先指定的。聚類的結果是一個概率,而不是布林型的100%屬於某個類。國外有個部落格上有一個清晰的例子,直接引用:

Suppose you have the following set of sentences:

  • I like to eat broccoli and bananas.

  • I ate a banana and spinach smoothie for breakfast.

  • Chinchillas and kittens are cute.

  • My sister adopted a kitten yesterday.

  • Look at this cute hamster munching on a piece of broccoli.

What is latent Dirichlet allocation? It’s a way of automatically discovering topics that these sentences contain. For example, given these sentences and asked for 2 topics, LDA might produce something like

  • Sentences 1 and 2: 100% Topic A

  • Sentences 3 and 4: 100% Topic B

  • Sentence 5: 60% Topic A, 40% Topic B

  • Topic A: 30% broccoli, 15% bananas, 10% breakfast, 10% munching, … (at which point, you could interpret topic A to be about food)

  • Topic B: 20% chinchillas, 20% kittens, 20% cute, 15% hamster, … (at which point, you could interpret topic B to be about cute animals)

上面關於sentence 5的結果,可以看出來是一個明顯的概率型別的聚類結果(sentence 1和2正好都是100%的確定性結果)。

再看例子裡的結果,除了為每句話得出了一個概率的聚類結果,而且對每個Topic,都有代表性的詞以及一個比例。以Topic A為例,就是說所有對應到Topic A的詞裡面,有30%的詞是broccoli。在LDA演算法中,會把每一個文件中的每一個詞對應到一個Topic,所以能算出上面這個比例。這些詞為描述這個Topic起了一個很好的指導意義,我想這就是LDA區別於傳統文字聚類的優勢吧。

LDA整體流程

先定義一些字母的含義:

  • 文件集合D,topic集合T

  • D中每個文件d看作一個單詞序列< w1,w2,...,wn >,wi表示第i個單詞,設d有n個單詞。(LDA裡面稱之為word bag,實際上每個單詞的出現位置對LDA演算法無影響)

  • D中涉及的所有不同單片語成一個大集合VOCABULARY(簡稱VOC

LDA以文件集合D作為輸入(會有切詞,去停用詞,取詞幹等常見的預處理,略去不表),希望訓練出的兩個結果向量(設聚成k個Topic,VOC中共包含m個詞):

  • 對每個D中的文件d,對應到不同topic的概率θd < pt1,..., ptk >,其中,pti表示d對應T中第i個topic的概率。計算方法是直觀的,pti=nti/n,其中nti表示d中對應第i個topic的詞的數目,n是d中所有詞的總數。

  • 對每個T中的topic t,生成不同單詞的概率φt < pw1,..., pwm >,其中,pwi表示t生成VOC中第i個單詞的概率。計算方法同樣很直觀,pwi=Nwi/N,其中Nwi表示對應到topic t的VOC中第i個單詞的數目,N表示所有對應到topic t的單詞總數。

LDA的核心公式如下:

p(w|d) = p(w|t)*p(t|d)

直觀的看這個公式,就是以Topic作為中間層,可以通過當前的θd和φt給出了文件d中出現單詞w的概率。其中p(t|d)利用θd計算得到,p(w|t)利用φt計算得到。

實際上,利用當前的θd和φt,我們可以為一個文件中的一個單詞計算它對應任意一個Topic時的p(w|d),然後根據這些結果來更新這個詞應該對應的topic。然後,如果這個更新改變了這個單詞所對應的Topic,就會反過來影響θd和φt。

LDA演算法開始時,先隨機地給θd和φt賦值(對所有的d和t)。然後上述過程不斷重複,最終收斂到的結果就是LDA的輸出。用數學語言描述就是如下過程


轉化成概率圖模型表示就是


圖中K為主題個數,M為文件總數,是第m個文件的單詞總數。 是每個Topic下詞的多項分佈的Dirichlet先驗引數,   是每個文件下Topic的多項分佈的Dirichlet先驗引數。是第m個文件中第n個詞的主題,是m個文件中的第n個詞。剩下來的兩個隱含變數分別表示第m個文件下的Topic分佈和第k個Topic下詞的分佈,前者是k維(k為Topic總數)向量,後者是v維向量(v為詞典中term總數)。

三.用Gibbs Sampling學習LDA

Gibbs Sampling的流程:LDA中的變數都是未知的隱含變數,也是我們需要根據觀察到的文件集合中的詞來學習估計的,那麼如何來學習估計呢?這就是概率圖模型的Inference問題。主要的演算法分為exact inference和approximate inference兩類。儘管LDA是最簡單的Topic Model, 但是其用exact inference還是很困難的,一般我們採用approximate inference演算法來學習LDA中的隱含變數。比如LDA原始論文Blei02中使用的mean-field variational expectation maximisation 演算法和Griffiths02中使用的Gibbs Sampling,其中Gibbs Sampling 更為簡單易懂。

Gibbs Sampling 是Markov-Chain Monte Carlo演算法的一個特例。這個演算法的執行方式是每次選取概率向量的一個維度,給定其他維度的變數值Sample當前維度的值。不斷迭代,直到收斂輸出待估計的引數。可以圖示如下


初始時隨機給文字中的每個單詞分配主題,然後統計每個主題z下出現term t的數量以及每個文件m下出現主題z中的詞的數量,每一輪計算,即排除當前詞的主題分配,根據其他所有詞的主題分配估計當前詞分配各個主題的概率。當得到當前詞屬於所有主題z的概率分佈後,根據這個概率分佈為該詞sample一個新的主題。然後用同樣的方法不斷更新下一個詞的主題,直到發現每個文件下Topic分佈和每個Topic下詞的分佈收斂,演算法停止,輸出待估計的引數,最終每個單詞的主題也同時得出。

用Gibbs Sampling 學習LDA引數的演算法虛擬碼如下


四.LDA開源工具GibbsLDA++

GibbsLDA++說明文件寫的很清晰易懂,這裡只說下輸出模型。

<model_name>.others:LDA模型的一些引數。α、βLDA的先驗引數、ntopics主題數、liter取樣迭代次數
<model_name>.phi:This file contains the word-topic distributions, i.e., p(wordw|topict). Each line is a topic, each column is a word in the vocabulary
<model_name>.theta:This file contains the topic-document distributions, i.e., p(topict|documentm). Each line is a document and each column is a topic.
<model_name>.tassign:This file contains the topic assignments for words in training data. Each line is a document that consists of a list of <wordij>:<topic of wordij>
<model_name>.twords:This file contains twords most likely words of each topic.

case study示例:

學習:src/lda -est -alpha 0.5 -beta 0.1 -ntopics 100 -niters 1000 -savestep 100 -twords 20 -dfile models/casestudy/ trndocs.dat

預測:src/lda -inf -dir models/casestudy/ -model model-01800 -niters 30 -twords 20 -dfile newdocs.dat

參考資料: