>import gensim
創(chuàng)新互聯(lián),為您提供成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)PVC花箱等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗。創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!
import jieba
import pandas as pd
from gensim import corpora,models
from gensim.models.wrappers import DtmModel
from gensim.corpora import Dictionary
from collections import defaultdict
gensim模塊中的動態(tài)主題模型并不在官方所提供的代碼里。想要使用動態(tài)主題模型,必須先下載保存在github上的二進(jìn)制文件,這個文件有適合linux、win和darwin使用的版本,可直接下載,很方便。
文本要求
根據(jù)我的理解,簡單來說,動態(tài)主題模型就是一種動態(tài)調(diào)參的LDA主題模型,通常將時間線分為幾個等長的時間片。因此按照gensim里的這個模型要求,你必須先把整個事件片里的文本整合到一起,簡而言之,就是你最后放到模型里跑的那個文本列表的長度,必須等于你把時間線分成的段數(shù)。
我在使用的時候,一共八個月,被我分為了八段,所以你最后的corpus的這個list的len也要是8
分詞處理
接下來,你需要先對你需要分析的文本進(jìn)行分詞處理,我使用的代碼如下:
train = []#儲存分詞結(jié)果的list
for line in comment:
line = line.strip()
line = "".join(line.split())
if not len(line):#判斷是否為空行
continue
outstr = ' '
seg_list =jieba.cut(line)
for word in seg_list:
if word not in stopword:
if word != '\t' and word != u'\u200b' and word != '~':
outstr += word
outstr += " "
train.append(outstr.strip().split(" "))
得到train后,還可以篩選掉低頻的單詞:
frenquecy = defaultdict(int)
for patch in train:
for token in patch:
frenquecy[token] += 1
train = [[token for token in patch if frenquecy[token] > threshold]
for patch in train]
然后把分詞結(jié)果向量化:
dic = Dictionary(train)
corpus = [dic.doc2bow(text) for text in train]
這里需要用doc2bow函數(shù)把分詞結(jié)果轉(zhuǎn)化為bow格式的向量list
dtm模型構(gòu)建
可以先去官網(wǎng)看一下,看不懂英文的chrome翻一下就好了
class gensim.models.wrappers.dtmmodel.DtmModel(dtm_path,corpus = None,time_slices = None,mode ='fit',model ='dtm',num_topics = 100,id2word = None,prefix = None,lda_sequence_min_iter = 6,lda_sequence_max_iter = 20,lda_max_em_iter = 10,alpha = 0.01,top_chain_var = 0.005,rng_seed = 0,initialize_lda = True )
dtm_path(str) - dtm二進(jìn)制文件的路徑,例如/ home / username / dtm / dtm / main。
corpus(iterable of (int ,int )的迭代) - BoW格式的文本集合。
time_slices(int的列表) - 時間戳序列。
mode({'fit' ,'time'} ,可選) - 控制模式的模式:'fit'用于訓(xùn)練,'time'用于根據(jù)DTM分析文檔,基本上是一組。
model({'fixed' ,'dtm'} ,可選) - 將運行的控制模型:'fixed'用于DIM,'dtm'用于DTM。
num_topics(int ,optional) - 主題數(shù)。
id2word(Dictionary,可選) -令牌ID和從胼字之間的映射,如果不是指定的-將被從推斷語料庫。
prefix(str ,optional) - 生成的臨時文件的前綴。
lda_sequence_min_iter(int ,optional) - LDA的最小迭代次數(shù)。
lda_sequence_max_iter(int ,optional) - LDA的最大迭代次數(shù)。
lda_max_em_iter(int ,optional) - LDA中的最大em優(yōu)化迭代。
alpha(int ,optional) - 超參數(shù),它影響每個時間片中LDA模型的文檔主題的稀疏性。
top_chain_var(int ,optional) - 影響的超參數(shù)。
rng_seed(int ,optional) - 隨機種子。
initialize_lda(bool ,optional) - 如果為True - 使用LDA初始化DTM
這里的第一個參數(shù)dtm_path,就是指放置你下載的二進(jìn)制文件的位置。
整個函數(shù)中,最玄幻的參數(shù)就是這個time_slices。源代碼中要求,sum(time_slices)要等于你時間片的個數(shù),即len(corpus),但是這個實際上可以有無數(shù)種組合,可是官方文檔里并沒有寫具體這個參數(shù)會對模型有什么樣的影響,我也沒搞懂,就只能使用官方文檔例子的寫法time_slices = [1] * len(corpus)
其他參數(shù)可以使用函數(shù)的默認(rèn)值,也可以自己慢慢調(diào)整。
根據(jù)官方文檔中說的,模型有兩種模式,一種是fit,一種是time。fit完全正常運行,但是time這個模式是根據(jù)時間戳進(jìn)行分析的模式,可見這是我們想要的模式。但是在實際調(diào)用時卻出現(xiàn)問題:
問題1
會告訴你某一個函數(shù)返回了非0值,報錯。根據(jù)錯誤提示,我們一直找到gensim中的utils.py中的1916行,把這里改成:
try:無錫人流多少錢 http://www.bhnfkyy.com/
error = subprocess.CalledProcessError(retcode,cmd)
except Exception:
error = None
問題2
接下來還會報錯,會告訴你各種模型所需要的文件均不存在。我用了好久才明白是怎么回事,原來這個模式自己并不會生成這些初始化的文件,而是需要先運行一次fit模式,再使用fit模式初始化的文件來運行time模型,但是源代碼里并沒有寫這個部分,導(dǎo)致運行失敗,因此修改源代碼dtmmodel.py中的164行:
if corpus is not None:
if self.mode == 'time':
print("time mode")
self.train(corpus, time_slices, 'fit', model)
self.train(corpus, time_slices, mode , model)
elif self.mode == 'fit':
print("train mode")
self.train(corpus, time_slices, mode , model)a
這樣,就能正常運行time模式。代碼如下:
model = DtmModel(path_to_dtm_binary,corpus = corpus,time_slices=time_slice,
id2word=dic,num_topics = num_topics,alpha = alpha,mode='time')
查看的得到的主題:
model.show_topics(num_topics = 10,times=1)
其他使用方法看官方文檔就好了
當(dāng)前標(biāo)題:Gensim中動態(tài)主題模型之dtmmodel的使用
標(biāo)題URL:http://muchs.cn/article40/pjjeho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、電子商務(wù)、移動網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)