Gensim中动态主题模型之dtmmodel的使用
admin
2023-07-07 10:04:22
0

  >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模块中的动态主题模型并不在官方所提供的代码里。想要使用动态主题模型,必须先下载保存在github上的二进制文件,这个文件有适合linux、win和darwin使用的版本,可直接下载,很方便。

    文本要求

  根据我的理解,简单来说,动态主题模型就是一种动态调参的LDA主题模型,通常将时间线分为几个等长的时间片。因此按照gensim里的这个模型要求,你必须先把整个事件片里的文本整合到一起,简而言之,就是你最后放到模型里跑的那个文本列表的长度,必须等于你把时间线分成的段数。

  我在使用的时候,一共八个月,被我分为了八段,所以你最后的corpus的这个list的len也要是8

  分词处理

  接下来,你需要先对你需要分析的文本进行分词处理,我使用的代码如下:

  train = []#储存分词结果的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]

  然后把分词结果向量化:

  dic = Dictionary(train)

  corpus = [dic.doc2bow(text) for text in train]

  这里需要用doc2bow函数把分词结果转化为bow格式的向量list

  dtm模型构建

  可以先去官网看一下,看不懂英文的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'用于训练,'time'用于根据DTM分析文档,基本上是一组。

  model({'fixed' ,'dtm'} ,可选) - 将运行的控制模型:'fixed'用于DIM,'dtm'用于DTM。

  num_topics(int ,optional) - 主题数。

  id2word(Dictionary,可选) -令牌ID和从胼字之间的映射,如果不是指定的-将被从推断语料库。

  prefix(str ,optional) - 生成的临时文件的前缀。

  lda_sequence_min_iter(int ,optional) - LDA的最小迭代次数。

  lda_sequence_max_iter(int ,optional) - LDA的最大迭代次数。

  lda_max_em_iter(int ,optional) - LDA中的最大em优化迭代。

  alpha(int ,optional) - 超参数,它影响每个时间片中LDA模型的文档主题的稀疏性。

  top_chain_var(int ,optional) - 影响的超参数。

  rng_seed(int ,optional) - 随机种子。

  initialize_lda(bool ,optional) - 如果为True - 使用LDA初始化DTM

  这里的第一个参数dtm_path,就是指放置你下载的二进制文件的位置。

  整个函数中,最玄幻的参数就是这个time_slices。源代码中要求,sum(time_slices)要等于你时间片的个数,即len(corpus),但是这个实际上可以有无数种组合,可是官方文档里并没有写具体这个参数会对模型有什么样的影响,我也没搞懂,就只能使用官方文档例子的写法time_slices = [1] * len(corpus)

  其他参数可以使用函数的默认值,也可以自己慢慢调整。

  根据官方文档中说的,模型有两种模式,一种是fit,一种是time。fit完全正常运行,但是time这个模式是根据时间戳进行分析的模式,可见这是我们想要的模式。但是在实际调用时却出现问题:

  问题1

  会告诉你某一个函数返回了非0值,报错。根据错误提示,我们一直找到gensim中的utils.py中的1916行,把这里改成:

  try:无锡人流多少钱 http://www.bhnfkyy.com/

  error = subprocess.CalledProcessError(retcode,cmd)

  except Exception:

  error = None

  问题2

  接下来还会报错,会告诉你各种模型所需要的文件均不存在。我用了好久才明白是怎么回事,原来这个模式自己并不会生成这些初始化的文件,而是需要先运行一次fit模式,再使用fit模式初始化的文件来运行time模型,但是源代码里并没有写这个部分,导致运行失败,因此修改源代码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)

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


相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...