LDA主题模型

在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model)能够识别在文档里的主题,并且挖掘语料里隐藏信息,并且在主题聚合、从非结构化文本中提取信息、特征选择等场景有广泛的用途。

一、模型介绍

LDA 模式是生成式模型,在这里,假设需要建模的数据为 X,标签信息为 Y。判别式模型:对 Y
的产生过程进行描述,对特征信息本身不建模。判别式模型有利于构建分类器或者回归分析生成式模型时需要对 X和 Y 同时建模,更适合做无监督学习分析。

生成式模型:描述一个联合概率分布 P(X,Y)的分解过程,这个分解过程是虚拟的过程,真实的数据不是这么产生的,但是任何一个数据的产生过程可以在数学上等价为一个联合概率分布

LDA 主题模型是三层贝叶斯概率生成模型,该模型认为文档是主题的概率分布,而主题是词汇的概率分布,LDA 概率图模型如图所示:

二、原理分析

LDA 是一种矩阵分解技术,在向量空间中,任何语料(文档的集合)可以表示为文档(Document - Term,DT)矩阵。下面矩阵表达了一个语料库的组成:

其中,N个文档 D_{1}D_{2} ...D_{n}的组成语料库,M个词 W1,W2,…,Wm 组成词汇表。矩阵中的值表示了词 Wj 在文档 Di中出现的频率。

同时,LDA 将这个矩阵转换为两个低维度的矩阵,M1和 M2。

M1矩阵是一个 N∗Kdocument - topic 矩阵
N是指文档的数量,K是指主题的数量,M1中,\theta _{i}是一个长度为 k的向量,用于描述当前文档 \theta _{i}
在 k个主题上的分布情况,Z表示具体的主题。

 M2矩阵的情况,它是一个 K∗V维的 topic - term矩阵,K是指主题的数量,V指词汇表的大小。M2中每一行都是一个 \phi 分布,也就是主题\phi _{k}在 m个词上的多项式分布情况,可以通过学习得到。

三、训练过程

LDA 主题模型采用 Gibbs 采样算法,对第 m 篇文档的第 i 个单词 t 的隐含主题采样。吉布斯采样首先选取概率向量的一个纬度,给定其他维度变量值当前维度的值,不断收敛来输出代估参数:

1. 随机给每一篇文档的每一个字\omega 随机分配主题编号 z

2. 统计每个主题z_{i} 下出现字\omega 的数量,每个文档n中出现主题z_{i}中字\omega 的数量

3. 每次排除当年词\omega 的主题z_{i} ,根据其他所有词的主题分类,来估计当前词\omega 分配到各个主题z_{1},z_{2}...z_{n}的概率。得到概率分布后,重新为词采样一个新的主题z_{1} 。用同样的方法不断更新到下一个词的主题,直到每个文档下的主题分布\theta _{n}和每个主题下的词分布\varphi _{k}收敛。

4. 最后输出待估计参数\theta _{n}\varphi _{k}

二、LDA 的参数

β:表示 topic-word 密度, β越高,主题包含的单词更多,反之包含的单词更少

α:表示 document-topic 密度, α越高,文档包含的主题更多,反之包含的主题更少

主题数量:主题数量从语料中抽取得到,使用 Kullback Leibler Divergence Score 可以获取最好的主题数量。

主题词数:组成一个主题所需要的词的数量。这些词的数量通常根据需求得到,如果说需求是抽取特征或者关键词,那么主题词数比较少,如果是抽取概念或者论点,那么主题词数比较多。

迭代次数:使得 LDA 算法收敛的最大迭代次数

三、代码实现
1. 通过调整观测困惑度和一致性调整参数 
from gensim.models.coherencemodel import CoherenceModel
import matplotlib.pyplot as plt

# 尝试不同的主题数量
num_topics_range = range(2, 11)
perplexity_scores = []
coherence_scores = []
for num_topics in num_topics_range:
    print(f"\nTrying with {num_topics} topics:")

    # 训练 LDA 模型
    lda_model = LdaModel(corpus, num_topics=num_topics, id2word=dictionary, passes=20, random_state=1)

    # 计算困惑度
    perplexity_score = lda_model.log_perplexity(corpus)
    perplexity_scores.append(perplexity_score)

    # 计算一致性
    coherence_model = CoherenceModel(model=lda_model, texts=train_set, dictionary=dictionary, coherence='c_v')
    coherence_score = coherence_model.get_coherence()
    coherence_scores.append(coherence_score)

# 绘制曲线图
plt.figure(figsize=(10, 5))

# 绘制困惑度曲线
plt.subplot(1, 2, 1)
plt.plot(num_topics_range, perplexity_scores, marker='o')
plt.title('Perplexity vs. Number of Topics')
plt.xlabel('Number of Topics')
plt.ylabel('Perplexity')
plt.grid(True)
# 绘制一致性曲线
plt.subplot(1, 2, 2)
plt.plot(num_topics_range, coherence_scores, marker='o', color='orange')
plt.title('Coherence vs. Number of Topics')
plt.xlabel('Number of Topics')
plt.ylabel('Coherence')
plt.grid(True)
plt.tight_layout()
plt.show()

困惑度:困惑度值越低越好,选择困惑度最小的主题数

一致性:一致性值越高越好,选择一致性最大的主题数

2. 模型参数调整
lda_model = LdaModel(corpus, num_topics=num_topics, id2word=dictionary, passes=20, random_state=1)

corpus: 训练LDA模型的基础数据。文档-词频矩阵或doc2bow格式的数据,代表预处理后的文档集合。

id2word: Dictionary对象,包含了词汇表和词语到索引的映射。通常从文档集合自动生成。

num_topics: 主题数量;默认值为1。

chunksize: 每次迭代处理的文档块大小。较大的块大小可以加快训练速度,但可能需要更多内存。默认值为10。

passes: 对整个语料库的遍历次数。更多的遍历可能会提高模型的质量,但也会增加计算时间。默认值为1。

iterations: 每次遍历中的迭代次数。默认值为20。

alpha: 可选。主题 Dirichlet 分布的共现参数。可以使用'symmetric'(默认)或'asymmetric',或者直接指定为一个正的浮点数。较小的值会使模型倾向于更多的主题共享词语,较大的值会使模型倾向于更少的主题共享词语。

eta: 文档 Dirichlet 分布的共现参数。可以使用'auto'(默认),'1/N'或直接指定为一个正的浮点数,其中N是词汇表的大小。较大的值会使主题分布更均匀,较小的值可能会导致更集中的主题分布。

random_state: 随机数生成器的种子。用于确保结果的可重复性。默认为None,即随机。

update_every: 每隔多少文档更新一次主题分配。较小的值可以加快训练速度,但可能会影响模型质量。默认值为1。

perplexity: 是否在训练过程中计算困惑度(perplexity)。困惑度是衡量模型拟合数据好坏的指标。默认值为False。

chaining: 是否使用“chaining”近似来加速训练过程。开启此选项可以显著加快训练速度,但可能会略微降低模型质量。默认值为True。

calc_prob: 是否在训练结束后计算文档中每个词语属于每个主题的概率。这会增加额外的内存消耗。默认值为False。
四、词向量(Word2Vec) + 主题模型(LDA) + 关键词网络分析

文献:融合主题词嵌入和网络结构分析的主题关键词提取方法

1. 实现过程

a. 首先利用 LDA 对于数据集的主题进行初步提取,生成 主题 - 词 (m×n) 矩阵

b. 用 Word2Vec 训练数据集,得到词向量模型

For each t in Topic (m):

        For each w in KeyWords (n):

                利用生成的词向量模型,用余弦法计算该主题下词与词的相似度,作为两点之间的权重;

                设置阈值,过滤掉权重较低的词关系,其余的两两词之间连成一条边;

                利用 PageRank 方法进行迭代,最后输出 PR 值最高的 TopN 个词作为该主题下的关键词。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/576013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 下载、安装和使用 Postman 的详细教程!

Postman 是一个功能强大的API测试工具,它可以帮助程序员更轻松地测试和调试 API。在本文中,我们将讨论如何在 Windows 上安装和使用 Postman。 安装 Postman 首先,让我们从 Postman 的官方网站下载并安装:https://www.postman.c…

YOLOV5 TensorRT部署 BatchedNMS(engine模型推理)(下)

主要是在王新宇代码的基础上改进,引入对BatchedNMS的解码 文章目录 1. 修改yolov5.cpp2.修改yololayer.h1. 修改yolov5.cpp 首先增加全局变量,名字根据转onnx时修改的节点名字来,查看onnx文件可以看到,顺序不要弄错。 const char *INPUT_NAME = “images”; const char …

C语言——贪吃蛇游戏的实现

目录 一. 贪吃蛇的介绍 二. Win32 API 1. 控制台程序 2. COORD 控制台屏幕上的坐标 3. GetStdHandle 4. GetConsoleCursorInfo CONSOLE_CURSOR_INFO 5. SetConsoleCursorInfo 6. SetConsoleCursorPosition 封装的SetPos函数 7. GetAsyncKeyState 宏定义KEY_PRESS 三…

Jackson 2.x 系列【31】Spring Boot 集成之字典回写

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址:https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

【Go语言】接口类型(一)接口类型与接口的值

本文是介绍golang接口类型的第一篇,主要介绍接口类型与接口类型的值的相关概念。 1. 静态类型、动态类型、动态值 所谓的静态类型(即 static type),就是变量声明的时候的类型。 var age int // int 是静态类型 var name strin…

MQ面试题

为什么要使用消息队列? 优点:解耦、异步、流量削峰 缺点:可用性降低、复杂性提高、一致性问题 为什么选择了RabbitMQ而不是其它的MQ? kafka是以吞吐量高而闻名,不过其数据稳定性一般,而且无法保证消息有…

关于Android中的限定符

很多对于Android不了解或是刚接触Android的初学者来说,对于Android开发中出现的例如layout-large或者drawable-xxhdpi这样的文件夹赶到困惑,这这文件夹到底有什么用?什么时候用?这里简单的说一下。 其实,在上面例子中&…

day05 51单片机-外部中断、定时器

1 外部中断——按键控制LED亮灭 1.1 需求描述 本案例通过检测SW3触发的外部中断实现P00对应LED的亮灭。 1.2 硬件设计 1.2.1 中断简介 单片机中断是一种重要的计算机编程概念,用于处理在程序执行过程中突然发生的事件或条件。这些事件可以是外部硬件触发的,如按下按钮、…

SpringBoot+vue开发记录(二)

说明:本篇文章的主要内容为SpringBoot开发中后端的创建 项目创建: 1. 新建项目: 如下,这样简单创建就行了,JDK什么的就先17,当然1.8也是可以的,后面可以改。 这样就创建好了: 2. pom.xml…

【面试经典 150 | 回溯】电话号码的字母组合

文章目录 写在前面Tag题目来源解题思路方法一:回溯 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾…

IOTE2024第二十一届(上海)国际物联网展览会4月24日-26日开幕

交流产业信息,把脉发展方向,IOTE 国际物联网展是每年物联网行业、企业、用户交流合作的大型平台。2024年4月24-26日IOTE2024第二十一届国际物联网展•上海站,在上海世博展览馆开展。 本次物联网展汇聚全球超300家参展企业、3万来自工业、物流…

区块链技术与应用学习笔记(1-4节)——北大肖臻课程

目录 1. 区块链初识(课程简介) 被过度炒作,落地应用有限? 下一代的价值互联网?世界上最慢的数据库? 2. BTC-密码学原理(比特币) 1)哈希 哈希函数特点 个人学习所得 2)签名 个人对于…

工业测径仪的应用场景和可靠性判断

关键字:线缆测径仪,圆棒测径仪,圆管测径仪,金属棒管测径仪,工业测径仪,智能测径仪 智能测径仪主要应用于以下领域: 金属加工:测量金属线材、棒材、管材等的直径。线缆制造:检测电线、电缆的直径。塑料管材生产:监控塑料管材的外…

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件,且这多个控件的功能都类似时,使用数组控件是一个非常不错的选择,可以大大减少代码的编写 且 代码易读性强,可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

前端CSS基础11(相对定位,绝对定位,固定定位,粘性定位)

前端CSS基础11(相对定位,绝对定位,固定定位,粘性定位) CSS相对定位(position: relative;)相对定位的参考点在哪? CSS绝对定位(position: absolute)如何设置绝…

微信小程序:6.事件

什么事事件 事件就是渲染层到逻辑层的通讯方式,比如提交表单,按钮点击都可以看作一个事件。 小程序中常用的事件 事件对象属性列表 当事件回调时,会收到一个事件对象event,他详细属性如夏表所示: target和curren…

yudao-cloud微服务系统系统模块+后台管理系统成功运行

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列文章目录 第一章 芋…

【软件测试】终于有人讲明白:bug的分类和定级了!

01、bug的定义 一般是指不满足用户需求的则可以认为是bug,狭义指软件程序的漏洞或缺陷,广义指测试工程师或用户提出的软件可改进的细节、或与需求文档存在差异的功能实现等 对应三个测试目的: 为了发现程序的代码或业务逻辑错误 为了检查产…

《第二行代码》第二版学习笔记(6)——内容提供器

文章目录 一 运行时权限2.权限分类3 运行时申请权限 二、内容提供器1、 ContentResolver的基本用法2、现有的内容提供器3、创建自己的内容提供器2.1 创建内容提供器的步骤2.2 跨程序数据共享 内容提供器(Content Provider)主要用于在不同的应用程序之间实…

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议(BDAICSE2024)。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…