contextualized-topic-models
结合 BERT 预训练嵌入与神经变分推断,让主题模型真正读懂语义上下文
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
结合 BERT 预训练嵌入与神经变分推断,让主题模型真正读懂语义上下文
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
假设你是一家大型研究图书馆的内容策展人,手上有 50 万篇学术论文摘要,急需按主题自动归类。传统的 LDA(Latent Dirichlet Allocation)主题模型看起来是现成方案——它能把文档映射到「主题-词」概率分布,帮你自动发现「机器学习」「生物化学」「经济学」等类别。
然而当你真正跑起来,问题出现了:LDA 看到的是词频共现,它不知道「neural network」和「deep learning」其实是同一个研究方向,也分不清「bank」是银行还是河岸。结果生成的主题词列表语义混乱,很多主题人类根本无法解读。
这正是 Contextualized Topic Models(CTM) 要解决的问题。
CTM 由意大利博科尼大学 MilaNLP 实验室的 Federico Bianchi 等人开发,核心技术论文发表在 EACL 2021 和 ACL 2021(两篇顶会)。作者敏锐地观察到:传统主题模型的症结在于「词袋」(Bag of Words)表示无法捕捉语义上下文——而预训练语言模型(如 BERT)恰好擅长这一点。
核心思路是:将 BERT 等预训练 Transformer 生成的上下文相关嵌入(contextualized embeddings)引入神经主题模型,弥补传统 LDA 的语义短板。团队还开发了 KitKitty 子模块,提供人机协同的文档分类器,进一步提升主题标注效率。
CTM 本质上是神经变分推断(Neural Variational Inference)与预训练嵌入的融合。其架构核心组件如下:
1. 推理网络(Inference Network)
CTM 提供两种推理网络:
ContextualInferenceNetwork:仅使用 BERT 嵌入(用于 ZeroShotTM)CombinedInferenceNetwork:将 BERT 嵌入与词袋向量拼接(用于 CombinedTM)推理网络将文档的高维表示压缩为潜在主题分布的均值 μ 和对数方差 log σ,实现变分推断。
2. 解码网络(Decoder Network)
解码器基于两种生成模型:
通过 Xavier 均匀初始化主题-词矩阵 β,并使用 BatchNorm 提升数值稳定性。
3. 两种核心模型
| 模型 | 输入 | 特点 | 适用场景 |
|---|---|---|---|
| CombinedTM | BERT 嵌入 + 词袋 | 主题连贯性最强 | 标准主题发现 |
| ZeroShotTM | 仅 BERT 嵌入 | 支持零样本/跨语言 | 新文档分类、翻译场景 |
零样本跨语言能力是 ZeroShotTM 的杀手锏:用多语言 BERT(如 paraphrase-multilingual-mpnet-base-v2)训练后,模型可以处理从未见过的语言文档——这在传统主题模型中完全不可能。
安装(2分钟):
pip install contextualized_topic_models
训练 CombinedTM(50个主题):
from contextualized_topic_models.models.ctm import CombinedTM
from contextualized_topic_models.training.dataset import CTMDataset
from contextualized_topic_models.preprocessing import SimplePreprocessing
# 预处理
preprocessed, unpreprocessed = SimplePreprocessing(documents).preprocess()
# 训练
ctm = CombinedTM(
input_size=len(vocab),
bert_input_size=768,
n_components=50,
model_type='prodLDA'
)
ctm.fit(text_for_bow=preprocessed, text_for_bert=unpreprocessed)
零样本跨语言预测:
# 用 ZeroShotTM 处理西班牙语文档,无需提供西班牙语词袋
ztm = ZeroShotTM(input_size=len(vocab), bert_input_size=768, n_components=50)
ztm.predict(text_for_bert=spanish_documents) # 只传BERT输入
Google Colab 提供完整教程,支持在线运行无需本地配置。
架构设计:
models/(CTM/ZeroShotTM/Kitty)、networks/(推理/解码网络)、evaluation/(NPMI/Pass@1)early_stopping 机制防止过拟合,学习率调度器(ReduceLROnPlateau)可选依赖生态:
sentence-transformers:多语言预训练嵌入gensim:词袋词汇表构建nltk:文本预处理wordcloud + matplotlib:主题可视化测试覆盖:
pytest 测试套件覆盖核心模型(test_contextualized_topic_models.py)和评估指标(test_measures.py)文档质量:
尽管 CTM 在主题连贯性上显著优于 LDA,但仍存在以下局限:
CTM 的出现标志着「预训练模型赋能经典NLP任务」这一趋势的成熟。自 2021 年发表以来,该项目在 GitHub 获得 1272 颗星,被广泛应用于学术文献综述、新闻聚类、客服工单分析等场景。
更重要的是,CTM 证明了模块化组合的力量:通过解耦「语义表示」(BERT)和「主题生成」(变分自编码器),研究者可以独立升级任一模块——比如用最新的 LLM 嵌入替换 BERT,性能可能进一步提升。
该项目属于 MilaNLP 实验室的 NLP 工具矩阵的一部分,与其他 NLP 工具形成互补,共同推动主题模型在产业界的落地。
图1:CTM 架构示意(来源:项目 GitHub 仓库)

图2:多语言主题模型效果(来源:项目文档)
