1. 程式人生 > >自然語言處理--LDA主題聚類模型

自然語言處理--LDA主題聚類模型

src 隨機 pos 一個 改變 筆記 整體 應該 定性

LDA模型算法簡介:

算法 的輸入是一個文檔的集合D={d1, d2, d3, ... , dn},同時還需要聚類的類別數量m;然後會算法會將每一篇文檔 di 在 所有Topic上的一個概率值p;這樣每篇文檔都會得到一個概率的集合di=(dp1,dp2,..., dpm);同樣的文檔中的所有詞也會求出 它對應每個Topic的概率,wi = (wp1,wp2,wp3,...,wpm);這樣就得到了兩個矩陣,一個文檔到Topic,一個詞到Topic。

這樣LDA算法,就將文檔和詞,投射到了一組Topic上,試圖通過Topic找出文檔與詞間,文檔與文檔間,詞於詞之間潛在的關系;由於LDA屬於無監督算法,每個Topic並不會要求指定條件,但聚類後,通過統計出各個Topic上詞的概率分布,那些在該Topic上概率高的詞,能非常好的描述該Topic的意義。

LDA模型構建原理:

在講LDA模型之前,會先介紹下 Unigram Model (詞袋模型)、Bayes Unigram Model(貝葉斯詞袋模型),以及PLSA 概率潛在語義分析,之所以先介紹這些模型,首先它們是LDA模型的基礎,LDA是將它們組合和演變的結果;其次這些模型比簡單,了解起來會容易些。

  1、Unigram Model(詞袋模型)

LDA既然是聚類算法,而聚類算法大多數時候,都在尋找兩個東西的相似度。

最開始,大家想要判斷兩篇文檔是否相似,最簡單直接的方法就是看文檔裏出現的詞是否一樣,其個數是否相近。於Unigram Model(詞袋模型)就是實現這樣的思路設計的。所以為了得到文檔集合中,所有文檔的共性的規律,詞袋模型,假設:一篇文檔生成的過程就是 獨立的拋一個具有M面的骰子(M是所有詞的個數),N次(N是該文檔裏詞的個數),這樣文檔的生成,剛好可以看作是個多項式分布:

        技術分享圖片

文檔集合中,每個詞出現的概率就是要求的參數,通過EM算法可以確定下來,這樣就得到了模型。

  2、Bayes Unigram Model(貝葉斯詞袋模型)

在詞袋模型中,我們簡單的認為文檔裏每個詞出現的概率是個定數(即骰子的每個面的概率),但Bayes學派不這麽認為,他們認為這些概率應該是一個隨機過程產生的,於是生成一篇文檔的過程可以描述為:先隨機抽取一個M面的骰子, 再用這個骰子獨立拋N次。那麽這個模型的分布如下:

        技術分享圖片

其中後邊部分技術分享圖片,是多項式分布,我們已經知道,為了方便計算我們假設技術分享圖片為Dirichlet分布,它是多項式分布的共軸分布

簡單介紹下 Dirichlet 分布:比如 拋了100次骰子,得到6個面的一個概率,記為一個實驗,重復這個實驗100次,那麽這100次的實驗中,這6個面的概率的概率分布,就是Dirichlet分布,它是分布之上的分布。

例如:1點(骰子六個面之一) 在這100次實驗(每個實驗拋100次) 是 0.15的概率為 0.12,實際我們這麽想,100次實驗中,有12次,1點在一個實驗內出現了15次,可以看作是總共拋10000次,1點出現15×12=180次。這10000次實驗,視為一個大的多項式分布,於是可以得出他們有相同的概率分布公式,這就是前面所提到的共軸分布,且有如下性質:

先驗的Dirichlet分布+多項式分布 = 後驗的Dirichlet分布

        技術分享圖片

上述的例子中,你會發現,它與我們的Bayes Unigram Model(貝葉斯詞袋模型)已經很相似了。一個實驗裏的100次拋骰子,可以看作是先驗的Dirichlet分布,也就是模型中確定骰子各個面概率的那個隨機過程,而重復這個這個實驗100次,可以看作是後面的根據這個骰子確定文檔的一個過程。

Dirichlet分布還有一個重要的性質,它的最大似然估計可以通過如下公式,證明過程有些復雜,暫不推導了:

      技術分享圖片

  3、PLSA潛在語義分析

在文本聚類的時候,常常會遇到這樣一種問題:例如在NBA的相關新聞中提到“石佛”,和提到“鄧肯”它們應該是指的同一個人,確實兩個不同的詞;而另一篇關於教育的新聞裏也提到了“鄧肯”,但此“鄧肯”非彼“鄧肯”,它可能指的是美國教育部部長“阿恩·鄧肯”;而這兩篇NBA新聞和一篇教育新聞,很可能就被錯誤的聚類了。

於是,可以發現詞在不同的語義環境下,同一個詞可能表達不同意思,而同一個意思可能產生不同的詞。PLSA潛在語義分析,就是為了解決這樣的問題。它在文檔和詞之間加了一層主題(Topic),先讓文檔和主題產生關聯,再在主題中尋找詞的概率分布。

PLSA模型將文檔的生成這樣設計:第一步,我們拋一個有H面的骰子,每個面代表一個主題,各個面概率不一,得到一個主題;第二步,這個主題又對應了一個有T個面的骰子,每個面代表一個詞,拋這骰子N次,得到一篇文章。其實我覺得這個模型可以看作是兩個詞袋模型的組合,第一個做一次,確定主題,第二個重復獨立做N詞,確定文章。下面是一個直觀圖(借用LDA數學八卦的圖了):

      技術分享圖片

  這樣概率分布公式如下:

  技術分享圖片

LDA主題聚類模型

這時Bayes學派的朋友們又出現,歷史是如此的相似,他們又對PLSA下手了,認為PLSA裏面的兩種骰子(產生主題的骰子和主題對應詞的骰子),各個面的概率都不應該是確定,應該由一個隨機過程來得出。於是讓PLSA的兩個詞袋模型,變成兩個Bayes詞袋模型,就是LDA了

前面已經介紹了,Bayes詞袋模型的概率分布是一個Dirichlet 同軸分布,LDA 的整個物理過程實際就是兩個Dirichlet 同軸分布,而 LDA 模型的參數估計也就出來了,通過那個重要的性質,如下:

        技術分享圖片

LDA 算法設計 與Gibbs Sampling

算法步驟:

1. 對文檔集合中的每篇文檔d,做分詞,並過濾掉無意義詞,得到語料集合W = {w1, w2, …, wx}。
2. 對這些詞做統計,得到 p(wi|d)。
3. 為語料集合W中的每個 wi ,隨機指定一個主題 t,作為初始主題。
4. 通過 Gibbs Sampling 公式, 重新采樣 每個 w 的所屬 主題t, 並在語料中更新 直到Gibbs Sampling 收斂。
收斂以後得到 主題-詞 的概率矩陣,這個就是LDA矩陣,而 文檔-主題的的概率矩陣也是能得到的,統計後,就能能得到文檔-主題的概率分布。

Gibbs Sampling 公式:
Gibbs Sampling 公式,可以用於計算 某x維度的空間中,兩個平行點之間轉移的概率。 比如在 二維空間(x, y平面),點a(x1,y1) 轉移到 b(x1,y2)的概率記為P,P(a ->b) = p(y2|x1 )

於是上述中第4步,可以視為我們將一個詞對應的 文檔和Topic的概率 看作是一個點在二維平面裏的兩個維度,詞在不同的文檔和不同的主題裏,通過Gibbs Sampling公式,不斷的轉移(即重新采樣),直至收斂。 下面是Gibbs Sampling公式收斂的一個圖,可以給大家一個直觀印象(來自LDA數學八卦)。

    技術分享圖片

LDA(Latent Dirichlet Allocation)學習筆記

示例

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

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的輸出。

文章轉自:https://blog.csdn.net/zhazhiqiang/article/details/21186353

自然語言處理--LDA主題聚類模型