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 个词作为该主题下的关键词。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hbase学习笔记

Hbase是什么 HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。它利用Hadoop HDFS作为其文件存储系统,并提供实时的读写的数据库系统。HBase的设计思想来源于Google的BigTable论文,是Apache的Hadoop项目的子项目。它适合于存储大表数据,并可以达到实时级别。HB…

Java基础知识(一)

1. Java语言跨平台原理 1.1 Java语言的特点 完全面向对象: Java语言支持封装、继承、多态,面向对象编程,让程序更好达到高内聚,低耦合的标准。支持分布式: Java语言支持Internet应用的开发,在基本的Java应…

实现ALV页眉页脚

1、文档介绍 在ALV中,可以通过增加页眉和页脚,丰富ALV的展示。除了基本的页眉和页脚,还可以通过插入HTML代码的方式展示更加丰富的页眉和页脚,本篇文章将介绍ALV和OOALV中页眉页脚的使用。 2、ALV页眉页脚 效果如下 2.1、显示内…

贝叶斯网络(概念、应用、实例)

目录 一、贝叶斯网络基本概念 1.1主要组成 1.2概率模型 1.3应用场景 1.4推理方法 1.5学习 二、贝叶斯网络在机器学习中的应用 三、应用实例 3.1分类 3.2推荐系统 3.3自然语言处理 一、贝叶斯网络基本概念 贝叶斯网络,也称为信念网络或有向无环图模型&am…

JMeter压测

1.创建线程组 2.创建http请求 填写接口基本信息。(我这里用的是我自己的一个demo项目,大家也可以换成自己的试一试) 填写完毕之后我们点击绿色箭头运行。由于没有配置请求头信息,所以显示认证失败。 3.创建信息头管理器 3.1为什么…

基于激光雷达的作物表型研究论文汇总

文章目录 2018How Universal Is the Relationship between Remotely Sensed Vegetation Indices and Crop Leaf Area Index? A Global Assessment[J] 2021结合移动式激光雷达和 CropQuant-3D 对不同氮素处理小麦的大规模田间表型分析[M] 2023基于地基激光雷达和 RGB 相机对小麦…

MySQL多版本并发控制mvcc原理浅析

文章目录 1.mvcc简介1.1mvcc定义1.2mvcc解决的问题1.3当前读与快照读 2.mvcc原理2.1隐藏字段2.2版本链2.3ReadView2.4读视图生成原则 3.rc和rr隔离级别下mvcc的不同 1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control),多版本并发控制,是…

买婴儿洗衣机怎么选择?推荐四大表现突出的宝藏婴儿洗衣机

现在还有人把宝宝衣服跟大人的混洗吗?或者把婴儿衣物跟其他衣物混洗吗?赶紧停止吧!这样会带来非常严重的细菌交叉的感染,有小孩的家庭,或者说打算生小孩的家庭,一定要入手一台小型婴儿洗衣机,宝…

jmeter之跨线程关联

1)_setproperty函数:将值保存成jmeter属性 2)_property函数:在其他线程组中使用property函数读取属性 一、跨线程接口引用变量 1. 法一:jmeter自带函数_setProperty和_property 1. 1线程组 01 创建登录的【HTTP请求】…

学python的第二十天

多线程 以下内容来源于《看漫画学Python》这本书,前面十几天好多内容参考过本书内容,写的挺好。 1 线程相关知识 1.1 进程 一个进程就是一个正在执行的程序,每一个进程都有自己独立的一块内存空间,一组系统资源。在进程概念中&…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

STM32与Proteus的串口仿真详细教程与源程序

包含LCD1602显示&#xff0c;串口发送接收&#xff0c;完美实现。 文档内容齐全&#xff0c;包含使用说明&#xff0c;相关驱动等。 解决了STM32的Proteus串口收发问题。 注意&#xff1a;每输入一个字符后&#xff0c;要按一次“手动发送”按钮&#xff0c;才能收到正确字符…