NLP中的主题模型:LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)

探索自然语言处理中的主题模型:LDA与狄利克雷分布

主题模型是一种用于发现文档集合中潜在主题的概率生成模型。其中,LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配 )是最著名的主题模型之一。在 LDA 中,狄利克雷分布 起到了核心作用,用于建模文档-主题分布和主题-单词分布。关于迪利克雷分布的前置知识,请移步笔者的另一篇文章:深入理解:狄利克雷分布(Dirichlet Distribution)

本文将带你了解以下内容:

  1. 什么是主题模型?
  2. 什么是 LDA,它是如何工作的?
  3. 狄利克雷分布在 LDA 中的作用是什么?
  4. ...
  5. 使用 Python 实现一个简单的 LDA 示例。
  6. ...
  7. 详细解析:文档中单词生成概率公式
  8. ...
  9. 为什么主题分布和单词分布可以用狄利克雷分布建模?

一、什么是主题模型?

主题模型的目标是从文档集合中自动发现潜在的主题

假设有一组文档,每篇文档由单词构成,但文档背后隐藏着一些主题,例如:

  • 一篇文档谈论"篮球",可能包含单词 球员比赛NBA
  • 另一篇文档关于"科技",可能包含单词 AI编程区块链

主题模型的任务

根据文档中的单词,找到主题,并计算:

  • 每篇文档属于各个主题的概率;
  • 每个主题中单词的概率分布。

二、LDA 模型简介

LDA 是一种生成式概率模型,假设文档是由多个主题的单词混合生成的。它背后的思想如下:

  1. 文档生成过程

    • 每篇文档的主题分布服从一个狄利克雷分布 ( θ ∼ Dirichlet ( α ) \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}) θ∼Dirichlet(α) );
    • 每个主题的单词分布也服从一个狄利克雷分布 ( ϕ ∼ Dirichlet ( β ) \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}) ϕ∼Dirichlet(β) )。
  2. 生成步骤

    • 对于每篇文档:
      1. 从主题分布 ( θ \boldsymbol{\theta} θ ) 中抽取一个主题 ( z z z );
      2. 从主题 ( z z z ) 的单词分布 ( ϕ z \boldsymbol{\phi}_z ϕz ) 中抽取一个单词。
  3. 数学公式

    给定 ( 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 中,狄利克雷分布主要有两个作用:

  1. 建模文档的主题分布

    文档 ( d d d ) 的主题分布 ( θ \boldsymbol{\theta} θ ) 服从狄利克雷分布 ( Dirichlet ( α ) \text{Dirichlet}(\boldsymbol{\alpha}) Dirichlet(α) ),
    θ ∼ Dirichlet ( α ) , \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}), θ∼Dirichlet(α),

    其中 ( α \boldsymbol{\alpha} α ) 控制主题分布的稀疏性。如果 ( α \alpha α ) 很小,文档倾向于集中于少数主题;如果 ( α \alpha α ) 很大,文档可能涉及多个主题。

  2. 建模主题的单词分布

    每个主题 ( z z z ) 的单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 服从狄利克雷分布 ( Dirichlet ( β ) \text{Dirichlet}(\boldsymbol{\beta}) Dirichlet(β) ),
    ϕ ∼ Dirichlet ( β ) , \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}), ϕ∼Dirichlet(β),

    ( β \boldsymbol{\beta} β ) 控制每个主题中单词分布的稀疏性。


四、实际应用场景

  1. 文档分类

    在一组文档中自动发现主题,帮助理解文档内容。例如,将新闻分为"体育"、"科技"等类别。

  2. 推荐系统

    根据用户浏览历史中的主题分布,推荐相关主题的内容。

  3. 文本摘要

    从文档中提取主要主题及其关键词,生成摘要。


五、代码实现:使用 Python 的 LDA 示例

我们使用 Python 的 gensim 库来实现一个简单的 LDA 示例。

安装依赖

bash 复制代码
pip install gensim pandas nltk

数据预处理

假设我们有以下文档:

python 复制代码
# 文档数据
documents = [
    "篮球 球员 比赛 NBA",
    "比赛 体育 篮球",
    "编程 AI 技术 代码",
    "AI 区块链 编程",
    "NBA 球队 篮球 体育",
    "区块链 金融 技术"
]

实现 LDA 模型

python 复制代码
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}")

输出示例

c 复制代码
主题 1:0.40*"篮球" + 0.30*"体育" + 0.20*"比赛" + 0.10*"NBA"
主题 2:0.35*"编程" + 0.25*"AI" + 0.20*"区块链" + 0.10*"技术"

六、总结

  1. LDA 模型简介:LDA 是一种生成式概率模型,利用狄利克雷分布建模文档主题分布和主题单词分布。
  2. 狄利克雷分布的作用:控制分布稀疏性,让文档偏向少数主题或均匀分布。
  3. 代码实现 :通过 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} θ ) 是文档的主题分布。

公式背后的含义

  1. 生成每个单词的概率

    • 对于文档中的每个单词 ( w n w_n wn ),
      1. 首先从文档的主题分布 ( θ \boldsymbol{\theta} θ ) 中抽取一个主题 ( z z z ),概率为 ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) );
      2. 然后在选定的主题 ( 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;ϕ) )。
  2. 对主题的求和

    • 由于每个单词可能来自多个主题(概率由 ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) ) 决定),需要对所有主题 ( z z z ) 的可能性求和。
  3. 整个文档的生成

    • 文档 ( 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. 狄利克雷分布的特点

狄利克雷分布是多项分布的共轭先验分布,具有以下特点:

  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 维单纯形上的分布,能够自然地对概率分布建模。

  2. 共轭性

    • 共轭分布的性质使得后验分布仍然属于同一分布族,从而大大简化了推断过程。在贝叶斯推断中,狄利克雷分布是多项分布的共轭先验,这意味着:
      P ( θ ∣ 数据 ) ∝ P ( 数据 ∣ θ ) P ( θ ) , P(\boldsymbol{\theta} | \text{数据}) \propto P(\text{数据} | \boldsymbol{\theta}) P(\boldsymbol{\theta}), P(θ∣数据)∝P(数据∣θ)P(θ),
      后验分布 ( P ( θ ∣ 数据 ) P(\boldsymbol{\theta} | \text{数据}) P(θ∣数据) ) 仍然是狄利克雷分布。
  3. 可控的稀疏性

    • 狄利克雷分布的参数 ( α \boldsymbol{\alpha} α )(或 ( β \boldsymbol{\beta} β ))可以控制分布的稀疏性。具体来说:
      • 若 ( α i ≪ 1 \alpha_i \ll 1 αi≪1 ),表示分布倾向于稀疏,即大多数概率质量集中在少数分量上;
      • 若 ( α i > 1 \alpha_i > 1 αi>1 ),表示分布倾向于均匀。
    • 在 LDA 中,可以通过调节 ( α \boldsymbol{\alpha} α ) 控制文档中的主题稀疏性,以及通过 ( β \boldsymbol{\beta} β ) 控制主题中的单词稀疏性,这与实际应用需求非常吻合。

2. 为何不用其他分布?

虽然理论上可以用其他分布(如正态分布、指数分布)来建模,但这些分布在概率模型中的适用性远不如狄利克雷分布,具体原因如下:

  1. 正态分布

    正态分布定义在实数域上,而主题分布和单词分布需要满足归一化条件(所有分量非负,总和为 1),这与正态分布的定义域不符。

  2. 指数分布

    指数分布通常用于建模正值随机变量,但同样无法直接用于表示归一化的概率分布。

  3. 狄利克雷分布的简单性与解释性

    狄利克雷分布提供了一种直观的方式来控制主题和单词分布的稀疏性,同时具有优雅的数学性质(如共轭性),这使得模型推导和计算更加简洁高效。


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大模型辅助下完成。

相关推荐
桃花键神4 分钟前
AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
人工智能
野蛮的大西瓜25 分钟前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
CountingStars6191 小时前
目标检测常用评估指标(metrics)
人工智能·目标检测·目标跟踪
tangjunjun-owen1 小时前
第四节:GLM-4v-9b模型的tokenizer源码解读
人工智能·glm-4v-9b·多模态大模型教程
冰蓝蓝1 小时前
深度学习中的注意力机制:解锁智能模型的新视角
人工智能·深度学习
橙子小哥的代码世界1 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
新加坡内哥谈技术2 小时前
苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
大数据·人工智能·语言模型
fanstuck2 小时前
Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
人工智能·数据挖掘·openai
lovelin+v175030409662 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
唐小旭3 小时前
python3.6搭建pytorch环境
人工智能·pytorch·python