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

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的意義。this

LDA模型構建原理:spa

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

  一、Unigram Model(詞袋模型)設計

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

     最開始,你們想要判斷兩篇文檔是否類似,最簡單直接的方法就是看文檔裏出現的詞是否同樣,其個數是否相近。於Unigram Model(詞袋模型)就是實現這樣的思路設計的。因此爲了獲得文檔集合中,全部文檔的共性的規律,詞袋模型,假設:一篇文檔生成的過程就是 獨立的拋一個具備M面的骰子(M是全部詞的個數),N次(N是該文檔裏詞的個數),這樣文檔的生成,恰好能夠看做是個多項式分佈:blog

        

文檔集合中,每一個詞出現的機率就是要求的參數,經過EM算法能夠肯定下來,這樣就獲得了模型。文檔

  二、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分佈還有一個重要的性質,它的最大似然估計能夠經過以下公式,證實過程有些複雜,暫不推導了:

      

  三、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

相關文章
相關標籤/搜索