Python之LDA主題模型算法應(yīng)用
原文鏈接:http://tecdat.cn/?p=5318
?
在這篇文章中,我將介紹用于Latent Dirichlet Allocation(LDA)的lda Python包的安裝和基本用法。我不會(huì)在這篇文章中介紹該方法的理論基礎(chǔ)。然而,這個(gè)模型的主要參考,Blei etal 2003可以在線免費(fèi)獲得,我認(rèn)為將語(yǔ)料庫(kù)(文檔集)中的文檔分配給基于單詞矢量的潛在(隱藏)主題的主要思想是相當(dāng)容易理解的而這個(gè)例子(來(lái)自lda)將有助于鞏固我們對(duì)LDA模型的理解。那么,讓我們開始......
安裝lda
在之前的帖子中,我介紹了使用pip和?virtualenwrapper安裝Python包,請(qǐng)參閱帖子了解更多詳細(xì)信息:
在Ubuntu 14.04上安裝Python包
在Ubuntu 14.04上的virtualenv和virtualenvwrapper
簡(jiǎn)而言之,我將提到兩種方法:
方法1:
我將以用戶身份安裝lda
$ pip install --user lda
這也將安裝所需的pbr包。現(xiàn)在我將 在一個(gè)設(shè)置中提供lda,其中包含我之前安裝的所有其他軟件包(再次參見上文)。使用此方法,您應(yīng)該在安裝后得到類似的內(nèi)容:
$ pip show lda
名稱:lda
版本:0.3.2
位置:/home/cstrelioff/.local/lib/python2.7/site-packages
需要:pbr,numpy
我已經(jīng)安裝了numpy,因此沒有修改。
所以,就是這樣,lda已經(jīng)安裝好了。讓我們一起完成隨包提供的示例。
一個(gè)例子
lda github存儲(chǔ)庫(kù)中的示例查看路透社新聞發(fā)布的語(yǔ)料庫(kù) - 讓我們復(fù)制一下并添加一些細(xì)節(jié)以更好地了解正在發(fā)生的事情。此要點(diǎn)提供了一個(gè)包含所有要遵循的代碼的腳本,名為 ex002_lda.py。首先,我們做一些導(dǎo)入:
import?numpy?as?np
import?lda
import?lda.datasets
接下來(lái),我們導(dǎo)入用于示例的數(shù)據(jù)。這包含在 lda包中,因此這一步很簡(jiǎn)單(我還打印出每個(gè)項(xiàng)目的數(shù)據(jù)類型和大?。?/p>
從上面我們可以看到有395個(gè)新聞項(xiàng)目(文檔)和一個(gè)大小為4258的詞匯表。文檔術(shù)語(yǔ)矩陣X具有395個(gè)詞匯表中每個(gè)4258個(gè)詞匯單詞的出現(xiàn)次數(shù)。文檔。例如,X [0,3117]是單詞3117在文檔0中出現(xiàn)的次數(shù)。我們可以找出計(jì)數(shù)和與之對(duì)應(yīng)的單詞(讓我們也得到文檔標(biāo)題):
doc_id?=?0
word_id?=?3117
print (“doc id:{} word id:{}”?。format?(doc_id?,?word_id?))
print (“ - count:{}”?。format?(X?[?doc_id?,?word_id?]))
print (“ - word:{}”?。format?(vocab?[?word_id?]))
print (“ - doc:{}”?。format?(titles?[?doc_id?]))
doc id?:?0?word id?:?3117
-?count?:?2
-?word?:?heir?-?to?-?the?-?throne
?當(dāng)然我們應(yīng)該期望X 矩陣中有很多零 - 我選擇這個(gè)例子來(lái)獲得非零結(jié)果。
選擇模型
接下來(lái),我們初始化并擬合LDA模型。要做到這一點(diǎn),我們必須選擇主題的數(shù)量(其他方法也可以嘗試查找主題的數(shù)量,但對(duì)于LDA,我們必須假設(shè)一個(gè)數(shù)字)。繼續(xù)我們選擇的示例:
model?=?lda?。LDA?(n_topics?= 20 ,?n_iter?= 500 ,?random_state?= 1 )
先前有幾個(gè)參數(shù)我們保留默認(rèn)值。據(jù)我所知,這只使用對(duì)稱先驗(yàn) - 我將不得不更多地研究它(參見Wallach etal 2009討論這個(gè)問題)。
主題字
從擬合模型中我們可以看到主題詞概率:
從輸出的大小我們可以看出,對(duì)于20個(gè)主題中的每一個(gè),我們?cè)谠~匯表中分配了4258個(gè)單詞。對(duì)于每個(gè)主題,應(yīng)該對(duì)單詞的概率進(jìn)行標(biāo)準(zhǔn)化。我們來(lái)看看前5:
for?n?in?range?(5 ):
sum_pr?=?sum?(topic_word?[?n?,:])
print (“topic:{} sum:{}”?。format?(n?,?sum_pr?))
?
我們還可以獲得每個(gè)主題的前5個(gè)單詞(按概率):
?*?主題?6
-?德國(guó) 德國(guó) 戰(zhàn)爭(zhēng) 政治 政府
*?主題?7
-?哈里曼 你。小號(hào) 克林頓 丘吉爾 大使
*?主題?8
-?葉利欽 的俄羅斯 俄羅斯 總統(tǒng) 克里姆林宮
*?主題?9
-?王子 女王 鮑爾斯 教會(huì) 王
*?主題?10
-?辛普森 億 年前 南
-?bernardin 紅衣主教 癌癥 教會(huì) 生活
*?主題?17
-?死于 喪葬 教會(huì) 城市 死亡
*?主題?18
-?博物館 肯尼迪 文化 城市 文化
*?主題?19
-?藝術(shù) 展 世紀(jì) 城市 之旅
這讓我們了解了20個(gè)主題可能意味著什么 - 你能看到模式嗎?
文檔主題
我們從模型中獲得的其他信息是文檔主題概率:
doc_topic?=?model?。doc_topic_
查看輸出的大小,我們可以看到395個(gè)文檔中的每個(gè)文檔都有20個(gè)主題的分布。這些應(yīng)該針對(duì)每個(gè)文檔進(jìn)行標(biāo)準(zhǔn)化,讓我們測(cè)試前5個(gè):
for?n?in?range?(5 ):
sum_pr?=?sum?(doc_topic?[?n?,:])
print (“document:{} sum:{}”?。format?(n?,?sum_pr?))
文件:?0?總和:?1.0
文件:?1?總和:?1.0
文件:?2?總和:?1.0
文件:?3?總和:?1.0
文件:?4?總和:?1.0
使用新故事的標(biāo)題,我們可以對(duì)最可能的主題進(jìn)行抽樣:
for?n?in?range?(10 ):
topic_most_pr?=?doc_topic?[?n?] 。argmax?()
print (“doc:{} topic:{} \ n {} ...”?。format?(n?,
topic_most_pr?,
titles?[?n?] [:50 ]))
?
可視化
?讓我們看看一些主題詞分布是什么樣的。這里的想法是每個(gè)主題應(yīng)該有一個(gè)獨(dú)特的單詞分布。在下面的詞干圖中,每個(gè)詞干的高度反映了焦點(diǎn)主題中單詞的概率:
plt?。tight_layout?()
plt?。show?()
?

最后,讓我們看一下幾個(gè)文檔的主題分布。這些分布給出了每個(gè)文檔的20個(gè)主題中每個(gè)主題的概率。我只會(huì)畫一些:
plt?。tight_layout?()
plt?。show?()
?
????

?