LDA主題模型程式碼實現流程
阿新 • • 發佈:2018-12-22
本文主要是通過閱讀別人實現的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的最大值的下標,將下表反編碼成詞語輸出.