Writing
Long-form writing about software, design, and the craft of building things.
用图拆解 BERTopic:从语义嵌入到 c-TF-IDF
BERTopic 是 Maarten Grootendorst 在论文 BERTopic: Neural topic modeling with a class-based TF-IDF procedure 中提出的一种主题建模方法。 它的核心不只是“把 BERT 用到主题建模里”,而是把主题建模拆成两个相对独立的问题: 哪些文档应该分到一起? 这个问题交给语义嵌入、降维和聚类。 这个文档簇应该怎样命名? 这个问题交给 class-based TF-IDF,也就是 c-TF-IDF。 这篇笔记把前面整理的论文摘要和算法可视化合在一起,用几张图拆开说明 BERTopic 的关键算法。 BERTopic 的整体流程可以概括为: 用 Sentence-BERT 之类的模型把文档编码成向量; 用 UMAP 把高维向量压到更适合聚类的低维空间; 用 HDBSCAN 找出密度较高的文档簇,并允许一部分文档作为离群点; 把每个簇里的文档拼成一个“大文档”,用 c-TF-IDF 找出最能代表这个簇的词; 得到主题、主题关键词,以及随时间或元数据变化的局部主题表示。 为什么不是直接用 LDA? 传统主题模型,比如 LDA 和 NMF,通常把文档看成词袋。词袋表示很好用,但它有一个明显代价:它弱化了词语在上下文中的语义关系。 例如,“car”“vehicle”“Tesla”“self-driving”在不同年代、不同语境下可能指向同一个主题,但词袋模型并不会天然知道这些词在语义空间中靠得很近。 BERTopic 的出发点是:先用预训练语言模型捕捉文档级语义,再把主题表示交给更可解释的词频方法。这样一来,聚类依赖语义,解释仍然落在可读的关键词上。 第一步:文档嵌入 BERTopic 首先将每篇文档转换成向量。论文中使用的是 Sentence-BERT 框架,它能把句子或段落映射到稠密向量空间。 直觉上,如果两篇文档讨论的是同一类事情,它们的向量应该比较接近。比如几条关于 GPU、模型训练、推理性能的文本,应该比关于选举或足球比赛的文本更靠近。 图中左侧展示的是“文档变成向量”的直觉。真实的语言模型嵌入通常有几百甚至上千维,图里只取两个方向做示意。 这里有一个重要设计:BERTopic 不要求某一种固定的嵌入模型。论文中比较了 Universal Sentence Encoder、Doc2Vec、MiniLM 和 MPNet 等模型。结果显示,BERTopic 对嵌入模型具有一定稳定性,不过不同语料上仍会有差异。