import gensim  import jieba  import pandas as pd  from gensim import corpora,models  from gensim.models.wrappers import DtmModel  from..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Gensim中動態(tài)主題模型之dtmmodel的使用

發(fā)布時間:2020-07-29 08:23:14 來源:網(wǎng)絡(luò) 閱讀:1040 作者:nineteens 欄目:編程語言

  >import gensim

  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上的二進制文件,這個文件有適合linux、win和darwin使用的版本,可直接下載,很方便。

    文本要求

  根據(jù)我的理解,簡單來說,動態(tài)主題模型就是一種動態(tài)調(diào)參的LDA主題模型,通常將時間線分為幾個等長的時間片。因此按照gensim里的這個模型要求,你必須先把整個事件片里的文本整合到一起,簡而言之,就是你最后放到模型里跑的那個文本列表的長度,必須等于你把時間線分成的段數(shù)。

  我在使用的時候,一共八個月,被我分為了八段,所以你最后的corpus的這個list的len也要是8

  分詞處理

  接下來,你需要先對你需要分析的文本進行分詞處理,我使用的代碼如下:

  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二進制文件的路徑,例如/ 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,就是指放置你下載的二進制文件的位置。

  整個函數(shù)中,最玄幻的參數(shù)就是這個time_slices。源代碼中要求,sum(time_slices)要等于你時間片的個數(shù),即len(corpus),但是這個實際上可以有無數(shù)種組合,可是官方文檔里并沒有寫具體這個參數(shù)會對模型有什么樣的影響,我也沒搞懂,就只能使用官方文檔例子的寫法time_slices = [1] * len(corpus)

  其他參數(shù)可以使用函數(shù)的默認值,也可以自己慢慢調(diào)整。

  根據(jù)官方文檔中說的,模型有兩種模式,一種是fit,一種是time。fit完全正常運行,但是time這個模式是根據(jù)時間戳進行分析的模式,可見這是我們想要的模式。但是在實際調(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)

  其他使用方法看官方文檔就好了


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI