NLP LDA主題模型的python實現

2022-03-02 14:55:51 字數 3440 閱讀 4924

在做主題聚類時,主要經過以下幾個步驟:

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

print

(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:

print

(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 假...