DTM动态主题模型实战案例

DTM动态主题模型实战案例

针对三个月份某期刊论文的摘要进行时间片上的动态模型主题分析

文章目录

  • DTM动态主题模型实战案例
  • 代码实现所参考博客
  • 一、数据处理
  • 二、使用步骤
  • 1.引入库
  • 2.去除停用词,构建语料库以及词典
  • 3.构建模型
  • 三、结果展示
  • 1.某个主题三个时期主题下词语的概率分布
  • 2.查看生成文档的主题分布


  • 提示:以下是本篇文章正文内容,下面案例可供参考

    一、数据处理

    所选取的数据集是某个期刊三个月以来的论文摘要,共计22条数据信息。每一条代表一条数据信息。

    使用jieba分词对文本数据进行分词操作,结果会存在标点符号。

    #encoding=utf-8
    from __future__ import unicode_literals
    import sys
    sys.path.append("../")
    import re
    import jieba
    import jieba.posseg
    import jieba.analyse
    import re
    
    f = open('1.txt', 'r', encoding='utf-8')
    new_f = open("1.data.txt", "w", encoding="utf-8")
    lines = f.readlines()
    # 代码缺少中文标点符号逗号之类的,不全,分词结果会存在标点符号
    r = '[’,。!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+'
    
    for line in lines:
        print(line)
        line = re.sub(r, '',line)
        line = ' '.join(jieba.cut(line))
        new_f.write(line)
        print(line)
    

    二、使用步骤

    1.引入库

    logging用于查看执行日志,导入的gensim版本是gensim-3.8.3,根据自己系统要求以及pyhton版本选择合适的版本,强调一下最好使用3.8.3版本,不然会报错。

    #coding:utf-8
    # 1.首先导入相关模块:
    import logging
    import sys
    
    from gensim import corpora
    from six import iteritems
    from gensim.models import ldaseqmodel
    from gensim.corpora import Dictionary, bleicorpus
    import csv
    

    2.去除停用词,构建语料库以及词典

    代码如下(示例):

    # 2.接下面,我们需要将myCorpus.txt这个文档转化成DTM模型所需要的语料库,并构造词典
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) #输出日志信息,便于了解程序运行情况
    ## 切片词语列表
    stoplist = set('$ 0 1 2 3 4 5 6 7 8 9 ?  _“  ” 、 。 《 》 一 一些 一何 一切 一则 一方面 一旦 一来 一样 一般 一转眼 万一 上 上下 下 不 不仅 不但 不光 不单 不只 不外乎 不如 不妨 不尽 不尽然 不得 不怕 不惟 不成 不拘 不料 不是 不比 不然 不特 不管 不至于 不若 不论 不过 不问 与 与其 与其说 与否 与此同时 且 且不说 且说 两者 个 个别 临 为 为了 为什么 为何 为止 为此 为着 乃 乃至 乃至于 么 之 之一 之所以  之类 乌乎 乎 乘 也 也好 也罢 了 二来 于 于是 于是乎 云云 云尔 些 亦 人 人们 人家 什么 什么样 今 介于 仍 仍旧 从 从此 从而 他 他人 他们 以 以上 以为 以便 以免 以及 以故 以期 以来 以至 以至于 以致 们 任 任何 任凭 似的 但 但凡 但是 何 何以 何况 何处 何时 余外 作为 你 你们 使  使得 例如 依 依据 依照 便于 俺 俺们  倘 倘使 倘或 倘然 倘若 借 假使 假如 假若 傥然 像 儿 先不先 光是 全体 全部 兮 关于 其 其一 其中 其二 其他 其余 其它 其次 具体地说 具体说来 兼之 内 再 再其次 再则 再有 再者 再者说 再说 冒 冲 况且 几 几时 凡 凡是 凭 凭借 出于 出来 分别 则 则甚 别 别人 别处 别是 别的 别管 别说 到 前后 前此 前者 加之 加以 即 即令 即使 即便 即如 即或 即若 却 去 又 又及 及 及其 及至 反之 反而 反过来 反过来说 受到 另 另一方面 另外  另悉 只 只当 只怕 只是 只有 只消 只要 叫 叮咚 可 可以 可是 可见 各 各个 各位 各种 各自 同 同时 后 后者 向 向使 向着 吓 吗 否则 吧 吧哒 吱 呀 呃 呕 呗 呜 呜呼 呢 呵 呵呵 呸 呼哧 咋 和 咚 咦 咧 咱 咱们 咳 哇 哈 哈哈 哉 哎 哎呀 哎哟 哗 哟 哦 哩 哪 哪个 哪些 哪儿 哪天 哪年 哪怕 哪样 哪边 哪里 哼 哼唷 唉 唯有 啊 啐 啥 啦 啪达 啷当 喂 喏 喔唷 喽 嗡 嗡嗡 嗬 嗯 嗳 嘎 嘎登 嘘 嘛 嘻 嘿 嘿嘿 因 因为 因了 因此 因着 因而 固然 在  在下 在于 地 基于 处在 多 多么 多少 大 大家 她  她们 好 如 如上 如上所述 如下 如何  其 如同 如是 如果 如此 如若 始而 孰料 孰知 宁 宁可 宁愿 宁肯 它 对 对于对待 对方 对比 将 小  尔 尔后 尔尔 尚且 就 就是 就是了  就是说 就算 就要 尽 尽管 尽管如此 岂但 己 已 已矣 巴 巴巴 并 并且 并非 庶乎 庶几 开外 开始 归 归齐 当 当地 当然 当着 彼 彼时 彼此 往 待 很 得 得了 怎 怎么 怎么办 怎么样 怎奈 怎样 总之 总的来看 总的来说 总的说来 总而言之 恰恰相反 您 惟其 慢说 我 我们 或 或则 或是 或曰 或者 截至 所 所以 所在 所幸 所有 才 才能 打 打从 把 抑或 拿 按 按照 换句话说 换言之 据 据此 接着 故 故此 故而 旁人 无 无宁 无论 既 既往 既是 既然 时候 是 是以 是的 曾 替 替代 最 有 有些 有关 有及 有时 有的 望 朝 朝着 本 本人 本地 本着 本身 来 来着 来自 来说 极了 果然 果真 某 某个 某些 某某 根据 欤 正值 正如 正巧 正是 此 此地 此处 此外 此时 此次 此间 毋宁 每 每当 比 比及 比如 比方 没奈何 沿 沿着 漫说 焉 然则 然后 然而 照 照着 犹且 犹自甚且 甚么 甚或 甚而 甚至 甚至于 用 用来 由 由于 由是 由此 由此可见 的 的确 的话 直到 相对而言 省得 看 眨眼 着 着呢 矣 矣乎 矣哉 离 竟而 第 等 等到 等等 简言之 管 类如 紧接着 纵 纵令 纵使 纵然 经 经过 结果 给 继之 继后 继而 综上所述 罢了 者 而 而且 而况 而后 而外 而已 而是 而言 能 能否 腾 自 自个儿 自从 自各儿 自后 自家 自己 自打 自身 至 至于 至今 至若 致 般的 若 若夫 若是 若果  若非 莫不然 莫如 莫若 虽 虽则 虽然 虽说 被 要 要不 要不是 要不然 要么 要是 譬喻  譬如 让 许多 论 设使 设或 设若 诚如 诚然 该 说来 诸 诸位 诸如 谁 谁人谁料 谁知 贼死 赖以 赶 起 起见 趁 趁着 越是 距 跟 较 较之 边 过 还 还是 还有 还要 这 这一来 这个 这么 这么些 这么样 这么点儿 这些 这会儿 这儿 这就是说 这时 这样 这次 这般 这边 这里 进而 连 连同 逐步 通过 遵循 遵照 那 那个 那么 那么些 那么样 那些 那会儿 那儿 那时 那样 那般 那边 那里 都 鄙人 鉴于 针对 阿 除 除了 除外 除开  除此之外 除非 随 随后 随时 随着 难道说 非但 非徒 非特 非独 靠 顺 顺着 首先'.split())
    #构造词典,并去除停用词以及文档中只出现过一次的词
    # dictionary = corpora.Dictionary(line.lower().split() for line in open('datasets/myCorpus.txt'))
    dictionary = corpora.Dictionary(line.lower().split() for line in open('datasets/1.data.txt', encoding='utf-8'))
    stop_ids = [
         dictionary.token2id[stopword]
         for stopword in stoplist
         if stopword in dictionary.token2id
     ]
    once_ids = [tokenid for tokenid, docfreq in iteritems(dictionary.dfs) if docfreq == 1]
    dictionary.filter_tokens(stop_ids + once_ids)  # 去除只出现过一次的词
    dictionary.compactify()       # 删除去除单词后的空格
    print(dictionary)
    dictionary.save('datasets/news_dictionary')  # 保存词典
    #将文档加载成构造语料库
    class MyCorpus(object):
        def __iter__(self):
            for line in open('datasets/1.data.txt', encoding='utf-8'):
                yield dictionary.doc2bow(line.lower().split())
    corpus_memory_friendly = MyCorpus()
    corpus = [vector for vector in corpus_memory_friendly]  # 将读取的文档转换成语料库
    print('语料库'*10)
    print(corpus)
    corpora.BleiCorpus.serialize('datasets/news_corpus', corpus)  # 存储为Blei lda-c格式的语料库
    # 我试图将LDA安装到LDA-C格式的语料库中。我已经让它为HDP模型工作,但我似乎无法让它在gensim中适用于LDA。我希望得到每个文档的主题概率向量以及每个主题的单词概率分布。
    # 这是可行的HDP模型
    # .dat文件具有LDA-C格式的语料库,而.vocab文件具有唯一的单词
    output = open('data.csv', 'w', newline='')
    

    3.构建模型

    logging用于查看执行日志,导入的gensim版本是gensim-3.8.3,根据自己系统要求以及pyhton版本选择合适的版本,强调一下最好使用3.8.3版本,不然会报错。

    # 3.通过上面的工作,我们已经将文档转换成了DTM模型所需要的词典以及语料库,下面把语料库、词典加载到模型中
    try:
        dictionary = Dictionary.load('datasets/news_dictionary') # 加载词典
    except FileNotFoundError as e:
        raise ValueError("SKIP: Please download the Corpus/news_dictionary dataset.")
    corpus = bleicorpus.BleiCorpus('datasets/news_corpus')# 加载语料库
    time_slice = [7, 9, 6]   #设置这个语料库的间隔,此处分为三个时期,第一个时期内有438条新闻,第二为430条,第三个为456条。
    num_topics = 3  #设置主题数,此处为5个主题
    print(corpus)
    ldaseq = ldaseqmodel.LdaSeqModel(corpus=corpus, id2word=dictionary, time_slice=time_slice, num_topics=num_topics) #将语料库、词典、参数加载入模型中进行训练
    print('corpusTopic = ldaseq.print_topics(time=0)')
    corpusTopic = ldaseq.print_topics(time=0)  # 输出指定时期主题分布,此处第一个时期主题分
    print(ldaseq.print_topics(time=0))
    print('='*50)
    print('词料库主题')
    print(corpusTopic)
    
    topicEvolution = ldaseq.print_topic_times(topic=0) # 查询指定主题在不同时期的演变,此处为第一个主题的
    print('='*50)
    print('主题的在不同时期演变')
    print(ldaseq.print_topic_times(topic=0))
    print(ldaseq.print_topic_times(topic=1))
    print(ldaseq.print_topic_times(topic=2))
    
    # 写入数据的csv
    output = open('data.csv', 'w', newline='')
    writer = csv.writer(output)
    for row in ldaseq.print_topic_times(topic=0):
        if row:  # 去除空行
            writer.writerow([row])
    for row in ldaseq.print_topic_times(topic=1):
        if row:  # 去除空行
            writer.writerow([row])
    for row in ldaseq.print_topic_times(topic=2):
        if row:  # 去除空行
            writer.writerow([row])
    print('='*50)
    print('查看第i篇文档的主题分布')
    doc = ldaseq.doc_topics(0) # 查询指定文档的主题分布,此处为第一篇文档的主题分布
    print(doc)
    # print(ldaseq.doc_topics(1))
    # print(ldaseq.doc_topics(2))
    # print(ldaseq.doc_topics(3))
    # print(ldaseq.doc_topics(4))
    # for row in ldaseq.print_topic_times(ldaseq.doc_topics(0)):
    #     if row:  # 去除空行
    #         writer.writerow([row])
    i = 0
    for i in range(23):
        writer.writerow(ldaseq.doc_topics(i))
    
    
    # for row in ldaseq.print_topic_times(ldaseq.doc_topics(1)):
    #     if row:  # 去除空行
    #         writer.writerow([row])
    # for row in ldaseq.print_topic_times(ldaseq.doc_topics(2)):
    #     if row:  # 去除空行
    #         writer.writerow([row])
    print('='*100)
    ldaseq.print_topics(time=0)
    # 不同主题三个时期的情况
    ldaseq.save('dtm_news')
    dtm_model = ldaseq.load('dtm_news')
    

    三、结果展示

    1.某个主题三个时期主题下词语的概率分布


    前三行为第一个主题(主题类型:区块链)在三个时期下词语的分布,中间三行为第二个主题(主题类型:忘了)的三个时期,最后三行为第三个主题(主题类型:人工智能)在三个时期下的分布。

    2.查看生成文档的主题分布

    来源:GMgomgmian

    物联沃分享整理
    物联沃-IOTWORD物联网 » DTM动态主题模型实战案例

    发表评论