lda模型的python實現

來源:互聯網
上載者:User

標籤:

  • LDA(Latent Dirichlet Allocation)是一種文檔主題產生模型,最近看了點資料,準備使用python實現一下。至於數學模型相關知識,某度一大堆,這裡也給出之前參考過的一個挺詳細的文檔lda演算法漫遊指南
  • 這篇博文只講演算法的sampling方法python實現。
  • 完整實現項目開源python-LDA

 

  • lda模型變數申請及初始化
##虛擬碼#輸入:文章集合(分詞處理後),K(類的個數)輸出:已經隨機指派了一次的lda模型begin    申請幾個統計量:        p 機率向量 維度:K        nw 詞在類上的分布 維度:M*K 其中M為文章集合的詞的總個數        nwsum 每個類上的詞的總數 維度:K        nd 每篇文章中,各個類的詞個數分布 維度:V*K 其中V為文章的總個數        ndsum 每篇文章中的詞的總個數 維度:V        Z 每個詞指派一個類 維度:V*每篇文章詞的個數        theta 文章->類的機率分布 維度:V*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] += 1                self.nd[x][topic] += 1                self.nwsum[topic] += 1        self.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)]) 
  • sampling抽樣過程
##虛擬碼#輸入:初始化後的lda_model,迭代次數iter_times,超參數α、β,聚類個數K輸出:theta(文章對應類的分布機率),phi(類對應詞的分布機率),tassgin(文章中每個詞的指派類結果),twords(每個類topN個高頻詞)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
#程式碼片段    def sampling(self,i,j):        topic = self.Z[i][j]        word = self.dpre.docs[i].words[j]        self.nw[word][topic] -= 1        self.nd[i][topic] -= 1        self.nwsum[topic] -= 1        self.ndsum[i] -= 1        Vbeta = 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] +=1        self.nwsum[topic] +=1        self.nd[i][topic] +=1        self.ndsum[i] +=1        return topic

 

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

lda模型的python實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.