🌟 主题模型演进图谱
文本建模三阶段:
词袋模型 → 潜在语义 → 概率生成
Unigram
→ LSA
→ PLSA
→ LDA
📦 基础模型:Unigram模型
核心假设
-
文档中每个词独立生成(词袋假设)
-
忽略词语顺序和语义关联
-
文档生成概率:P(d)=∏w∈dP(w)P(d)=∏w∈dP(w)
数学表示
P(d)=∏i=1NP(wi)P(d)=∏i=1NP(wi)
其中:
-
NN为文档词数
-
P(wi)P(wi)为词wiwi的全局出现概率
🔍 潜在语义分析:LSA/LSI模型
核心思想
-
通过矩阵分解发现潜在语义维度
-
使用SVD分解词-文档矩阵
-
降维消除噪声,捕捉高阶关联
算法步骤
-
构建词-文档矩阵Xm×nXm×n
-
奇异值分解:X=UΣVTX=UΣVT
-
选择前kk个奇异值:X~=UkΣkVkTX~=UkΣkVkT
数学表示
文档向量:dj=ΣkVkT[:,j]dj=ΣkVkT[:,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)∑zP(z∣d)P(w∣z)
生成过程
-
以概率P(d)P(d)选择文档
-
根据P(z∣d)P(z∣d)选择主题
-
根据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)∝∑dn(d,w)P(z∣d,w)
P(z∣d)∝∑wn(d,w)P(z∣d,w)P(z∣d)∝∑wn(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
参数调优技巧
-
累计方差贡献率 > 80%
-
svd.explained_variance_ratio_.cumsum()[:k]
PLSA主题数确定:
-
困惑度(Perplexity)最小化
-
人工评估主题一致性
-
-
防止过拟合:
-
增加平滑项
-
使用贝叶斯变种(如LDA)
-
🚀 演进到LDA
PLSA的贝叶斯升级版:
最新进展
掌握这些基础模型,是理解现代NLP技术的必经之路!
-
引入Dirichlet先验分布
-
解决过拟合问题
-
支持新文档推理
总结与展望
从Unigram到PLSA的发展历程,体现了文本建模的三大进步:
-
从独立到关联:打破词袋独立性假设
-
从显式到潜在:发现隐藏语义结构
-
从确定到概率:建立生成式模型框架
-
神经网络主题模型(NTM)
-
结合预训练语言模型(BERTopic)
-
动态主题模型(DTM)
-
-
延伸阅读:
-
PLSA原始论文
-
主题模型可视化工具
-
剑桥大学主题模型讲义