经典 LDA 主题建模不是把整批文本各贴一个主题标签,而是在同一套主题空间里同时估计两类概率:每个主题由哪些词构成,以及每篇文档由哪些主题混合构成。
lda-classic 的功能设计围绕这条经典流程展开:先决定【一篇文档】是什么,再处理分词和词典,随后训练主题模型,最后把主题词、主题规模、主题距离、文件构成和逐文档主题概率放在同一份报告里。
本文不只解释概念。下面使用当前功能实际跑一组演示语料,并直接读取真实报告。工具设置截图来自当前任务页;报告截图来自当前分析程序的实际结果,并由当前报告组件渲染。
01
这次实际分析了什么
为了让流程和报告结构容易核对,本次使用一组自建演示语料,不把结果当作真实研究结论。
演示语料由 3 个 TXT 文件组成,每个文件包含 12 个以空行分隔的段落,共 36 个文档单元。段落内容围绕四组材料展开:
数字档案与历史文献整理;
平台规则与内容治理;
在线教育与学习反馈;
社区记忆与口述材料。
三个文件都混合了这四组内容。这样既能观察模型能否形成不同主题,也能检查【各文件主题构成】是否真的在同一主题坐标系中比较。
本次参数如下:
| 设置 | 本次取值 | 对结果的直接影响 |
|---|---|---|
| 文档主要语言 | 中文 | 使用中文分词与系统中文停用词 |
| 文档切分单元 | 按段落 | 每个空行分隔段落是一篇文档 |
| 主题数量 K | 4 | 模型固定估计 4 个主题 |
| 最短文档字符数 | 30 | 过短段落不进入模型 |
| 最短词长 | 2 | 单字词不进入模型 |
| 最低文档频数 | 2 | 只出现于 1 篇文档的词被移除 |
| 最高文档频率比例 | 75% | 出现在超过四分之三文档中的词被移除 |
| 词表规模上限 | 50,000 | 过滤后最多保留 50,000 个词 |
| 训练方式 | 在线变分贝叶斯 | 按批次更新主题参数 |
| 语料遍历次数 | 15 | 完整遍历语料 15 次 |
| 每文档迭代次数 | 100 | 每篇文档的主题分布最多迭代 100 次 |
| Alpha / Eta | 对称 / 对称 | 各主题和各词使用对称先验 |
| 随机种子 | 42 | 固定本次初始化,便于复现 |
| 一致性指标 | c_v | 报告用 c_v 衡量主题词共现结构 |
| 每主题展示词数 | 12 | 报告展示每个主题前 12 个词 |
02
功能的第一层设计:先让材料对号入座
任务页没有要求用户一开始就理解所有模型参数,而是先提供四类材料预设:
【短文本合集(一行一条)】;
【中篇文档合集(空行分隔)】;
【单部长文(按段落拆开)】;
【多篇成文(每个文件一篇)】。
预设会一次填入对应的切分方式、主题数、过滤阈值和训练参数,选完仍可逐项修改。本次以【中篇文档合集】为起点,再把 K 调整为 4,并将最高文档频率比例改为 75%。

— 当前任务页中的材料预设、文档切分和主题数量设置
这里最重要的设置不是 K,而是【文档切分单元】。
【按行】把每个非空行视为一篇文档,适合评论、弹幕和开放题;
【按段落】优先按空行分段,适合长文内部分析和多篇中篇材料;
【按文件】把每个文件整体视为一篇文档,适合多个独立文章或报告。
文档边界决定词语在哪个范围内共同出现。相同原文改成另一种切分方式,得到的是另一批观测,主题含义和主题比例都可能改变。
03
实际运行后,报告先交代哪些材料进入了模型
本次实际运行得到:
3 个文件;
36 个段落单元;
36 篇文档参与建模;
0 个过短单元被剔除;
过滤前 269 个词,过滤后 200 个词;
分词后 722 词次,进入模型 653 词次;
4 个主题;
困惑度 36.33;
c_v 一致性 0.4481。

— 实际运行后的语料与模型概况
这一块解决的是报告口径问题。
【参与建模文档数】不是上传文件数。按段落切分时,一个文件可以产生多篇文档;按行切分时,每个非空行都是一篇文档。报告同时列出各文件的切分单元数和参与建模文档数,便于发现材料是否因最短字符数或词典过滤被排除。
【建模词次】也不是原始字数。它是在分词、停用词、词长、数字和词典频率过滤之后,真正进入词袋矩阵的词语计数。
04
主题关键词展示的是主题—词概率
实际报告为每个主题列出前 12 个高概率词,并显示这些词在该主题词分布中的概率。

— 实际运行得到的四组主题关键词
从词组可以看到:
主题 2 以【记忆、事件、故事、地方、档案、老照片】为主,较接近社区记忆材料;
主题 4 以【档案、记录、来源、文本、检索、识别】为主,较接近数字档案材料;
主题 1 出现【学习、课程、学生、经验】,但同时包含【规则、内容】,不是完全纯粹的教育主题;
主题 3 出现【平台、规则、反馈、数据、时间】,同时吸收了一些跨材料的通用表述。
这正是实际 LDA 结果的读取方式:主题名称需要研究者根据一组高概率词和原文概括,不能只看第一个词,也不能假定 K 等于预设的真实类别数。
同一个词可以出现在多个主题中。主题 2 和主题 4 都出现【档案】,但它在两组词中的邻近词不同:一组更接近地方记忆和材料,一组更接近文本记录、来源与检索。
05
主题规模为什么同时给两个数字
报告用两个口径描述主题规模:
主导文档占比 = 以该主题为最高概率主题的文档数 ÷ 全部有效文档数
平均权重 = 全部文档在该主题上的概率之和 ÷ 全部有效文档数
本次主题 3 的主导文档占比为 38.9%,平均权重为 38.6%;主题 2 的主导文档占比为 11.1%,平均权重为 12.0%。

— 实际报告中的主题规模与主题间距离图
主导文档占比只保留每篇文档的第一名主题;平均权重保留完整主题混合。一篇文档即使以主题 3 为主,仍可能把部分概率分给主题 1、2 或 4。
因此,不能把【主导文档占比】直接理解为某主题占全部篇幅的百分比。它按文档计数,不按字符数计数。
06
距离图回答的是用词是否接近
主题间距离来自主题—词概率分布之间的 Jensen—Shannon 距离。0 表示两组词概率完全相同,1 表示差异达到该距离定义的上界。
本次 4 个主题两两比较,平均距离为 0.68。主题 2 与主题 4 最近,距离为 0.62;主题 3 与主题 4 最远,距离为 0.71。
二维图只把完整距离矩阵投影到平面。气泡远近用于近似观察主题差异,气泡大小表示主导文档占比。横轴、纵轴和象限没有主题意义,旋转或翻转图形也不会改变结论。
距离较近只表示两组主题使用了较相似的词,不表示主题之间存在因果、时间顺序或社会关系。
07
文件比较和逐文档结果怎样对应
因为全部文件共享同一个模型,主题 1 到主题 4 在三个文件中具有同一套含义。报告先计算每篇文档的完整主题分布,再对同一文件内的文档求平均,形成【各文件主题构成】。
本次三个演示文件都刻意混合四组内容,因此三个文件的第一大主题都是主题 3,整体构成也较接近。这个结果符合演示语料的组织方式,并不说明真实语料中的文件必然相似。

— 各文件主题构成和逐文档主题分布
逐文档表保留每篇文档的概率色条、主导主题、主导概率、来源文件和单元序号。例如前三篇数字档案段落都以主题 4 为主,主导概率分别约为 97.0%、96.6% 和 96.2%;第 4 篇平台审核材料则同时分配给多个主题,主题 1 的主导概率只有 53.5%。
这类边界文档比高概率文档更值得回看原文。它可能同时讨论多个议题,也可能说明当前 K 或词典设置把两个表达模式放在了相邻主题中。
报告中的 0.5 只是阅读参考线,不是模型给出的正确率阈值。主导概率是当前模型内部的概率集中程度,不是经过人工标注校准的分类准确率。
08
词典过滤为什么必须和主题一起看
模型先把每篇文档转换成词语计数,再按三层规则修剪词典:
低于【词的最低文档频数】的词被删除;
高于【词的最高文档频率比例】的词被删除;
超过【词表规模上限】时,只保留总词频更高的词。
文档频率指【有多少篇文档出现过这个词】,不是这个词总共出现多少次。一个词在同一篇文档里重复一百次,文档频率仍只增加一。
本次词典从 269 个词缩减到 200 个词。主题词、主题距离、困惑度和一致性都基于这 200 个词计算。修改词典阈值不是只改变一张词表,而是会重新估计整套主题。
当前功能还会在词典过小时停止建模:过滤后至少要保留 max(10,2K) 个词。这个检查避免在主题数相对词表过大的情况下继续给出形式上完整、实际无法解释的结果。
09
在线训练、Alpha 和 Eta 在页面中怎样使用
【在线变分贝叶斯】按批次更新全局主题参数,页面同时开放批处理文档数、学习率衰减指数和学习率延迟。【批量变分贝叶斯】每遍使用全部文档更新模型,学习率设置不会参与批量训练。
Alpha 控制一篇文档的主题概率更集中还是更平缓;Eta 控制一个主题的词概率更集中还是更平缓。页面允许选择对称、自动学习和自定义值,Alpha 还提供非对称模式。
这些参数不是结果展示选项。修改后模型会重新训练,主题词和文档主题概率都可能改变。比较参数时,应固定语料、文档切分、词典、K 和随机种子,只改变一个待研究设置。
10
报告建议按这个顺序读
实际报告已经把经典 LDA 的主要证据放在一个页面中。建议按以下顺序阅读:
【这份结果说明了什么】:确认文档数、主题数、最大主题和指标摘要;
【语料与模型概况】:核对切分、剔除、词典和建模词次;
【主题关键词】:根据词组形成暂定主题概括;
【主题规模】:区分主导文档占比与平均权重;
【主题间距离图】和【主题距离热力图】:检查主题是否重复或接近;
【词—主题分布热力图】:识别专属词和跨主题共用词;
【各主题一致性对比】:找到词组结构较松散的主题;
【文档归类确信度分布】:查看文档概率是否集中;
【各文件主题构成】:比较多个文件在共同主题空间中的平均差异;
【文档—主题分布】:回到具体原文核对主题解释;
【主题词明细】和【指标与口径】:确认词概率、参数与计算边界。
页面最多展示前 300 篇文档。完整结果还会导出三份文件:每个主题前 50 个词的概率、全部文档的完整主题概率,以及过滤后词典中的文档频数和总词频。
11
怎样比较不同 K
lda-classic 不会自动替研究者选择主题数。若要比较 K,可以对同一份处理后语料运行多次任务,例如 K 取 3、4、5、6,并固定其余设置。
比较时不要只挑一致性最高的一次,还应同时检查:
主题关键词是否形成可区分的词组;
距离图中是否出现多组近似主题;
边界文档是否大面积分散在多个主题之间;
同一批文件的主题构成是否随着 K 剧烈变化;
困惑度和同一种一致性指标如何变化。
不同一致性指标不能直接横比。u_mass 常为负数,c_v、c_uci 和 c_npmi 的构造也不相同;比较任务时应固定指标名称。
12
这份结果能够支持什么
经典 LDA 可以显示当前文档边界和词袋表示下反复出现的用词结构、每篇文档的主题混合,以及多个文件在共同主题坐标系中的平均差异。
它不保留词序和句法,不会自动给出可靠主题名称,也不能把主题当作客观存在的文本类别。高概率词共同出现说明共现结构,不证明因果关系;文件主题权重的差异也不能单独解释差异为什么出现。
本次演示尤其说明了一点:语料原本按四组内容构造,LDA 仍把部分教育、平台和通用研究用语合在相邻主题中。研究者需要结合主题词、距离、概率和原文共同命名,而不是把预设类别直接套回模型结果。
13
资料来源
Hoffman、Blei、Bach:Online Learning for Latent Dirichlet Allocation,NeurIPS,2010
Röder、Both、Hinneburg:Exploring the Space of Topic Coherence Measures,WSDM,2015
END
