主題模型(topic modeling)是一種常見的機器學習應用,主要用於對文本進行分類。傳統的文本分類器,例如貝葉斯、KNN和SVM分類器,只能將測試對象分到某一個類別中,假設我給出三個分類:“算法”、“網絡”和“編譯”讓其判斷,這些分類器往往將對象歸到某一類中。
但是如果一個外行完全給不出備選類別,有沒有分類器能夠自動給出類別判斷呢?
有,這樣的分類器就是主題模型。
潛在狄立克雷分配(Latent Dirichlet Allocation,LDA)主題模型是最簡單的主題模型,它描述的是一篇文章是如何產生的。其原理如下圖所示:
從左往右看,一個主題是由一些詞語的分布定義的,比如藍色主題是由2%幾率的data,2%的number……構成的。一篇文章則是由一些主題構成的,比如右邊的直方圖。具體產生過程是,從主題集合中按概率分布選取一些主題,從該主題中按概率分布選取一些詞語,這些詞語構成了最終的文檔(LDA模型中,詞語的無序集合構成文檔,也就是說詞語的順序沒有關系)。
如果我們能將上述兩個概率分布計算清楚,那么我們就得到了一個模型,該模型可以根據某篇文檔推斷出它的主題分布,即分類。由文檔推斷主題是文檔生成過程的逆過程。
在《LDA數學八卦》一文中,對文檔的生成過程有個很形象的描述:
LDA是一種使用聯合分布來計算在給定觀測變量下隱藏變量的條件分布(后驗分布)的概率模型,觀測變量為詞的集合,隱藏變量為主題。
LDA的生成過程對應的觀測變量和隱藏變量的聯合分布如下:
式子的基本符號約定——β表示主題,θ表示主題的概率,z表示特定文檔或詞語的主題,w為詞語。
β1:K為全體主題集合,其中βk是第k個主題的詞的分布(如圖1左部所示)。第d個文檔中該主題所占的比例為θd,其中θd,k表示第k個主題在第d個文檔中的比例(圖1右部的直方圖)。第d個文檔的主題全體為zd,其中zd,n是第d個文檔中第n個詞的主題(如圖1中有顏色的圓圈)。第d個文檔中所有詞記為wd,其中wd,n是第d個文檔中第n個詞,每個詞都是固定的詞匯表中的元素。
p(β)表示從主題集合中選取了一個特定主題,p(θd)表示該主題在特定文檔中的概率,大括號的前半部分是該主題確定時該文檔第n個詞的主題,后半部分是該文檔第n個詞的主題與該詞的聯合分布。連乘符號描述了隨機變量的依賴性,用概率圖模型表述如下:
比如,先選取了主題,才能從主題里選詞。具體說來,一個詞受兩個隨機變量的影響(直接或間接),一個是確定了主題后文檔中該主題的分布θd,另一種是第k個主題的詞的分布βk(也就是圖2中的第二個壇子)。
沿用相同的符號,LDA后驗分布計算公式如下:
分子是一個聯合分布,給定語料庫就可以輕松統計出來。但分母無法暴力計算,因為文檔集合詞庫達到百萬(假設有w個詞語),每個詞要計算每一種可能的觀測的組合(假設有n種組合)的概率然后累加得到先驗概率,所以需要一種近似算法。
基於采樣的算法通過收集后驗分布的樣本,以樣本的分布求得后驗分布的近似。
θd的概率服從Dirichlet分布,zd,n的分布服從multinomial分布,兩個分布共軛,所謂共軛,指的就是先驗分布和后驗分布的形式相同:
兩個分布其實是向量的分布,向量通過這兩個分布取樣得到。采樣方法通過收集這兩個分布的樣本,以樣本的分布近似。
開源項目:
A Java implemention of LDA
LDA4j:https://github.com/hankcs/LDA4j
原地址:http://www.hankcs.com/nlp/lda-java-introduction-and-implementation.html