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

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

一、LDA主題模型簡介

LDA(Latent Dirichlet Allocation)中文翻譯為:潛在狄利克雷分佈。LDA主題模型是一種文件生成模型,是一種非監督機器學習技術。它認為一篇文件是有多個主題的,而每個主題又對應著不同的詞。一篇文件的構造過程,首先是以一定的概率選擇某個主題,然後再在這個主題下以一定的概率選出某一個詞,這樣就生成了這篇文件的第一個詞。不斷重複這個過程,就生成了整篇文章(當然這裡假定詞與詞之間是沒有順序的,即所有詞無序的堆放在一個大袋子中,稱之為詞袋,這種方式可以使演算法相對簡化一些)。

LDA的使用是上述文件生成過程的逆過程,即根據一篇得到的文件,去尋找出這篇文件的主題,以及這些主題所對應的詞。

白話解釋:比如document1的內容為:[自從喬布斯去世之後,iPhone再難以產生革命性的創新了]  通過上述的方法,document1將對應兩個主題topic1,topic2,進而,主題topic1會對應一些詞:[蘋果創始人][蘋果手機],主題topic2會對應一些詞:[重大革新][技術突破]。於是LDA模型的好處顯而易見,就是可以挖掘文件中的潛在詞或者找到兩篇沒有相同詞的文件之間的聯絡。

二、演算法流程

詳細,通俗易懂,邏輯脈絡清晰)

我們以文件集合D中的文件d為例,文件d中包含單詞序列<w1,w2,...wn><w1,w2,...wn>,wiwi表示第ii個單詞,設d中有nn個單詞;  文件集合D中出現的全部片語成VocabularyVocabulary;  首先將文件d作為演算法的輸入,並輸入主題數K,此時d對應到各個主題的概率為θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk),ptipti為d對應第ii個主題的概率;  此時輸入到演算法中的只有文件d和主題數K,那麼pt1,pt2...ptkpt1,pt2...ptk的數值從何而來?

我們首先人為設定文件d中對應主題t1,t2,...tkt1,t2,...tk的詞的個數,比如文件d中5個詞對應主題t1t1,7個詞對應主題t2t2,…,4個詞對應主題tktk,那麼此時,我們就人為確定了一個引數向量(5,7,…4),將這個向量記作α⃗ α→,這個我們人為設定的引數向量稱為超引數。  那麼如何將超引數α⃗ α→轉化為概率分佈θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk)呢?

這裡我們引入狄利克雷分佈函式: 

Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)pα1−11pα2−22pα3−33Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α1−1p2α2−2p3α3−3

它所表達的含義簡單來說就是,已知α1,α2,α3α1,α2,α3的條件下,概率p1,p2,p3p1,p2,p3的概率分佈,也就是概率的概率,分佈的分佈。再直觀點說就是:比如在已知α1,α2,α3α1,α2,α3為(5,7,4)(5,7,4)的條件下,樣本點p1,p2,p3p1,p2,p3為(0.4,0.5,0.1)(0.4,0.5,0.1)的概率是多少。

那麼我們將上述的三維DirichletDirichlet函式擴充套件為KK維,即在已知α⃗ α→的條件下,得到p⃗ p→的分佈(α⃗ ,p⃗ α→,p→分別為K維向量)。KK維DirichletDirichlet公式如下: 

Dirichlet(p⃗ |α⃗ )=Γ(∑Kk=1αk)∏Kk=1Γ(αk)∏k=1Kpαk−1kDirichlet(p→|α→)=Γ(∑k=1Kαk)∏k=1KΓ(αk)∏k=1Kpkαk−1

至此,我們通過輸入超引數α⃗ α→得到了文件d的關於K個主題的狄利克雷分佈: 

θd=Dirichlet(α⃗ )θd=Dirichlet(α→)

其含義顯然,DirichletDirichlet的輸入引數為α⃗ α→,得到的輸出為可以理解為一個矩陣:  (pt1,pt2,...ptk)(pt1,pt2,...ptk)  ............  ............  (pt1,pt2,....ptk)(pt1,pt2,....ptk)  即文件d對應各個主題tktk的概率分佈的分佈。

同理,我們可以將任一主題tktk產生各個詞的概率表示出來。人為設定主題tktk產生的各個詞的數量,即設定超引數,用向量η⃗ η→來表示。同上所述,將η⃗ η→作為DirichletDirichlet函式的輸入引數,得到主題tktk產生各個詞的狄利克雷分佈: 

βk=Dirichlet(η⃗ )βk=Dirichlet(η→)

此時我們已經得到了文件d對應各個主題的概率分佈的分佈(即狄利克雷分佈)θdθd,以及文件tktk產生各個詞的概率分佈的分佈βkβk,那麼接下來,我們要從文件d中取出第i個詞,求這個詞對應各個主題的分佈; 換句大家熟悉的話來說就是:已知第i個詞wiwi在文件d中出現n次,且已知它對應各個主題的概率(這裡每個詞對應各個主題的概率就是文件d對應各個主題的概率,二者同分布),求該詞被各個主題產生的次數;  這就等同於我們熟知的一共有n個球,且已知紅球、黃球、綠球的概率分別為p1,p2,p3p1,p2,p3,求這n個求當中紅球、黃球、綠球的個數。

那麼如何通過文件d對應各個主題的分佈θdθd得到文件中的每個詞被各個主題產生的次數,進而重新得到文件d中對應各個主題的詞的個數呢?

首先我們引入十分熟悉的多項式分佈: 

multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!pm11pm22pm33multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!p1m1p2m2p3m3

這個公式的意義總所周知:已知一共n個球,且知道每種顏色球的概率,就可以得到有m1m1個紅球,m2m2個黃球,m3m3個綠球的概率。

那麼同樣將其擴充套件為K維,將θdθd作為引數,就可以得到文件d中第i個詞wiwi對應的各個主題的多項式分佈zdn=multi(θd)zdn=multi(θd) 於是,非常值得慶幸,我們通過文件d對應各個主題的概率θdθd,進而得知文件d中各個詞對應各個主題的概率,且知道這個詞在文件d中的出現次數,於是求得這個詞被各個主題的產生次數,遍歷文件d中的每一個詞,就可以得到新的文件d中對應各個主題的詞的個數。 白話舉例:文件d對應主題t1,t2t1,t2的概率分別為pt1,pt2,pt1,pt2,,於是文件d中詞w1w1對應的主題t1,t2,t1,t2,的概率也分別為pt1,pt2pt1,pt2,又得知詞w1w1在文件d中出現了15次,於是得到詞w1w1由主題t1,t2t1,t2產生的次數分別為10次、5次(這個是假設的);  對文件d中的每個詞都執行此操作,(假設文件中只有兩個詞)詞w2w2由主題t1,t2t1,t2產生的次數分別為13次、2次,於是就能重新得到文件d中對應各個主題的詞的數量,即對應主題t1,t2t1,t2的詞的數量分別為2個、0個(初始的d中對應各個主題的詞的數量是人為設定的超引數α⃗ α→)。

於是,我們最終得到了文件d對應各個主題的詞的個數的更新值:記作向量n⃗ n→,我們將更新後的向量n⃗ n→再次作為狄利克雷分佈的輸入向量,即Dirichlet(θd|n⃗ )Dirichlet(θd|n→),就會又會得到文件d對應各個主題的概率的更新值,即更新的θdθd,如此反覆迭代,最終得到收斂的θdθd,即為我們要的結果。

有了以上的經驗,主題tktk產生各個詞的概率βkβk可以同樣處理,對於產生文件d中的第ii個詞wiwi的各個主題的分佈為:  multi(βi)multi(βi),於是用同上面相同的方法,可以得到更新後的各個主題產生各個單詞的數量:記作向量m⃗ m→,將向量m⃗ m→作為新的引數再次帶入狄利克雷分佈Dirichlet(βk|m⃗ )Dirichlet(βk|m→),就又會得到每個主題產生各個詞的概率,即更新的βkβk,如此反覆迭代,最終得到收斂的βkβk,即所求結果。

得到了收斂的θdθd和βkβk,演算法就大功告成了,這時,該演算法就會根據輸入的文件d,找到潛在主題下的相關詞啦!!!!

++++++++++++++++++++++++++++++++++++++++  個人整理,水平有限,可能存在很多錯誤,希望大家一起探討研究,還有關於為什麼選用狄利克雷分佈以及狄利克雷分佈和多項式分佈之間的關係、先驗概率後驗概率等內容並沒有仔細探討,作者現在已經生不如死了,先休息休息,過幾天再補充吧!!  ++++++++++++++++++++++++++++++++++++++++