NLP中的主题模型:LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)
探索自然语言处理中的主题模型:LDA与狄利克雷分布
主题模型是一种用于发现文档集合中潜在主题的概率生成模型。其中,LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)是最著名的主题模型之一。在 LDA 中,狄利克雷分布起到了核心作用,用于建模文档-主题分布和主题-单词分布。关于迪利克雷分布的前置知识,请移步笔者的另一篇文章:深入理解:狄利克雷分布(Dirichlet Distribution)
本文将带你了解以下内容:
- 什么是主题模型?
- 什么是 LDA,它是如何工作的?
- 狄利克雷分布在 LDA 中的作用是什么?
- …
- 使用 Python 实现一个简单的 LDA 示例。
- …
- 详细解析:文档中单词生成概率公式
- …
- 为什么主题分布和单词分布可以用狄利克雷分布建模?
一、什么是主题模型?
主题模型的目标是从文档集合中自动发现潜在的主题。
假设有一组文档,每篇文档由单词构成,但文档背后隐藏着一些主题,例如:
- 一篇文档谈论“篮球”,可能包含单词 球员、比赛、NBA;
- 另一篇文档关于“科技”,可能包含单词 AI、编程、区块链。
主题模型的任务:
根据文档中的单词,找到主题,并计算:
- 每篇文档属于各个主题的概率;
- 每个主题中单词的概率分布。
二、LDA 模型简介
LDA 是一种生成式概率模型,假设文档是由多个主题的单词混合生成的。它背后的思想如下:
-
文档生成过程:
- 每篇文档的主题分布服从一个狄利克雷分布 ( θ ∼ Dirichlet ( α ) \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}) θ∼Dirichlet(α) );
- 每个主题的单词分布也服从一个狄利克雷分布 ( ϕ ∼ Dirichlet ( β ) \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}) ϕ∼Dirichlet(β) )。
-
生成步骤:
- 对于每篇文档:
- 从主题分布 ( θ \boldsymbol{\theta} θ ) 中抽取一个主题 ( z z z );
- 从主题 ( z z z ) 的单词分布 ( ϕ z \boldsymbol{\phi}_z ϕz ) 中抽取一个单词。
- 对于每篇文档:
-
数学公式:
给定 ( K K K ) 个主题和文档 ( d d d ),文档 ( d d d ) 中单词的生成概率为:
P ( w ) = ∏ n = 1 N ∑ z = 1 K P ( w n ∣ z ; ϕ ) P ( z ∣ d ; θ ) , P(w) = \prod_{n=1}^{N} \sum_{z=1}^{K} P(w_n | z; \boldsymbol{\phi}) P(z | d; \boldsymbol{\theta}), P(w)=n=1∏Nz=1∑KP(wn∣z;ϕ)P(z∣d;θ),
其中:- ( P ( w n ∣ z ; ϕ ) P(w_n | z; \boldsymbol{\phi}) P(wn∣z;ϕ) ):主题 ( z z z ) 中单词的概率;
- ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) ):文档 ( d d d ) 的主题分布。
三、狄利克雷分布在 LDA 中的作用
在 LDA 中,狄利克雷分布主要有两个作用:
-
建模文档的主题分布:
文档 ( d d d ) 的主题分布 ( θ \boldsymbol{\theta} θ ) 服从狄利克雷分布 ( Dirichlet ( α ) \text{Dirichlet}(\boldsymbol{\alpha}) Dirichlet(α) ),
θ ∼ Dirichlet ( α ) , \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}), θ∼Dirichlet(α),
其中 ( α \boldsymbol{\alpha} α ) 控制主题分布的稀疏性。如果 ( α \alpha α ) 很小,文档倾向于集中于少数主题;如果 ( α \alpha α ) 很大,文档可能涉及多个主题。 -
建模主题的单词分布:
每个主题 ( z z z ) 的单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 服从狄利克雷分布 ( Dirichlet ( β ) \text{Dirichlet}(\boldsymbol{\beta}) Dirichlet(β) ),
ϕ ∼ Dirichlet ( β ) , \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}), ϕ∼Dirichlet(β),
( β \boldsymbol{\beta} β ) 控制每个主题中单词分布的稀疏性。
四、实际应用场景
-
文档分类:
在一组文档中自动发现主题,帮助理解文档内容。例如,将新闻分为“体育”、“科技”等类别。 -
推荐系统:
根据用户浏览历史中的主题分布,推荐相关主题的内容。 -
文本摘要:
从文档中提取主要主题及其关键词,生成摘要。
五、代码实现:使用 Python 的 LDA 示例
我们使用 Python 的 gensim
库来实现一个简单的 LDA 示例。
安装依赖
pip install gensim pandas nltk
数据预处理
假设我们有以下文档:
# 文档数据
documents = [
"篮球 球员 比赛 NBA",
"比赛 体育 篮球",
"编程 AI 技术 代码",
"AI 区块链 编程",
"NBA 球队 篮球 体育",
"区块链 金融 技术"
]
实现 LDA 模型
from gensim import corpora
from gensim.models import LdaModel
# 数据预处理
texts = [doc.split() for doc in documents] # 将每篇文档分词
dictionary = corpora.Dictionary(texts) # 构建词典
corpus = [dictionary.doc2bow(text) for text in texts] # 将文档转换为词袋模型
# 训练 LDA 模型
lda = LdaModel(corpus, num_topics=2, id2word=dictionary, passes=10)
# 输出主题及关键词
for idx, topic in lda.print_topics(-1):
print(f"主题 {idx + 1}:{topic}")
输出示例
主题 1:0.40*"篮球" + 0.30*"体育" + 0.20*"比赛" + 0.10*"NBA"
主题 2:0.35*"编程" + 0.25*"AI" + 0.20*"区块链" + 0.10*"技术"
六、总结
- LDA 模型简介:LDA 是一种生成式概率模型,利用狄利克雷分布建模文档主题分布和主题单词分布。
- 狄利克雷分布的作用:控制分布稀疏性,让文档偏向少数主题或均匀分布。
- 代码实现:通过
gensim
库,我们可以快速实现 LDA 模型,分析文档集合的主题。
通过本文,你可以对 LDA 和狄利克雷分布的原理和应用有一个初步的了解。如果感兴趣,还可以深入研究其推导过程及参数优化方法,例如变分推断或吉布斯采样。
七、详细解析:文档中单词生成概率公式
在 LDA 模型中,文档的生成是一个概率过程,目标是通过主题分布和单词分布,描述文档中每个单词出现的概率。具体公式为:
P
(
w
)
=
∏
n
=
1
N
∑
z
=
1
K
P
(
w
n
∣
z
;
ϕ
)
P
(
z
∣
d
;
θ
)
,
P(w) = \prod_{n=1}^N \sum_{z=1}^K P(w_n | z; \boldsymbol{\phi}) P(z | d; \boldsymbol{\theta}),
P(w)=n=1∏Nz=1∑KP(wn∣z;ϕ)P(z∣d;θ),
这里:
- ( w w w ) 是文档中的所有单词集合;
- ( w n w_n wn ) 是文档中第 ( n n n ) 个单词;
- ( z z z ) 是主题的潜在变量(未观测到的随机变量),表示单词 ( w n w_n wn ) 属于的主题;
- ( ϕ \boldsymbol{\phi} ϕ ) 是每个主题的单词分布;
- ( θ \boldsymbol{\theta} θ ) 是文档的主题分布。
公式背后的含义
-
生成每个单词的概率:
- 对于文档中的每个单词 (
w
n
w_n
wn ),
- 首先从文档的主题分布 ( θ \boldsymbol{\theta} θ ) 中抽取一个主题 ( z z z ),概率为 ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) );
- 然后在选定的主题 ( z z z ) 中,从其单词分布 ( ϕ z \boldsymbol{\phi}_z ϕz ) 中抽取单词 ( w n w_n wn ),概率为 ( P ( w n ∣ z ; ϕ ) P(w_n | z; \boldsymbol{\phi}) P(wn∣z;ϕ) )。
- 对于文档中的每个单词 (
w
n
w_n
wn ),
-
对主题的求和:
- 由于每个单词可能来自多个主题(概率由 ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) ) 决定),需要对所有主题 ( z z z ) 的可能性求和。
-
整个文档的生成:
- 文档 ( w w w ) 中所有单词的生成概率是每个单词生成概率的乘积,假设单词之间相互独立。
举例说明
假设有以下文档和主题:
- 文档 ( d d d ):“篮球 比赛 体育”;
- 主题集合 ( { z 1 : 体育 , z 2 : 科技 } \{z_1: \text{体育}, z_2: \text{科技}\} {z1:体育,z2:科技} );
- 主题分布 ( θ \boldsymbol{\theta} θ ):文档 ( d d d ) 的主题分布为 ( P ( z 1 ∣ d ) = 0.8 P(z_1|d) = 0.8 P(z1∣d)=0.8 ), ( P ( z 2 ∣ d ) = 0.2 P(z_2|d) = 0.2 P(z2∣d)=0.2 );
- 单词分布 (
ϕ
\boldsymbol{\phi}
ϕ ):
- 对于 ( z 1 z_1 z1 ):( P ( 篮球 ∣ z 1 ) = 0.5 P(\text{篮球}|z_1) = 0.5 P(篮球∣z1)=0.5 ), ( P ( 比赛 ∣ z 1 ) = 0.3 P(\text{比赛}|z_1) = 0.3 P(比赛∣z1)=0.3 ), ( P ( 体育 ∣ z 1 ) = 0.2 P(\text{体育}|z_1) = 0.2 P(体育∣z1)=0.2 );
- 对于 ( z 2 z_2 z2 ):( P ( 篮球 ∣ z 2 ) = 0.1 P(\text{篮球}|z_2) = 0.1 P(篮球∣z2)=0.1 ), ( P ( 比赛 ∣ z 2 ) = 0.1 P(\text{比赛}|z_2) = 0.1 P(比赛∣z2)=0.1 ), ( P ( 体育 ∣ z 2 ) = 0.8 P(\text{体育}|z_2) = 0.8 P(体育∣z2)=0.8 )。
第一步:计算单词“篮球”的生成概率
根据公式:
P
(
篮球
)
=
∑
z
=
1
K
P
(
篮球
∣
z
;
ϕ
)
P
(
z
∣
d
;
θ
)
,
P(\text{篮球}) = \sum_{z=1}^K P(\text{篮球}|z; \boldsymbol{\phi}) P(z|d; \boldsymbol{\theta}),
P(篮球)=z=1∑KP(篮球∣z;ϕ)P(z∣d;θ),
有:
P
(
篮球
)
=
P
(
篮球
∣
z
1
)
P
(
z
1
∣
d
)
+
P
(
篮球
∣
z
2
)
P
(
z
2
∣
d
)
,
P(\text{篮球}) = P(\text{篮球}|z_1) P(z_1|d) + P(\text{篮球}|z_2) P(z_2|d),
P(篮球)=P(篮球∣z1)P(z1∣d)+P(篮球∣z2)P(z2∣d),
代入数据:
P
(
篮球
)
=
(
0.5
×
0.8
)
+
(
0.1
×
0.2
)
=
0.4
+
0.02
=
0.42.
P(\text{篮球}) = (0.5 \times 0.8) + (0.1 \times 0.2) = 0.4 + 0.02 = 0.42.
P(篮球)=(0.5×0.8)+(0.1×0.2)=0.4+0.02=0.42.
第二步:计算整个文档的生成概率
文档 (
d
d
d ) 的单词为 (
篮球
,
比赛
,
体育
\text{篮球}, \text{比赛}, \text{体育}
篮球,比赛,体育 ),
P
(
d
)
=
P
(
篮球
)
×
P
(
比赛
)
×
P
(
体育
)
,
P(d) = P(\text{篮球}) \times P(\text{比赛}) \times P(\text{体育}),
P(d)=P(篮球)×P(比赛)×P(体育),
其中:
- ( P ( 比赛 ) = ( 0.3 × 0.8 ) + ( 0.1 × 0.2 ) = 0.24 + 0.02 = 0.26 P(\text{比赛}) = (0.3 \times 0.8) + (0.1 \times 0.2) = 0.24 + 0.02 = 0.26 P(比赛)=(0.3×0.8)+(0.1×0.2)=0.24+0.02=0.26 );
- ( P ( 体育 ) = ( 0.2 × 0.8 ) + ( 0.8 × 0.2 ) = 0.16 + 0.16 = 0.32 P(\text{体育}) = (0.2 \times 0.8) + (0.8 \times 0.2) = 0.16 + 0.16 = 0.32 P(体育)=(0.2×0.8)+(0.8×0.2)=0.16+0.16=0.32 )。
因此:
P
(
d
)
=
0.42
×
0.26
×
0.32
=
0.034944.
P(d) = 0.42 \times 0.26 \times 0.32 = 0.034944.
P(d)=0.42×0.26×0.32=0.034944.
八、公式的意义和实际应用
- 意义:通过文档中单词的生成概率公式,LDA 能够估计文档中不同主题的比例以及每个主题中单词的重要性,从而将文档归类到相应主题。
- 实际应用:在新闻分类、推荐系统、文档聚类等任务中,LDA 是一种简单而高效的方法,能揭示文档集合的潜在主题结构。
九、为什么主题分布和单词分布可以用狄利克雷分布建模?
在 LDA 模型中,主题分布 ( θ \boldsymbol{\theta} θ ) 和单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 都被假设服从狄利克雷分布,即:
θ
∼
Dirichlet
(
α
)
,
\boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}),
θ∼Dirichlet(α),
ϕ
∼
Dirichlet
(
β
)
,
\boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}),
ϕ∼Dirichlet(β),
这背后有数学和实际应用的双重考虑,狄利克雷分布的选择并不是偶然的,而是基于其独特的性质和与多项分布的密切关系。
1. 狄利克雷分布的特点
狄利克雷分布是多项分布的共轭先验分布,具有以下特点:
-
多项分布的先验分布
- LDA 中,主题分布 ( θ \boldsymbol{\theta} θ ) 描述一个文档中各个主题的比例,这些比例的总和为 1(如 ( θ 1 + θ 2 + ⋯ + θ K = 1 \theta_1 + \theta_2 + \cdots + \theta_K = 1 θ1+θ2+⋯+θK=1 )),符合简单 x x x 的概率要求。
- 类似地,单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 描述每个主题中单词的比例,也满足归一化条件 ( ϕ 1 + ϕ 2 + ⋯ + ϕ V = 1 \phi_1 + \phi_2 + \cdots + \phi_V = 1 ϕ1+ϕ2+⋯+ϕV=1 )。
狄利克雷分布正是定义在这样一个单位 K − 1 K-1 K−1 维单纯形上的分布,能够自然地对概率分布建模。
-
共轭性
- 共轭分布的性质使得后验分布仍然属于同一分布族,从而大大简化了推断过程。在贝叶斯推断中,狄利克雷分布是多项分布的共轭先验,这意味着:
P ( θ ∣ 数据 ) ∝ P ( 数据 ∣ θ ) P ( θ ) , P(\boldsymbol{\theta} | \text{数据}) \propto P(\text{数据} | \boldsymbol{\theta}) P(\boldsymbol{\theta}), P(θ∣数据)∝P(数据∣θ)P(θ),
后验分布 ( P ( θ ∣ 数据 ) P(\boldsymbol{\theta} | \text{数据}) P(θ∣数据) ) 仍然是狄利克雷分布。
- 共轭分布的性质使得后验分布仍然属于同一分布族,从而大大简化了推断过程。在贝叶斯推断中,狄利克雷分布是多项分布的共轭先验,这意味着:
-
可控的稀疏性
- 狄利克雷分布的参数 (
α
\boldsymbol{\alpha}
α )(或 (
β
\boldsymbol{\beta}
β ))可以控制分布的稀疏性。具体来说:
- 若 ( α i ≪ 1 \alpha_i \ll 1 αi≪1 ),表示分布倾向于稀疏,即大多数概率质量集中在少数分量上;
- 若 ( α i > 1 \alpha_i > 1 αi>1 ),表示分布倾向于均匀。
- 在 LDA 中,可以通过调节 ( α \boldsymbol{\alpha} α ) 控制文档中的主题稀疏性,以及通过 ( β \boldsymbol{\beta} β ) 控制主题中的单词稀疏性,这与实际应用需求非常吻合。
- 狄利克雷分布的参数 (
α
\boldsymbol{\alpha}
α )(或 (
β
\boldsymbol{\beta}
β ))可以控制分布的稀疏性。具体来说:
2. 为何不用其他分布?
虽然理论上可以用其他分布(如正态分布、指数分布)来建模,但这些分布在概率模型中的适用性远不如狄利克雷分布,具体原因如下:
-
正态分布
正态分布定义在实数域上,而主题分布和单词分布需要满足归一化条件(所有分量非负,总和为 1),这与正态分布的定义域不符。 -
指数分布
指数分布通常用于建模正值随机变量,但同样无法直接用于表示归一化的概率分布。 -
狄利克雷分布的简单性与解释性
狄利克雷分布提供了一种直观的方式来控制主题和单词分布的稀疏性,同时具有优雅的数学性质(如共轭性),这使得模型推导和计算更加简洁高效。
3. 实际意义与应用场景
为什么主题分布用狄利克雷分布?
文档中的主题分布(( θ \boldsymbol{\theta} θ ))表示一个文档可能属于不同主题的概率分布,比如某篇文章可能是 80% 的“科技”、15% 的“体育”和 5% 的“娱乐”。这些概率必须满足以下条件:
- 非负性:每个主题的概率非负;
- 归一化:所有主题的概率之和等于 1。
狄利克雷分布在单位单纯形上定义,因此可以自然地建模这种分布。通过调整 ( α \boldsymbol{\alpha} α ),可以反映文档中主题的分布特性:
- 当 ( α \boldsymbol{\alpha} α ) 很小(如 ( α i ≪ 1 \alpha_i \ll 1 αi≪1 )),大多数文档只会涉及少数几个主题;
- 当 ( α \boldsymbol{\alpha} α ) 较大(如 ( α i > 1 \alpha_i > 1 αi>1 )),文档更可能均匀分布在所有主题上。
为什么单词分布用狄利克雷分布?
主题中的单词分布(( ϕ \boldsymbol{\phi} ϕ ))表示某个主题下各个单词出现的概率分布。例如,在“科技”主题下,可能“算法”出现的概率很高,而“足球”出现的概率很低。这种分布的特点是:
- 非负性:每个单词的概率非负;
- 归一化:所有单词的概率之和等于 1。
狄利克雷分布能够很好地描述这种分布,且其稀疏性特性能够反映实际语言中主题的稀疏性——即一个主题通常只关注少数关键词。
4. 例子:主题建模中的参数控制
假设我们有以下设置:
- ( α = [ 0.1 , 0.1 , 0.1 ] \boldsymbol{\alpha} = [0.1, 0.1, 0.1] α=[0.1,0.1,0.1] ):文档的主题分布非常稀疏,大多数文档可能集中在 1 个主题上;
- ( β = [ 0.1 , 0.1 , 0.1 ] \boldsymbol{\beta} = [0.1, 0.1, 0.1] β=[0.1,0.1,0.1] ):主题中的单词分布也非常稀疏,每个主题可能只会关注少数几个单词。
此时,生成的文档可能表现为:
- 文档 1:95% 属于“科技”主题,主要包含“算法”、“数据”;
- 文档 2:90% 属于“体育”主题,主要包含“足球”、“比赛”;
- 文档 3:85% 属于“娱乐”主题,主要包含“电影”、“明星”。
通过调整 ( α \boldsymbol{\alpha} α ) 和 ( β \boldsymbol{\beta} β ),可以灵活地控制主题建模的细粒度和稀疏性。
后记
2024年11月30日13点31分于上海,在GPT4o大模型辅助下完成。