🌟 主题模型演进图谱

文本建模三阶段
词袋模型 → 潜在语义 → 概率生成
Unigram → LSA → PLSA → LDA

📦 基础模型:Unigram模型

核心假设

  • 文档中每个词独立生成(词袋假设)

  • 忽略词语顺序和语义关联

  • 文档生成概率:P(d)=∏w∈dP(w)P(d)=∏w∈d​P(w)

数学表示

P(d)=∏i=1NP(wi)P(d)=∏i=1N​P(wi​)
其中:

  • NN为文档词数

  • P(wi)P(wi​)为词wiwi​的全局出现概率

🔍 潜在语义分析:LSA/LSI模型

核心思想

  • 通过矩阵分解发现潜在语义维度

  • 使用SVD分解词-文档矩阵

  • 降维消除噪声,捕捉高阶关联

算法步骤

  1. 构建词-文档矩阵Xm×nXm×n​

  2. 奇异值分解:X=UΣVTX=UΣVT

  3. 选择前kk个奇异值:X~=UkΣkVkTX~=Uk​Σk​VkT​

数学表示

文档向量:dj=ΣkVkT[:,j]dj​=Σk​VkT​[:,j]
词向量:wi=UkΣk[i,:]wi​=Uk​Σk​[i,:]

参数设置

from sklearn.decomposition import TruncatedSVD

svd = TruncatedSVD(n_components=100)  # 选择潜在维度k=100
lsa_matrix = svd.fit_transform(tfidf_matrix)

优缺点对比

优势 局限
有效缓解一词多义问题 无法处理新文档(冷启动)
数学理论严谨 可解释性较差
计算效率较高 负值语义解释困难

🎲 概率突破:PLSA模型

核心创新

  • 引入隐变量z表示主题

  • 概率框架建模文档生成过程

  • 联合概率分解:
    P(d,w)=P(d)∑zP(z∣d)P(w∣z)P(d,w)=P(d)∑z​P(z∣d)P(w∣z)

生成过程

  1. 以概率P(d)P(d)选择文档

  2. 根据P(z∣d)P(z∣d)选择主题

  3. 根据P(w∣z)P(w∣z)生成词语

EM算法求解

E-Step:计算主题后验概率
P(z∣d,w)=P(z∣d)P(w∣z)∑z′P(z′∣d)P(w∣z′)P(z∣d,w)=∑z′​P(z′∣d)P(w∣z′)P(z∣d)P(w∣z)​

M-Step:更新参数
P(w∣z)∝∑dn(d,w)P(z∣d,w)P(w∣z)∝∑d​n(d,w)P(z∣d,w)
P(z∣d)∝∑wn(d,w)P(z∣d,w)P(z∣d)∝∑w​n(d,w)P(z∣d,w)

代码实现概览

class PLSA:
    def __init__(self, n_topics=10, max_iter=50):
        self.n_topics = n_topics
        self.max_iter = max_iter
    
    def fit(self, doc_word_matrix):
        # 初始化参数
        self.P_z_d = np.random.rand(n_docs, n_topics)
        self.P_w_z = np.random.rand(n_topics, n_words)
        
        for _ in range(self.max_iter):
            # E-step
            gamma = self.P_z_d[:, None] * self.P_w_z.T[None, :]
            gamma /= gamma.sum(axis=2, keepdims=True)
            
            # M-step
            self.P_w_z = (doc_word_matrix[:, None] * gamma).sum(axis=0)
            self.P_w_z /= self.P_w_z.sum(axis=1, keepdims=True)
            
            self.P_z_d = (doc_word_matrix * gamma).sum(axis=2)
            self.P_z_d /= self.P_z_d.sum(axis=1, keepdims=True)

优缺点分析

突破性优势 现存问题
概率框架可解释性强 参数数量随文档线性增长
解决一词多义、一义多词问题 容易过拟合
支持软聚类 缺乏文档生成概率模型

📊 三大模型对比全景图

维度 Unigram LSA PLSA
模型类型 统计语言模型 线性代数模型 概率生成模型
核心思想 词频独立 潜在语义空间 主题隐变量
数学工具 极大似然估计 SVD分解 EM算法
可解释性
处理新文档 直接计算 需重新投影 无法处理
参数复杂度 O(V) O(k×(V+D)) O(D×K + K×V)
主要应用 文本分类基线 语义检索 主题发现

(V: 词表大小, D: 文档数, K: 主题数)

💡 工程应用建议

场景选择指南

  • 短文本快速处理 → Unigram + TF-IDF

  • 语义搜索/推荐系统 → LSA/LSI

  • 主题挖掘/内容分析 → PLSA

参数调优技巧

  1. 累计方差贡献率 > 80%

  2. svd.explained_variance_ratio_.cumsum()[:k]

    PLSA主题数确定

    • 困惑度(Perplexity)最小化

    • 人工评估主题一致性

  3. 防止过拟合

    • 增加平滑项

    • 使用贝叶斯变种(如LDA)

🚀 演进到LDA

PLSA的贝叶斯升级版:

最新进展

掌握这些基础模型,是理解现代NLP技术的必经之路!

  • 引入Dirichlet先验分布

  • 解决过拟合问题

  • 支持新文档推理

    总结与展望

    从Unigram到PLSA的发展历程,体现了文本建模的三大进步:

  • 从独立到关联:打破词袋独立性假设

  • 从显式到潜在:发现隐藏语义结构

  • 从确定到概率:建立生成式模型框架

  • 神经网络主题模型(NTM)

  • 结合预训练语言模型(BERTopic)

    • 动态主题模型(DTM)

  1. 延伸阅读

  2. PLSA原始论文

  3. 主题模型可视化工具

  4. 剑桥大学主题模型讲义

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐