基于潜在狄利克雷分配(LDA)的文档主题聚类算法详解
这是一个有趣且实用的算法。简单来说,它是无监督学习的经典方法,能在不知晓文档类别的情况下,自动从一组文档(如新闻、论文、评论)中挖掘出隐含的主题结构,并将文档按照这些主题进行“软聚类”(即一个文档可以属于多个主题)。与前面讲过的LDA主题建模侧重于“生成”主题词分布不同,本算法侧重点在于利用LDA模型得到的文档-主题分布,来实现对文档的聚类分析。
核心思想:LDA假设每篇文档都是由一组“潜在主题”混合而成的,而每个主题又是词汇表上的一种概率分布。通过训练LDA模型,我们可以得到两个关键矩阵:1) 文档-主题分布矩阵,表示每篇文档属于各个主题的概率;2) 主题-词分布矩阵,表示每个主题下各个词出现的概率。文档聚类主要利用第一个矩阵——将每篇文档表示为一个“主题概率向量”(而非传统的词袋向量),然后基于此进行聚类分析。
下面,我将逐步详细讲解其原理、训练过程和聚类应用。
第一步:问题定义与模型假设
想象你有一个包含M篇文档的文集(语料库),每篇文档由N个词组成。我们的目标是:
- 发现K个隐含主题:每个主题是一个“概念”,例如“体育”、“政治”、“科技”。
- 对文档进行主题层面的聚类:不直接给文档贴一个硬性标签,而是计算文档属于每个主题的“比重”,实现软划分。
LDA模型基于三个核心假设:
- 每篇文档都是多个主题的混合。例如,一篇关于“人工智能在奥运会中的应用”的文档,可能混合了“科技”和“体育”两个主题。
- 每个主题是词汇表上的一个概率分布。例如,“科技”主题下,“算法”、“数据”、“模型”等词的概率较高;“体育”主题下,“比赛”、“运动员”、“金牌”等词的概率较高。
- 文档的生成过程是:先根据文档的主题分布随机选择一个主题,再从这个主题的词分布中随机选择一个词,重复这个过程直到生成文档的所有词。
第二步:生成过程与数学模型
LDA用一种“假想”的文档生成过程来描述文档集合的由来,理解这个过程是掌握算法的关键。
文档生成过程(逆向思考,用于建模):
对于文集中的每一篇文档 d:
- 从狄利克雷分布
Dir(α)中抽样,为该文档生成一个 主题分布θ_d。θ_d是一个K维向量,θ_dk表示文档d中主题k出现的概率。α是超参数,控制主题分布的稀疏性(α越小,文档越倾向于只包含少数主题)。 - 对于文档d中的第
i个词的位置:
a. 从多项式分布Mult(θ_d)中抽样,为该位置生成一个 主题编号z_{di}。
b. 选定了主题z_{di}(假设为主题k)后,从该主题对应的词汇多项式分布φ_k中抽样,生成具体的 词语w_{di}。这里,φ_k是从另一个狄利利克雷分布Dir(β)中抽样得到的,β是控制主题下词语分布稀疏性的超参数。
关键产出:
θ_d: 文档d的主题分布(文档向量表示)。这就是我们用于聚类的核心数据。φ_k: 主题k的词分布。这解释了每个主题“是什么”。z_{di}: 每个词背后的主题指派(隐变量)。
第三步:模型训练(推断过程)
我们实际拥有的是观测到的文档(词序列 w),而主题分布 θ、主题-词分布 φ 和主题指派 z 都是未知的隐变量。训练LDA的目标是:给定文档集合,估计出最可能的 θ 和 φ。
这是一个典型的后验推断问题:计算隐变量的后验分布 p(θ, φ, z | w, α, β)。这个分布非常复杂,无法直接精确求解。因此,需要使用近似推断算法。最常用的是:
吉布斯抽样 (Gibbs Sampling):
这是一种马尔可夫链蒙特卡洛方法。其核心思想是迭代地、逐个地为文档中的每个词重新采样其主题指派 z_{di},而固定其他所有词的主题指派。
- 初始化:随机为每个词分配一个主题。
- 迭代抽样:对于每一个词
w_{di},根据一个条件概率公式计算它属于每个主题k的概率,然后根据这个概率重新为它采样一个新主题。这个条件概率公式结合了两个关键信息:- 文档-主题关联:文档d中,有多少其他词被分配给了主题k(排除当前词)。
- 主题-词关联:在整个语料库中,当前词
w_{di}有多少次被分配给了主题k(排除当前词)。
公式简化形式为:P(z_{di}=k | 其他) ∝ (文档d中主题k的计数 + α) * (主题k下词语w_{di}的计数 + β) / (主题k下总词数 + V*β)。
- 收敛:重复迭代足够多次后,马尔可夫链会收敛到目标后验分布。此时,主题指派
z的样本可以用来估计我们需要的参数:- 文档-主题分布 θ_dk = (文档d中主题k的计数 + α) / (文档d的总词数 + K*α)
- 主题-词分布 φ_kv = (主题k下词语v的计数 + β) / (主题k下总词数 + V*β)
变分推断 (Variational Inference) 是另一种常用方法,它通过一个简单的分布来逼近真实后验分布,并通过优化使两者尽可能接近。通常速度更快,但采样更精确。
第四步:基于文档-主题分布的聚类
训练好LDA模型后,我们得到了每篇文档的主题概率分布 θ_d。这是一个K维向量,可以视为文档在一个“主题空间”中的坐标。例如,文档A的分布是 [0.7, 0.2, 0.1],表示它70%属于主题1(如科技),20%属于主题2,10%属于主题3。
基于这个新的表示,我们可以进行多种聚类分析:
-
软聚类/主题构成分析:直接查看
θ_d向量本身。不需要额外的聚类算法,θ_d本身就是聚类结果。我们可以说文档A是“以科技为主,掺杂少量政治和体育”的文档。这比硬聚类提供了更丰富的信息。 -
硬聚类:如果非要给每篇文档分配一个主要主题标签,可以取
θ_d中概率最大的主题:argmax_k θ_dk。这样就得到了K个簇。 -
基于相似度的层次聚类或K-means聚类:
- 将每篇文档的
θ_d向量作为其特征表示。 - 计算文档向量之间的相似度(常用余弦相似度,因为主题分布是概率向量)。
- 应用标准的聚类算法(如K-means、层次聚类)对这些向量进行聚类。这里聚类的“簇”可能与原始主题(K个)不同,可以自由设定目标簇数。这尤其适用于当K(主题数)设置得较大,希望得到更粗粒度文档分组时。
- 将每篇文档的
为什么比直接在词袋向量上聚类更好?
- 降维:主题空间维度K(通常10-500)远小于原始词袋空间维度V(词汇表大小,通常上万)。
- 语义抽象:主题向量捕捉了高阶的语义概念,能缓解一词多义和一义多词问题。例如,“苹果”在“科技”主题下和“水果”主题下权重不同。
- 抗噪声:对词语级的噪声和稀疏性更鲁棒。
总结
基于LDA的文档主题聚类算法流程如下:
- 预处理:收集文档集,进行分词、去除停用词、词干化等操作。
- 表示:构建文档-词矩阵(如词频或TF-IDF)。
- 训练LDA模型:设定主题数K,使用吉布斯抽样或变分推断进行训练,直至收敛。
- 获取文档表示:得到每篇文档的文档-主题概率分布
θ_d。 - 分析与聚类:
- 主题解释:查看每个主题下概率最高的词(
φ_k)来解释主题含义。 - 文档软聚类:直接分析
θ_d,了解每篇文档的主题构成。 - 文档硬聚类/再聚类:对
θ_d向量进行argmax操作或应用其他聚类算法得到文档分组。
- 主题解释:查看每个主题下概率最高的词(
这个算法的强大之处在于,它能以一种完全无监督的方式,从原始文本中提取出有意义的语义维度,并将文档映射到一个低维、稠密、可解释的语义空间中进行组织与分析。