在做主題聚類時,主要經過以下幾個步驟:
3、lda模型訓練:這裡經過了建立詞典、轉換文字為索引並計數、計算tf-idf值、訓練lda模型等步驟,具體**如下所述**載自部落格:親測有效):
#部分效果圖如下:-*- coding:utf-8 -*-
"created on mon aug 19 14:56:19 2019@author: luxuriant
"import
numpy as np
from gensim import
corpora, models, similarities
from pprint import
pprint
import
time
#import logging
#logging.basicconfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.info)
defload_stopword():
'''載入停用詞表
:return: 返回停用詞的列表
'''f_stop = open('
stopwords.txt
', encoding='
utf-8')
sw = [line.strip() for line in
f_stop]
f_stop.close()
return
swif
__name__ == '
__main__':
print('
1.初始化停止詞列表 ------')
#開始的時間
t_start =time.time()
#載入停用詞表
stop_words =load_stopword()
print('
2.開始讀入語料資料 ------ ')
#讀入語料庫
f = open('
鄉賢形象文字-cutfile.txt
', encoding='
utf-8')
#語料庫分詞並去停用詞
texts = [[word for word in line.strip().lower().split() if word not
in stop_words] for line in
f]
print('
讀入語料資料完成,用時%.3f秒
' % (time.time() -t_start))
f.close()
m =len(texts)
print('
文字數目:%d個
' %m)
print('
3.正在建立詞典 ------')
#建立字典
dictionary =corpora.dictionary(texts)
v =len(dictionary)
print('
4.正在計算文字向量 ------')
#轉換文字資料為索引,並計數
corpus = [dictionary.doc2bow(text) for text in
texts]
print('
5.正在計算文件tf-idf ------')
t_start =time.time()
#計算tf-idf值
corpus_tfidf =models.tfidfmodel(corpus)[corpus]
print('
建立文件tf-idf完成,用時%.3f秒
' % (time.time() -t_start))
print('
6.lda模型擬合推斷 ------')
#訓練模型
num_topics = 30t_start =time.time()
lda = models.ldamodel(corpus_tfidf, num_topics=num_topics, id2word=dictionary,
alpha=0.01, eta=0.01, minimum_probability=0.001,
update_every=1, chunksize=100, passes=1)
print('
lda模型完成,訓練時間為\t%.3f秒
' % (time.time() -t_start))
#隨機列印某10個文件的主題
num_show_topic = 10 #
每個文件顯示前幾個主題
print('
7.結果:10個文件的主題分布:--')
doc_topics = lda.get_document_topics(corpus_tfidf) #
所有文件的主題分布
idx =np.arange(m)
np.random.shuffle(idx)
idx = idx[:10]
for i in
idx:
topic =np.array(doc_topics[i])
topic_distribute = np.array(topic[:, 1])
#print topic_distribute
topic_idx = topic_distribute.argsort()[:-num_show_topic - 1:-1]
print('
第%d個文件的前%d個主題:
' %(i, num_show_topic)), topic_idx
(topic_distribute[topic_idx])
num_show_term = 10 #
每個主題顯示幾個詞
print('
8.結果:每個主題的詞分布:--')
for topic_id in
range(num_topics):
print('
主題#%d:\t
' %topic_id)
term_distribute_all = lda.get_topic_terms(topicid=topic_id)
term_distribute =term_distribute_all[:num_show_term]
term_distribute =np.array(term_distribute)
term_id =term_distribute[:, 0].astype(np.int)
print('
詞:\t
', )
for t in
term_id:
(dictionary.id2token[t], )
print('
\n概率:\t
', term_distribute[:, 1])
LDA主題模型
先定義一些字母的含義 lda以文件集合d作為輸入 會有切詞,去停用詞,取詞幹等常見的預處理,略去不表 希望訓練出的兩個結果向量 設聚成k個topic,voc中共包含m個詞 lda的核心公式如下 p w d p w t p t d 直觀的看這個公式,就是以topic作為中間層,可以通過當前的 d和 t...
主題模型LDA
某隨機實驗如果有k個可能結局a1 a2 ak,分別將他們的出現次數記為隨機變數x1 x2 xk,它們的概率分布分別是p1,p2,pk,那麼在n次取樣的總結果中,a1出現n1次 a2出現n2次 ak出現nk次的這種事件的出現概率p有下面公式 p x1 n 1,xk nk n n1 nk pn1 1.p...
LDA主題模型
最近看了一下lda的文章,寫個小結,理解正確與否有待驗證.latent dirichlet allocation lda 是三層的層次概率貝葉斯模型 生成模型 用於處理離散資料,比如文字資料.假設一共有 v 個單詞,則第 j 個單詞表示為 w 0,cdots,0,1,0,cdots,0 text 假...