1. 程式人生 > >LDA主題模型程式碼實現流程

LDA主題模型程式碼實現流程

本文主要是通過閱讀別人實現的LAD主題模型程式碼,總結的一個實現流程,供別人想實現LAD時可作參考,如若有何錯誤,麻煩請指出: LDA程式碼流程: (1) 先對文件切詞,然後對每個詞語賦ID編號0~(n-1),計算共有n個詞,m個文件 (2) 引數,變數設定: K 主題數 beta β alpha α iter_times 迭代次數 top_words_num 每個主題特徵詞個數 p,概率向量,double型別,儲存取樣的臨時變數,長度為主題數 nw,詞word在主題上的分佈數,長度為[n][K] nwsum,每個主題的詞的總數,長度為[K] nd,每個文件中各個主題的詞的總數,長度為[m][K] ndsum,每個文件中詞的總數,長度為[m] Z,文件中各個詞的所屬主題,長度為[m][各個文件的詞個數] theta,長度為[m][K] 文章-主題分佈 phi,長度為[K][n] 詞-主題分佈 (3) 初始化 先為各個文件裡的單詞隨機分配主題 for i to 文件數: ndsum[i] = 文件i的單詞數 for j to 文件i的單詞數: 隨機主題topic Z[i][j] = topic nw[詞的ID編號][topic] += 1 nd[i][topic] += 1 nwsum[topic] += 1 (4) 開始迭代 迭代iter_times次: for i to 文件數: for j to 文件i的單詞數: topic = self.Z[i][j] 取出文件i中第j的單詞的主題 取出文件i中第j的單詞的ID編號id,假設去除這個詞後的主題分佈 nw[id][topic] -= 1 nd[i][topic] -= 1 nwsum[topic] -= 1 ndsum[i] -= 1 #計算每個主題的概率分佈 Vbeta = 單詞數 * self.beta Kalpha = K * self.alpha p = (nw[id] + beta)/(nwsum + Vbeta)*(nd[i] + alpha) / (ndsum[i] + Kalpha) for k to K: p[k] += p[k-1] 隨機一個概率u in (0,p[K-1]) #如果轉移概率大於u,則轉移. for topic to K: if p[k]>u: break #確定文件i中的第j個單詞的主題為topic,重新賦值 nw[id][topic] +=1 nwsum[topic] +=1 nd[i][topic] +=1 ndsum[i] +=1 (5) 計算文章-主題分佈,計算詞-主題分佈 for i to m: #這文件各個主題的單詞數除以這文件總的單詞數 theta[i] = (nd[i]+alpha)/(ndsum[i]+K * alpha) for i to K: #這主題各個的單詞的數量除以這主題總的單詞數 phi[i] = (nw.T[i]+beta)/(nwsum[i]+ n * beta) (6) 取各個主題的前top_words_num個特徵詞 迴圈phi,取每一行的前top_words_num的最大值的下標,將下表反編碼成詞語輸出.