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使用的版本,可直接下载,很方便。

这是链接:https://github.com/magsilva/dtm/tree/master/bin

文本要求

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

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

分词处理

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

train = []#储存分词结果的listfor line in comment:line = line.strip()line = "".join(line.split())if not len(line):#判断是否为空行continueoutstr = ' '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 += wordoutstr += " "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.DtmModeldtm_pathcorpus = Nonetime_slices = Nonemode ='fit'model ='dtm'num_topics = 100id2word = Noneprefix = Nonelda_sequence_min_iter = 6lda_sequence_max_iter = 20lda_max_em_iter = 10alpha = 0.01top_chain_var = 0.005rng_seed = 0initialize_lda = True 

  • dtm_pathstr) - dtm二进制文件的路径,例如/ home / username / dtm / dtm / main。
  • corpusiterable of int int 的迭代) - BoW格式的文本集合。
  • time_slicesint的列表) - 时间戳序列。
  • mode{'fit' 'time'} 可选) - 控制模式的模式:'fit'用于训练,'time'用于根据DTM分析文档,基本上是一组。
  • model{'fixed' 'dtm'} 可选) - 将运行的控制模型:'fixed'用于DIM,'dtm'用于DTM。
  • num_topicsint optional) - 主题数。
  • id2wordDictionary,可选) -令牌ID和从胼字之间的映射,如果不是指定的-将被从推断语料库。
  • prefixstr optional) - 生成的临时文件的前缀。
  • lda_sequence_min_iterint optional) - LDA的最小迭代次数。
  • lda_sequence_max_iterint optional) - LDA的最大迭代次数。
  • lda_max_em_iterint optional) - LDA中的最大em优化迭代。
  • alphaint optional) - 超参数,它影响每个时间片中LDA模型的文档主题的稀疏性。
  • top_chain_varint optional) - 影响的超参数。
  • rng_seedint optional) - 随机种子。
  • initialize_ldabool 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: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)

这样,就能正常运行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)

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

Gensim中动态主题模型——dtmmodel的使用相关推荐

  1. gensim中动态主题模型(DTM)两种实现方法(一)

    目录 (一)gensim.models.ldaseqmodel包 1.基本使用方法 2.缩水的地方 (二)gensim.models.wrappers.dtmmodel.DtmModel包 1.没有c ...

  2. gensim中动态主题模型(DTM)两种实现方法(二)

    第一部分内容请点此阅读:gensim中动态主题模型(DTM)两种实现方法(一) 目录 (二)gensim.models.wrappers.dtmmodel.DtmModel包 1.如何使用呢? 2.c ...

  3. python主题建模_在PYTHON中进行主题模型LDA分析

    原文链接:在PYTHON中进行主题模型LDA分析​tecdat.cn 主题建模是一种在大量文档中查找抽象主题的艺术方法.一种作为监督无的机器学习方法,主题模型不容易评估,因为没有标记的"基础 ...

  4. gensim实现LDA主题模型-------实战案例(分析希拉里邮件的主题)

    数据集下载:https://download.csdn.net/download/qq_41185868/10963668 第一步: 加载一些必要的库, 我们用的是gensim中的LDA模型,所以必须 ...

  5. 连续时间动态主题模型(Continuous Time Dynamic Topic Models, cDTM)

    用于分析和管理大量电子文档的工具变得越来越重要.近年来,离散数据的分层贝叶斯模型,已成为一种广泛使用的文本探索和预测分析方法. 主题模型,例如潜在Dirichlet分配(LDA)和更一般的离散分量分析 ...

  6. python数据分析论文报告_Calaméo - 【原创】在PYTHON中进行主题模型LDA分析数据分析报告论文(代码+数据) ....

    [ 原 创 ] 定 制 代 写 开 发 辅 导 答 疑 r/python/spss/matlab/WEKA/sas/sql/C++/stata/eviews/Computer science assi ...

  7. 作者主题模型(Author-Topic Model)的Python Gensim实现

    Gensim中的主题模型包括三种,分别是LDA (Latent Dirichlet Allocation) 主题模型.加入了作者因素的作者主题模型 (Author-Topic Model, ATM) ...

  8. win7 64位 Python3.5.1 scipy,numpy, Gensim主题模型包安装

    由于Gensim 官网暂时还没有Python3.5 对应的版本,本人安装 Gensim时也是各种纠结,因此专门开通博客,想通过博客来记录一下安装过程,希望也能对部分同道中人有点帮助. 环境: win7 ...

  9. NLP︱LDA主题模型的应用难题、使用心得及从多元统计角度剖析

    将LDA跟多元统计分析结合起来看,那么LDA中的主题就像词主成分,其把主成分-样本之间的关系说清楚了.多元学的时候聚类分为Q型聚类.R型聚类以及主成分分析.R型聚类.主成分分析针对变量,Q型聚类针对样 ...

最新文章

  1. ArrayList和LinkList区别
  2. 学python可以做什么知乎-学会python有哪些好处?python抓取知乎神回复
  3. 牛客 - Final Exam(贪心)
  4. Android之MVVM框架 - 数据绑定
  5. 如果编程替换成中文就会怎样? 程序员看了表示头疼
  6. PHP基本语法(实例)
  7. SDEBECMSrv服务
  8. 云图说丨手把手教你为容器应用配置弹性伸缩策略
  9. oracle是delete可以加并行吗,提高Oracle DELETE性能的策略
  10. Oracle 数据库管理脚本 命名规范
  11. [转载] 机器学习之主成分分析PCA(Python实现)
  12. java实现地图导航功能吗_关于微信LBS 升级版后SOSO 地图用JAVA 实现导航功能
  13. css实现风车转动,纯CSS实现的风车转动效果特效演示
  14. 11.05面向对象 封装
  15. python爬虫菜鸟驿站_爬30层楼、扛40斤……5万菜鸟驿站春节快递不打烊
  16. sam格式的结构和意义_NGS数据格式02-SAM/BAM最详细解读
  17. windows部署tensorflow serving
  18. App Tamer for Mac(CPU优化电池管理工具)特别版
  19. JS根据屏幕分辨率自动调整字体大小
  20. javascript中ready和onload的理解

热门文章

  1. IDOC三方销售的退货处理
  2. 手机怎样和宽带连接无线路由器设置路由器连接服务器,初次设置路由器用手机怎么连接?...
  3. 单片机 sfr 和 sbit 的区别
  4. MySQL外键之级联
  5. 别被吃药顺序图误导了,正确用药才是关键!官方发布→
  6. 写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实
  7. 关于gdk_threads_add_idle函数的线程安全问题解释
  8. 微信公众平台开发 高级群发接口
  9. Android O适配
  10. 唯品会跻身一线电商阵营:特卖前景持续看好