LDA主题分析模型到底是什么?

2026-4-7 12:56| 发布者: Fuller| 查看: 213| 评论: 0

摘要: “LDA 是一种生成式概率模型,能够从大量文本中发现隐藏的主题”。也就是说,每个文档是由多个主题混合构成的;而每个主题表示成所有词的概率分布。我们期望用一种直观的方法讲解LDA主题分析模型的原理。 ... ...

0. 引言

各种介绍材料告诉我们:“LDA 是一种生成式概率模型,能够从大量文本中发现隐藏的主题”。也就是说,每个文档是由多个主题混合构成的;而每个主题表示成所有词的概率分布。

但是,要理解LDA主题分析模型到底是什么,并不是件容易的事。我们期望用一种直观的方法讲解LDA主题分析模型的原理。

下面我们结合实际数据和分析结果讲解生成原理和过程。

1. 预备知识:观察 文档-词 矩阵

GooSeeker分词和情感分析软件可以导出选词矩阵,让我们先观察一下这个矩阵

【注意】以下几点:

  1. 分词软件在线版本(基本功能版)已经去掉了导出选词矩阵表,因为这个表十分稀疏却极大。需要在分词软件的扩展功能模块上导出这个表。
  2. 只能在手工选词以后才能导出该表,否则文件大小会更大。
  3. 缺省只导出选词矩阵的边表格式,要导出矩阵格式,要如下图那样操作,导出过程很花时间和占用硬盘空间很大,要忍受。

我们打开选词矩阵表和选词矩阵TFIDF表观察一下

可以看到确实是矩阵,每一行是一条文本内容,我们称之为“文档”,每一列是一个词。

所有列的词放在一起,称为这个被分析语料的词典。

但是,一个文档含有词典中少量的词,总体看起来这个矩阵很稀疏,有值的单元格很少。

选词矩阵里面的值是这个词在这个文档中出现的次数。还可以导出 选词矩阵TFIDF表,矩阵里面的值是这个词在某个文档中的tf-idf值。

可以看到有几个特征:

  • 不考虑词在文档中的顺序:GooSeeker分词软件导出选词矩阵表的时候,按照词典顺序导出的,即使再次打乱词的顺序,也还是特性没有改变的选词矩阵。
  • 不考虑词在文档中的上下文

这也是“词袋”模型 概念的要点。跟词袋模型相对的是GooSeeker扩展模块上的top2vec话题发现(检测)模型,采用了doc2vec技术,使用了上下文信息。可以分别实际操作一下以作对比。

2. LDA主题分析原理

2.1 主题分析模型的共通原理

我们已经观察了 文档-词 矩阵,用这个 文档-词 矩阵就能代表一个语料的词袋模型。我们用字母A代表这个矩阵。那么主题分析模型的目的是找到两个矩阵B和C,B和C相乘能“生成”A,如公式:

A = BC

这就是常常出现在介绍LDA的文章中的“生成模型”的含义。跟当今AI时代说的“生成式”大语言模型是两个不同的概念。

上面的公式,A是 文档-主题 矩阵,C是 主题-关键词 矩阵。

光看这个公式,自然我们更推荐用NMF模型做主题分析,其原理特别容易理解,上面的公式完全刻画了NMF原理,就这么简单。其实推荐NMF还有一个很大的工程方面的原因:分析短文本的时候,其结果特别容易解读。而相比之下,LDA模型分析短文本是不稳定的,解释其结果就会比较勉强。

2.2 观察 LDA主题分析的结果文件

我们先观察LDA主题分析的结果,基于这些结果再解释其原理。

2.2.1 文档-主题 矩阵

在GooSeeker分词软件的LDA分析界面上可以观察文本话题矩阵,可以看到每条文档所属的显著话题是什么,也可以按照话题进行排序,查看哪些文档具有更大的概率隶属于该主题。如下图:

导出的数据见下图,把每个文档在每个主题上的打分加在一起等于1,可见,这是文档在主题上的概率分布。后面我们会讲到这是一个Dirichlet(狄利克雷)分布。

2.2.2 主题-关键词 矩阵

在GooSeeker分词软件的LDA分析界面上可以直观观察一个主题由哪些词构成的,如下图

对应导出的矩阵如下图,把每个主题的每个关键词的打分加在一起也等于1,可见,这是主题在关键词上的概率分布。后面我们会讲到这是另一个Dirichlet(狄利克雷)分布。

2.3 LDA的原理

这是LDA的概率图模型。灰色圆盘表示显变量,就是可以观察的变量;其他是隐变量。这是变量分别是:

  • M:(整数)文档数
  • N:(整数)一个文档含有的词的数量,例如,第i个文档的词数是N_i
  • K:(整数)主题数
  • V:(整数)整个语料的词的数量
  • α:(实数向量)有K个元素。这个向量被称为文档的“狄利克雷先验参数”。就是在模型计算之前预先设定好值的参数
  • β:(实数向量)有V个元素。这个向量被称为主题的“狄利克雷先验参数”。就是在模型计算之前预先设定好值的参数
  • θ_i:(概率向量)有K个元素,K个元素的值加在一起等于1,表示第i个文档在主题上的概率分布。所以,整个θ就是我们前面展示的导出来的 文本-主题 矩阵。
  • φ_k:(概率向量)有V个元素,V个元素的值加载一起等于1,表示第k个主题在关键词上的概率分布。所以,整个φ就是我们前面展示的导出来的 主题-关键词 矩阵。
  • w_i:(整数向量)有V个元素,其值在1到V之间。表示第i个文档的“每个词的位置”上应该放哪个词
  • z_i:(整数向量)有N个元素,其值在1到K之间。表示第i个文档的“每个词的位置”上那个词归属的主题

前面我们观察了原始的 文档-词 矩阵。矩阵的值是在某个文档中某个词出现的次数。可以想象成把矩阵清空,让LDA算法填写恢复这个矩阵。所以,上面那个概率图模型中外层方框表示在文档层面循环M次(M个文档);而内层方框表示在一个文档的词层面循环N次(一个文档有N个词)。w是一个显变量,就是我们可以观察的填在文档中的每个词。

2.4 LDA的计算过程

维基百科词条Latent Direchlet Allocation介绍了LDA的生成过程(参看Generative process一章),目标就是生成θ和φ,从而也就生成了w(和w)。在具体实现这个算法的时候,可以采用多种统计推断或者贝叶斯推断,比如Gibbs采样是一种数值计算方法,就是一轮轮多层循环更新每个词所属的主题,直到收敛。也就是计算下面的概率值,

可见就是计算这个词属于每个主题的概率,上面的公式中:

  • n_{d, k}^{-i}:表示文档d中主题k的词数(不包含当前词i)。每一轮计算的时候,不包含当前词的其他词的n都是可以计算出来的,所以更新当前词的值即可。
  • n_{k, w}^{-i}:表示主题k中词w出现的次数(不包含当前词i)。每一轮计算的时候,不包含当前词的其他词的n都是可以计算出来的,所以更新当前词的值即可。

然后根据这个值随机采样一个主题赋给这个词。所谓随机采样,举个例子,假设有3个主题,为某个词做的某一轮计算得到下面的概率

P(z_i = 1) = 0.1, 

P(z_i = 2) = 0.7,

P(z_i = 3) = 0.2

那么,我们生成一个取值在0到1之间的随机数,如果落在0~0.1之间就把主题1赋给这个词,如果落在0.1~0.7之间就把主题2赋给这个词,否则把主题2赋给这个词。可见,并不是选择概率最大的那个主题赋给这个词,而是做了一次随机采样。

3. 怎样设置α和β的值

我们称α和β是超参数,也就是可以通过选用不同的值来影响计算结果。GooSeeker分词扩展功能的界面上,可以为LDA模型执行模型搜索,但是,并不为α和β搜索合适的值,而是在程序中预先设定好。这两个参数可以控制稀疏性,值越小越稀疏

α控制每篇文档分布在多个主题上还是集中在几个主题上。GooSeeker的LDA主题分析只对sklearn的LDA模型做了特殊设置,对gensim的LDA模型却采用了缺省值。设置如下:

  • 小型预料:较高的值,如1.0,防止文档被孤立词带偏
  • 其它:缺省值,即 α = 1.0 / K

β控制每个主题分布在更多词上还是集中在少量词上。GooSeeker的LDA主题分析只对sklearn的LDA模型做了特殊设置,对gensim的LDA模型却采用了缺省值。设置如下

  • 小型语料:较低的值,如0.01,让每个主题的关键词更聚焦
  • 其他:缺省值,即 β = 1.0 / K

4. 对短文本进行LDA主题分析

我们常常要分析微博、评论等的主题分布,但是,由于文档中的文字比较少,会有这样的影响

  • 文档-主题分布θ很不稳定
  • Gibbs采样过程难于收敛

从工程上角度,可以把多条短文档合并成一个文档再进行分析。合并的依据可以是同用户、或者多个时间段、或者相同话题等等。


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2026-4-19 13:09