用LDA處理文字 Python

2021-08-02 19:22:36 字數 3160 閱讀 7444

一、lda介紹

lda(latent dirichlet allocation)是一種文件主題生成模型,也稱為乙個三層貝葉斯概率模型,包含詞、主題和文件三層結構。所謂生成模型,就是說,我們認為一篇文章的每個詞都是通過「以一定概率選擇了某個主題,並從這個主題中以一定概率選擇某個詞語」這樣乙個過程得到。文件到主題服從多項式分布,主題到詞服從多項式分布。

lda是一種非監督機器學習技術,可以用來識別大規模文件集(document collection)或語料庫(corpus)中潛藏的主題資訊。它採用了詞袋(bag of words)的方法,這種方法將每一篇文件視為乙個詞頻向量,從而將文字資訊轉化為了易於建模的數字資訊。但是詞袋方法沒有考慮詞與詞之間的順序,這簡化了問題的複雜性,同時也為模型的改進提供了契機。每一篇文件代表了一些主題所構成的乙個概率分布,而每乙個主題又代表了很多單詞所構成的乙個概率分布。

1、lda生成過程

對於語料庫中的每篇文件,lda定義了如下生成過程(generativeprocess):  

(1)對每一篇文件,從主題分布中抽取乙個主題;

(2)從上述被抽到的主題所對應的單詞分布中抽取乙個單詞;

(3)重複上述過程直至遍歷文件中的每乙個單詞。  

語料庫中的每一篇文件與t(通過反覆試驗等方法事先給定)個主題的乙個多項分布 (multinomialdistribution)相對應,將該多項分布記為θ。每個主題又與詞彙表(vocabulary)中的v個單詞的乙個多項分布相對應,將這個多項分布記為φ。

2、lda整體流程

文件集合d,主題集合t

d中每個文件d看作乙個單詞序列,wi表示第i個單詞,設d有n個單詞。(lda裡面稱之為wordbag,實際上每個單詞的出現位置對lda演算法無影響)

文件集合d中的所有單詞組成乙個大集合vocabulary(簡稱voc)。

lda以文件集合d作為輸入,希望訓練出兩個結果向量(設聚成k個topic,voc中共包含m個詞)。

對每個d中的文件d,對應到不同topic的概率θd,其中,pti表示d對應t中第i個topic的概率。計算方法是直觀的,pti=nti/n,其中nti表示d中對應第i個topic的詞的數目,n是d中所有詞的總數。

對每個t中的topic,生成不同單詞的概率φt,其中,pwi表示t生成voc中第i個單詞的概率。計算方法同樣很直觀,pwi=nwi/n,其中nwi表示對應到topict的voc中第i個單詞的數目,n表示所有對應到topict的單詞總數。

lda的核心公式如下:  

p(w|d)=p(w|t)*p(t|d)  

直觀的看這個公式,就是以topic作為中間層,可以通過當前的θd和φt給出了文件d中出現單詞w的概率。其中p(t|d)利用θd計算得到,p(w|t)利用φt計算得到。 

實際上,利用當前的θd和φt,我們可以為乙個文件中的乙個單詞計算它對應任意乙個topic時的p(w|d),然後根據這些結果來更新這個詞應該對應的topic。然後,如果這個更新改變了這個單詞所對應的topic,就會反過來影響θd和φt。

二、python示例實現

1、獲取訓練矩陣和單詞

import numpy as np

import lda

x = np.genfromtxt("data\\source_wzp_lda_1.txt", skip_header=1, dtype = np.int)

#the vocab

file_vocab = open("data\\vectoritems_lda_3.txt", "r")

vocab = (file_vocab.read().decode("utf-8").split("\n"))[0:-1]

print len(vocab)

x是乙個n*m的矩陣,表示有n個文字,m個單詞,值表示出現次數或者是否出現。

vocab是m個單詞組成的list。

2、訓練資料,指定主題,進行迭代

#指定11個主題,500次迭代

model = lda.lda(random_state=1, n_topics=11, n_iter=1000)

model.fit(x)

3、主題-單詞(topic-word)分布

#主題-單詞(topic-word)分布

topic_word = model.topic_word_

print("type(topic_word): {}".format(type(topic_word)))

print("shape: {}".format(topic_word.shape))

#獲取每個topic下權重最高的10個單詞

n = 10

for i, topic_dist in enumerate(topic_word):

topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n+1):-1]

print("topic {}\n- {}".format(i, ('-'.join(topic_words)).encode("utf-8")))

4、文件-主題(document-topic)分布

#文件主題(document-topic)分布:

doc_topic = model.doc_topic_

print("type(doc_topic): {}".format(type(doc_topic)))

print("shape: {}".format(doc_topic.shape))

#一篇文章對應一行,每行的和為1

for n in range(20):

'''for i in doc_topic[n]:

print i

'''topic_most_pr = doc_topic[n].argmax()

print("doc: {} topic: {}".format(n, topic_most_pr))

用LDA處理文字 Python

一 lda介紹 lda latent dirichlet allocation 是一種文件主題生成模型,也稱為乙個三層貝葉斯概率模型,包含詞 主題和文件三層結構。所謂生成模型,就是說,我們認為一篇文章的每個詞都是通過 以一定概率選擇了某個主題,並從這個主題中以一定概率選擇某個詞語 這樣乙個過程得到。...

LDA文字建模

我們日常生活中會產生大量的文字,如果每乙個文字儲存為乙個文件,那每篇文件從人的觀察來說就是有序的詞的序列。統計文字建模的目的就是追問這些觀察到語料庫中的詞序列是如何生成的。我們將上述統計學問題看成上帝拋擲骰子生成的。那麼出現兩個核心的問題 1.上帝都有什麼樣的骰子。即表示模型中都有哪些引數,骰子的每...

用gensim做LDA實踐之文字分類

之前看lda,一直沒搞懂到底作用是什麼,公式推導了一大堆,dirichlet分布求了一堆倒數,卻沒有真正理解精髓在 最近手上遇到了乙個文字分類的問題,採用普通的vsm模型的時候,執行的太慢,後來查詢改進策略的時候,想起了lda,因此把lda重新拉回我的視線,也終於弄懂了到底是做什麼的。為什麼這麼說,...