lda模型的python實現

2021-07-10 08:58:41 字數 3618 閱讀 4811

#

#偽**

#輸入:文章集合(分詞處理後),k(類的個數)

輸出:已經隨機分派了一次的lda模型

begin

申請幾個統計量:

p 概率向量 維度:k

nwsum 每個類上的詞的總數 維度:k

phi 類->詞的概率分布 維度:k*m

#初始化隨機分配類

for x in

統計ndsum[文章id][詞的個數]

for y in

給所有詞隨機分派乙個類

詞在此類上的分布數目+1此文章中此類的詞的個數+1此類的總詞數 +1end

#

#實現**片段,更詳細看github專案

#class

ldamodel(object):

def__init__

(self,dpre):

self.dpre = dpre #

獲取預處理引數##

模型引數

#聚類個數k,迭代次數iter_times,每個類特徵詞個數top_words_num,超引數α(alpha) β(beta)

# self.k =k

self.beta =beta

self.alpha =alpha

self.iter_times =iter_times

self.top_words_num =top_words_num

##檔案變數

#分好詞的檔案trainfile

#詞對應id檔案wordidmapfile

#文章-主題分布檔案thetafile

#詞-主題分布檔案phifile

#每個主題topn詞檔案topnfile

#最後分派結果檔案tassginfile

#模型訓練選擇的引數檔案paramfile

# self.wordidmapfile =wordidmapfile

self.trainfile =trainfile

self.thetafile =thetafile

self.phifile =phifile

self.topnfile =topnfile

self.tassginfile =tassginfile

self.paramfile =paramfile

#p,概率向量 double型別,儲存取樣的臨時變數

#nw,詞word在主題topic上的分布

#nwsum,每各topic的詞的總數

#nd,每個doc中各個topic的詞的總數

#ndsum,每各doc中詞的總數

self.p =np.zeros(self.k)

self.nw = np.zeros((self.dpre.words_count,self.k),dtype="

int"

)

self.nwsum = np.zeros(self.k,dtype="

int"

)

self.nd = np.zeros((self.dpre.docs_count,self.k),dtype="

int"

)

self.ndsum = np.zeros(dpre.docs_count,dtype="

int"

)

self.z = np.array([ [0 for y in xrange(dpre.docs[x].length)] for x in xrange(dpre.docs_count)]) #

m*doc.size(),文件中詞的主題分布

#隨機先分配型別

for x in

xrange(len(self.z)):

self.ndsum[x] =self.dpre.docs[x].length

for y in

xrange(self.dpre.docs[x].length):

topic = random.randint(0,self.k-1)

self.z[x][y] =topic

self.nw[self.dpre.docs[x].words[y]][topic] += 1self.nd[x][topic] += 1self.nwsum[topic] += 1self.theta = np.array([ [0.0 for y in xrange(self.k)] for x in

xrange(self.dpre.docs_count) ])

self.phi = np.array([ [ 0.0 for y in xrange(self.dpre.words_count) ] for x in xrange(self.k)])

#

#偽**

#輸入:初始化後的lda_model,迭代次數iter_times,超引數α、β,聚類個數k

begin

for i in

迭代次數:

for m in

for v in

取topic =z[m][v]

令nw[v][topic]、nwsum[topic]、nd[m][topic]的統計量均-1計算概率p

#p為此詞屬於每個topic的概率

for k in (1,類的個數-1):

p[k] += p[k-1]

再隨機分派一次,記錄被分派的新的topic

令nw[v][new_topic]、nwsum[new_topic]、nd[m][new_topic]的統計量均+1

#迭代完成後

輸出模型

end

#

**片段

defsampling(self,i,j):

topic =self.z[i][j]

word =self.dpre.docs[i].words[j]

self.nw[word][topic] -= 1self.nd[i][topic] -= 1self.nwsum[topic] -= 1self.ndsum[i] -= 1vbeta = self.dpre.words_count *self.beta

kalpha = self.k *self.alpha

self.p = (self.nw[word] + self.beta)/(self.nwsum + vbeta) *\

(self.nd[i] + self.alpha) / (self.ndsum[i] +kalpha)

for k in xrange(1,self.k):

self.p[k] += self.p[k-1]

u = random.uniform(0,self.p[self.k-1])

for topic in

xrange(self.k):

if self.p[topic]>u:

break

self.nw[word][topic] +=1self.nwsum[topic] +=1self.nd[i][topic] +=1self.ndsum[i] +=1

return topic

此實現為最基礎的lda模型實現,聚類個數k,和超引數的設定要靠人工輸入,自動計算的版本會在以後研究。

主題分析模型LDA的spark實現

主體分析模型主要有plsa probabilistic latent semantic anlysis,概率引語義分析 和lda latent dirichlet allocation,隱含狄利克雷分布 在此暫時介紹lda的spark實現。主題分析模型自動分析每個文件,統計文件內的詞語,根據統計的資...

lda 協方差矩陣 LDA模型

lda是一種文件主題生成模型,也稱為乙個三層貝葉斯概率模型,包含詞 主題和文件三層結構。作為一種非監督機器學習技術,可以用來識別大規模文件集或語料庫中潛藏的主題資訊。它採用了詞袋的方法,這種方法將每一篇文件視為乙個詞頻向量,從而將文字資訊轉化為了易於建模的數字資訊。但是詞袋方法沒有考慮詞與詞之間的順...

LDA主題模型

先定義一些字母的含義 lda以文件集合d作為輸入 會有切詞,去停用詞,取詞幹等常見的預處理,略去不表 希望訓練出的兩個結果向量 設聚成k個topic,voc中共包含m個詞 lda的核心公式如下 p w d p w t p t d 直觀的看這個公式,就是以topic作為中間層,可以通過當前的 d和 t...