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

2023-11-07

Gensim中的主题模型包括三种,分别是LDA (Latent Dirichlet Allocation) 主题模型、加入了作者因素的作者主题模型 (Author-Topic Model, ATM) 和加入了时间因素的动态主题模型 (Dynamic Topic Models, DTM)

作者主题模型(ATM)的输入除了分词后的文章内容,还包括作者和文章的对应关系;模型的输出为每位作者对于每个主题(主题数n可以自己设定)的倾向度。

LDA主题模型在许多研究中都已广泛应用,在网上也有相当多的程序资料,但ATM模型的相关代码资料却不甚完整,在前段时间比赛查找资料的过程中也遇到了一些困扰,后来看了英文的官方文档才得以解决。因此本文介绍Gensim包中ATM模型完整实现的过程,完整代码附在最后。

目录

1. ATM模型原理

2. Author-Topic Model的英文文档

3. Python调用Gensim的实现过程

3.1 导入相关包

3.2 准备数据

3.3 文本向量化

3.4 模型训练

3.5 模型结果输出 

3.6 模型保存和载入

4. 完整实现


1. ATM模型原理

Author Topic Model解析_chinaliping的博客-CSDN博客https://blog.csdn.net/chinaliping/article/details/9299953

Author Topic Model[ATM理解及公式推导]_HFUT_qianyang的博客-CSDN博客参考论文Modeling documents with topicsModeling authors with wordsThe author-topic modelGibbs sampling algorithms详细经典LDA模型目标分布及参数Author Model目标分布及参数Author-topic model目标分布及参数本文作者:合肥工业大学 管理学院 钱洋 email:https://qianyang-hfut.blog.csdn.net/article/details/54407099

2. Author-Topic Model的英文文档

models.atmodel – Author-topic models — gensim (radimrehurek.com)https://radimrehurek.com/gensim/models/atmodel.html

3. Python调用Gensim的实现过程

3.1 导入相关包

from gensim.corpora import Dictionary
from gensim.models import AuthorTopicModel

3.2 准备数据

ATM模型需要的数据主要包括:

  1. 每篇文章的分词列表
  2. 每篇文章的作者列表(相比LDA模型需要额外准备的数据)
  3. 作者与文章(下标)的对应关系(通过转换得到)
# 这里是使用pandas的DataFrame来读取csv表格中的数据,其中包含分词、作者等信息。
import pandas as pd
df = pd.read_csv('data.csv')

# 数据中的“分词”列是用空格分隔的词语,如果数据没有分词,还需要使用jieba等分词工具进行分词
df['分词'] = df['分词'].map(lambda x: x.split())  # 用split还原成列表

data = df['分词'].values.tolist()  # 每篇文章的分词列表,每个内层列表包含一篇文章的内容
# 示例:[['我', '喜欢', '猫'], ['他', '喜欢', '狗'], ['我们', '喜欢', '动物']]

author = df['作者'].values.tolist()  # 每篇文章的作者列表
# 示例:['作者1', '作者2', '作者1']

# 将作者和文章的对应关系转换为模型需要的格式
author2doc = {}
for idx, au in enumerate(author):
    if au in author2doc.keys():
        author2doc[au].append(idx)
    else:
        author2doc[au] = [idx]
# 转换后示例:{'作者1': [0, 2], '作者2': [1]}

3.3 文本向量化

这里采用的是词袋模型,将每一篇文章转换为BOW (Bag of words) 向量,可以用filter_n_most_frequent()过滤高频词。

dictionary = Dictionary(data)
dictionary.filter_n_most_frequent(50)  # 过滤最高频的50个词
corpus = [dictionary.doc2bow(text) for text in data]

3.4 模型训练

训练ATM模型,如果数据量较大可能需要比较久的时间,其中num_topics参数可以设定目标的主题个数,这里为10。

atm = AuthorTopicModel(corpus, num_topics=10, author2doc=author2doc, id2word=dictionary)

3.5 模型结果输出 

获取每个主题的主题词及其权重,其中num_words参数可以控制每个主题输出的主题词数量。

atm.print_topics(num_words=20)

获取某位作者的主题分布

atm.get_author_topics('作者1')

每位作者的主题分布

author_topics = {au: atm.get_author_topics(au) for au in set(author)}

3.6 模型保存和载入

保存模型训练结果,需要注意的是模型文件不止一个,载入时也需要保持完整,不可删除。

atm.save('atm.model')

载入模型

atm = AuthorTopicModel.load('atm.model')

4. 完整实现

from gensim.corpora import Dictionary
from gensim.models import AuthorTopicModel
import pandas as pd

df = pd.read_csv('data.csv')

# 数据中的“分词”列是用空格分隔的词语,如果数据没有分词,还需要使用jieba等分词工具进行分词
df['分词'] = df['分词'].map(lambda x: x.split())  # 用split还原成列表

data = df['分词'].values.tolist()  # 每篇文章的分词列表
author = df['作者'].values.tolist()  # 每篇文章的作者列表

# 将作者和文章的对应关系转换为模型需要的格式
author2doc = {}
for idx, au in enumerate(author):
    if au in author2doc.keys():
        author2doc[au].append(idx)
    else:
        author2doc[au] = [idx]

# 文本向量化
dictionary = Dictionary(data)
dictionary.filter_n_most_frequent(50)  # 过滤最高频的50个词
corpus = [dictionary.doc2bow(text) for text in data]

atm = AuthorTopicModel(corpus, num_topics=10, author2doc=author2doc, id2word=dictionary)
atm.print_topics(num_words=20)  # 打印每个主题前20个主题词

author_topics = {au: atm.get_author_topics(au) for au in set(author)}  # 作者主题分布

atm.save('atm.model')  # 保存模型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作者主题模型(Author-Topic Model)的Python Gensim实现 的相关文章

  • 列出类的所有实例

    我编写了一个 Python 模块 其中有几个类继承自一个名为MasterBlock 我想在脚本中导入此模块 创建这些类的多个实例 然后获取该类的所有子级的所有现有实例的列表MasterBlock班级 我找到了一些解决方案vars Block
  • 如何以 HDF5 格式提供 caffe 多标签数据?

    我想将 caffe 与矢量标签一起使用 而不是整数 我检查了一些答案 似乎 HDF5 是更好的方法 但后来我陷入了这样的错误 precision layer cpp 34 检查失败 outer num inner num bottom 1
  • “NoneType”对象不可订阅?

    list1 name1 info1 10 list2 name2 info2 30 list3 name3 info3 50 MASTERLIST list1 list2 list3 def printer lst print Availa
  • 以类似字典的方式将新项目添加到某些结构化数组中

    我想扩展 numpy 中的结构化数组对象 以便我可以轻松添加新元素 例如 对于一个简单的结构化数组 gt gt gt import numpy as np gt gt gt x np ndarray 2 dtype names A B fo
  • 如何/在哪里发布 Python 包

    如果一个人创建了一个有用的 Python 包 那么如何 在哪里发布 宣传它以供其他人使用 我已经把它放到了 github 上 但几周后谷歌也没有找到它 包装整洁完整 我制作它供我个人使用 不与其他人分享将是一种耻辱 这是 PyPI 指南 h
  • 日期/时间值的 Django URL 转换器

    我正在尝试使用 Django 内置的 URL 转换器将 URL 中的日期时间字符串转换为视图中的日期对象 如果我手动输入 URL 它们会按预期工作 但尝试为其生成 URL 时找不到匹配项 我的转换器很简单 from django utils
  • Python:如何删除圆括号内的文本?

    我试过了 但没用 return re sub myResultStats text 建议 thanks 尝试这个 return re sub myResultStats text 括号表示捕获组 因此您必须转义它们
  • 映射器无法组装任何主键列

    我从 sqlite 表创建了一个临时表 该表是基于各种选择标准的原始表的子集 屏幕截图中有一个示例 我试图一次循环一个表记录 以便更新每个记录中的字段 我有 source table self source engine create en
  • 将带有非字符串关键字的 dict 传递给 kwargs 中的函数

    我使用具有签名功能的库f args kwargs 我需要在 kwargs 参数中传递 python dict 但 dict 不包含关键字中的字符串 f 1 2 3 4 Traceback most recent call last File
  • VSCode Jupyter Notebook - 恢复缓存版本

    我正在使用在 Ubuntu 19 10 上运行的 VSCode v 1 48 0 创建一个 Jupyter Notebook VSCode 崩溃了 不幸的是我没有保存笔记本 当我重新启动时它是空的 我已经能够在 config Code Us
  • 无法将 python 数据框中的列类型从 object 转换为 str

    我已经下载了一个csv文件 然后将其读取到python dataframe 现在所有4列都有对象类型 我想将它们转换为str类型 现在dtypes的结果如下 Name object Position Title object Departm
  • 设置区域设置和字符串模块

    这个简单的脚本 from locale import LC ALL setlocale print setlocale LC ALL from string import letters print letters 给我这个输出 tr TR
  • __subclasses__ 没有显示任何内容

    我正在实现一个从适当的子类返回对象的函数 如果我搬家SubClass from base py 没有出现子类 subclasses 它们必须在同一个文件中吗 也许我从来没有直接导入subclass py对Python隐藏子类 我能做些什么
  • Emacs:调试Python的方法

    我把这个贴在程序员 stackexchange com https softwareengineering stackexchange com questions 29844 emacs methods for debugging pyth
  • 使用 pythons strftime 显示日期,例如“5 月 5 日”? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 日期顺序输出 https stackoverflow com questions 739241 python date ordinal output 在Python中 time strf
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • NumPy 数组不可 JSON 序列化

    创建 NumPy 数组并将其保存为 Django 上下文变量后 加载网页时收到以下错误 array 0 239 479 717 952 1192 1432 1667 dtype int64 is not JSON serializable
  • Tensorflow:提要字典错误:您必须为占位符张量提供值

    我有一个错误 我无法找出原因 这是代码 with tf Graph as default global step tf Variable 0 trainable False images tf placeholder tf float32
  • 使用 boto3 将 csv 文件保存到 s3

    我正在尝试写入 CSV 文件并将其保存到 s3 中的特定文件夹 存在 这是我的代码 from io import BytesIO import pandas as pd import boto3 s3 boto3 resource s3 d
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入

随机推荐

  • 使用 AopContext.currentProxy() 报错:java.lang.IllegalStateException: Cannot find current proxy

    报错信息 java lang IllegalStateException Cannot find current proxy Set exposeProxy property on Advised to true to make it av
  • layui+PHP文件上传

    layui官方网站 http www layui com 一个很好的前端框架 现在也出了后台模板 收费 值得我们学习和借鉴 非常感谢作者 贤心 的开源和维护 一 下载layui部署到项目 在页面引入layui css和layui js 二
  • xml的读取分析 key value

    package com basedata xml import java io ByteArrayInputStream import java io File import java io FileInputStream import j
  • Visio直角连接线增加直角拐弯

    首先选中线条 然后在中点的地方按住shift键再拖动鼠标 就可以实现多个直角转弯了
  • autobank渗流分析计算教程_jade基本操作(4.晶格常数计算)

    微信公众号试行乱序推送 为了不错过更新 请点击本页面最上方的 结构分析表征 进入公众号主页 点击右上角的三个小点点 在弹出的界面点击 设为星标 并在看完图文或视频后点击右下角的 在看 和 赞 本公众号以各类仪器的测试 分析教程 欢迎关注同名
  • 莫烦tensorflow系列教程学习

    1 普通机器学习预测函数系数 y 0 1x 0 3 coding gbk import tensorflow as tf import numpy as np 生成数据 y 0 1x 0 3 x data np random rand 10
  • MySQL如何导入大量数据?

    有时我们会遇到需要将大量数据导入MySQL的需求 一般数据存储在csv或者txt中 数据由 分隔 这里提供两种方案供大家选择 一 创建测试表 为了测试 我们先创建数据库和表 并创建一个用户 create database loaddata
  • LevelDb(一):LevelDb简介

    1 leveldb简介 2 hello world 2 1 leveldb源码下载和编译 2 2 hello world程序 1 leveldb简介 LevelDb是google的工程师Jeff Dean和Sanjay Ghemawat这两
  • Netty应用(五)架设WebSocket服务

    Springboot有封装好的Websocket包 只需要几个简单的类和注解就能提供服务 在Java程序中 我们可以使用Netty来实现Websocket服务 依赖 compile io netty netty all 4 1 63 Fin
  • httpurlconnection中设置cookie的时机问题

    http blog csdn net archer zoro article details 42041883 遇到一个问题 先记录一下 在用httpurlconnection进行post提交的时候 需要将之前得到的cookie带入 之前是
  • ai2022中文版(支持m1) ai2022mac版

    最新版本的Illustrator 2022 for Mac中文版已经更新啦 这是一款专业的矢量图形设计软件 这次的ai 2022 mac版新增和改进了不少功能 比如应用3D效果 支持使用Adobe Substance材质添加纹理 通过发现面
  • ThinkPad在开机时常见的报错信息及含义

    0177 Bad SVP data stop POST task The checksum of the supervisor password in the EEPROM is not correct System board 主板问题
  • Nest.js 写一个简单的增删改查

    这篇文章主要记录了一个简单的增删改查应用 涉及到了MongoDB Swagger 以及以express为底层的Nest js框架 简单介绍一下用到的工具 swagger就不用说了 MongoDB同样使用docker容器和mongo expr
  • MySql5.6 Window超详细安装教程

    林炳文Evankaka原创作品 转载请注明出处http blog csdn net evankaka 目录 一 安装包准备二 开始安装三 验证安装四 客户端工具 一 安装包准备 1 下载MySql5 6 http www mysql com
  • 配置完dcom需要重启计算机,DCOM电脑自动重启(win7系统一直反复重启)

    电脑频繁重启会怎么样 电脑给我们带来了便利 但也给我们带来了许多问题 有网友反映电脑不到10分钟就会自动重启 但是不知道是什么原因导致的 很困惑 针对这种情况 边肖给大家带来了电脑自动重启的原因和相应的解决方案 可以参考一下 电脑经常自动重
  • 生成式 AI 行业解决方案指南与部署实践

    生成式 AI 和 Stable diffusion 生成式 AI Generative AI 可以生成自然语言 图像 视频和音乐等数字化内容 目前热点应用总体上可以分为基于 Stable Diffusion 的图片内容生成类任务以及基于大语
  • 《数据库原理及应用》MySQL版知识点总结

    1 数据库系统的基本原理 1 1 数据库系统概述 1 1 1 基本概念 1 1 2 数据管理技术的发展阶段 1 2 数据模型 1 2 1 数据抽象的过程 1 2 2 关系模型 1 3 数据库体系结构 1 3 1 数据库系统的三级结构 1 3
  • C语言 malloc(0)的问题

    转载地址 http blog csdn net bigheaven article details 7286862 感谢作者 如下 cpp view plain copy include
  • quasar使用vxe-table插件

    问题描述 提示 这里描述具体问题 在前端开发时经常会用到表格显示数据 但是在quasar的q table中没有能实现我们目的属性 这时就需要更强大的插件来完成 这个就是vxe table插件 实现更多的表格功能 原因分析 提示 这里填写问题
  • 作者主题模型(Author-Topic Model)的Python Gensim实现

    Gensim中的主题模型包括三种 分别是LDA Latent Dirichlet Allocation 主题模型 加入了作者因素的作者主题模型 Author Topic Model ATM 和加入了时间因素的动态主题模型 Dynamic T