手里有一整年的市长信箱留言,或者三十份课堂观察记录,最先想知道的往往是这批材料反复在谈哪几类事情。一条一条读能得到答案,只是材料一多,读到后面就记不清前面。主题模型(Topic Model,从大量文本里自动归纳话题的方法)先替你把材料过一遍,归纳出若干主题,每个主题是一组经常一起出现的词。
LDA(潜在狄利克雷分配,Latent Dirichlet Allocation)是 Blei、Ng 和 Jordan 在 2003 年提出的主题模型。它假设一段话由几个主题按比例混合写成,每个主题各有一组偏爱的词,再从词语在同一段话里一起出现的规律,反推出材料里有哪些主题、每段话里各占多少。社会科学很早就用它读大规模文本。DiMaggio、Nag 和 Blei 2013 年用它分析美国报纸怎样报道政府的艺术资助,Grimmer 和 Stewart 同年在《Political Analysis》上系统讨论了它在政治文本研究里的用法。
在 TATOOLS 的【高级LDA主题模型】里【上传文档】,每个文件会切成片段,各自训练一套主题。报告给出每个主题的高概率词、一个简短的主题标签和几段代表性原文,列出每个片段属于各个主题的概率,还有一致性、PMI 和困惑度几项指标。主题数可以自己定,也可以交给 TATOOLS 在 3 到 12 之间自动选。词和词之间的关系有三种建立方式,词袋按词语一起出现来算,语义向量把意思相近的片段拉到一起,Word2Vec 从上下文里学出词义。
这篇教程先讲 LDA 模型本身,从它对文本生成方式的假设讲起,再讲两个先验参数管什么,以及模型怎样从文本里估出主题。接下来讲材料怎样变成模型能读的词袋和主题数怎么定,再比较三种向量化方式各自怎样工作。报告里的每一项指标放在后半部分逐个讲,最后给出论文方法部分的写法。
01
LDA 假设一段文字是怎样写出来的
先看一段访谈转写,【房租一年涨了两成,孩子上学还得跨区,每天路上一个多小时】。这段话大半在说住房,小半在说上学。LDA 用两组概率描述它。一组是这段话里各个主题占多少,比如住房 0.7、教育 0.3;另一组是每个主题偏爱哪些词,住房主题里【房租】【租金】【房东】的概率高,教育主题里【学校】【学区】【老师】的概率高。
LDA 把一批文本看成按下面的步骤写出来的,这个过程叫生成过程(Generative Process)。模型假设文本是这样来的,再倒推出最可能的两组概率。
对每个主题 k = 1, …, K
φ_k ~ Dirichlet(β) 主题 k 的词分布
对每个片段 d
θ_d ~ Dirichlet(α) 片段 d 的主题比例
对片段 d 里的第 n 个词
z_(d,n) ~ Categorical(θ_d) 先按比例抽一个主题
w_(d,n) ~ Categorical(φ_z) 再从这个主题的词分布里抽一个词
K 是主题数。φ_k 是主题 k 在整个词表上的概率分布,θ_d 是片段 d 在 K 个主题上的比例,两者都是加起来等于 1 的一组数。把中间抽主题的一步合并掉,一个词在片段 d 里出现的概率,是各个主题贡献之和。
p(w | d) = Σ_k θ_(d,k) × φ_(k,w)
用开头那段话手算一次。θ_d = (0.7, 0.3),【租金】在住房主题里的概率是 0.10,在教育主题里是 0.01。
p(租金 | d) = 0.7 × 0.10 + 0.3 × 0.01 = 0.07 + 0.003 = 0.073
住房主题贡献了 0.07,教育主题只贡献 0.003,【租金】这个词几乎全由住房主题带来。
这套假设有两个直接后果。第一,一段话可以同时属于几个主题,统计上叫混合成员(Mixed Membership)。聚类给每段话贴一个标签,LDA 给每段话一组比例,一段同时谈房租和上学的话,两个主题都能分到份额。第二,模型只看每个词出现了几次,词的先后顺序不进入计算,这个假设叫词袋假设(Bag of Words)。【支持提高补贴】和【反对提高补贴】用的词几乎一样,在 LDA 里会落进同一个主题。LDA 擅长回答材料在谈哪些议题、各议题占多大分量,立场和态度要靠情感分析或人工编码另外判断。
主题本身是词表上的一组概率,它叫什么名字,是研究者读了高概率词和原文以后的归纳。DiMaggio 等人把 LDA 的主题读作新闻报道的框架(Frame),用的就是这种解读方式。
TATOOLS 报告的【主题分析】为每个主题画出 φ_k 里概率最高的 10 个词,【片段归类表】为每个片段列出 θ_d 里最大的两个主题和它们的概率。
02
α 和 β 管的是什么
两条短评,【外卖送得慢】和【外卖送得慢,包装也漏了,客服还不理人】。前一条只说一件事,后一条说了三件。α 决定模型倾向于让一段话集中在少数几个主题上,还是均匀摊到很多主题上。β 在主题一侧做同样的事,管的是一个主题的概率集中在少数几个词上还是分散开。
θ_d 和 φ_k 的先验都是狄利克雷分布(Dirichlet Distribution,专门给一组加起来等于 1 的数指定概率的分布)。K 维狄利克雷分布的密度和参数的关系是这样的。
p(θ | α) ∝ Π_k θ_k^(α_k − 1)
α_k < 1:概率堆在少数几个分量上,θ 偏稀疏
α_k = 1:所有比例组合同样可能
α_k > 1:各分量趋向平均
先验的作用在估计时看得最清楚。每个词分到哪个主题确定以后,θ 和 φ 的估计值等于计数加上先验,再归一化。
θ_(d,k) ≈ (n_(d,k) + α) / (N_d + K × α)
φ_(k,w) ≈ (n_(k,w) + β) / (n_k + V × β)
n_(d,k):片段 d 里分给主题 k 的词数
N_d:片段 d 的词数
n_(k,w):词 w 分给主题 k 的次数
n_k:分给主题 k 的全部词数
V:词表里的词数
α 相当于给每个主题预先垫上的虚拟词数。一个 20 个词的片段,K = 3,15 个词分给主题 1,5 个分给主题 2,主题 3 一个也没有。
| α | 主题 1 | 主题 2 | 主题 3 |
|---|---|---|---|
| 0.1 | 15.1 / 20.3 ≈ 0.744 | 5.1 / 20.3 ≈ 0.251 | 0.1 / 20.3 ≈ 0.005 |
| 1 | 16 / 23 ≈ 0.696 | 6 / 23 ≈ 0.261 | 1 / 23 ≈ 0.043 |
α = 0.1 时主题 3 几乎为零,α = 1 时它分到了 4.3%。β 在主题一侧起同样的作用。主题 k 一共分到 200 个词,词表有 1,000 个词,【租金】分到 20 次,【押金】一次也没分到。
| β | 租金 | 押金 |
|---|---|---|
| 0.01 | 20.01 / 210 ≈ 0.095 | 0.01 / 210 ≈ 0.00005 |
| 0.1 | 20.1 / 300 = 0.067 | 0.1 / 300 ≈ 0.0003 |
β 越大,没出现过的词分到的概率越多,高概率词的优势越小,主题读起来更散。
Wallach、Mimno 和 McCallum 2009 年比较了几种先验设定。让每个主题的 α 各不相同(非对称先验),模型对文本的拟合更好,【我们】【问题】这类常用词也更容易集中到少数几个主题里,少污染其他主题;β 保持对称就够用。短评论和开放题一般一条只谈一两件事,α 通常取小一些;一段话常常同时谈几件事的长材料,α 可以大一些。
TATOOLS 工具页切到【专业模式】、选【词袋(BoW)】以后,可以设置【Alpha(主题分布先验)】和【Beta(词汇集中度)】。【Alpha】有三种选法,【自定义】用滑块在 0.01 到 1 之间取值,默认 0.1;【对称】给每个主题都取 1/K;【自动】从数据里为每个主题学出各自的 α,也就是 Wallach 等人推荐的非对称先验。【Beta】在 0.01 到 1 之间取值,默认 0.01。报告【模型训练参数】里的【α(文档-主题先验)】和【β(主题-词先验)】记录了这次实际用的值。
03
模型怎样从文本里反推出主题
生成过程是从主题写出文本,研究时手里只有文本,要反过来求每个词属于哪个主题。精确的后验分布要对所有可能的主题分配求和,词一多就算不动,实际用的都是近似方法。Griffiths 和 Steyvers 2004 年用吉布斯抽样(Gibbs Sampling,一次改一个词的主题,反复抽样直到稳定),Blei 等人的原论文用变分贝叶斯(Variational Bayes,用一个好算的分布去逼近后验)。Hoffman、Blei 和 Bach 2010 年又给变分贝叶斯做了在线版本,能分批处理大语料。
两种方法里,一个词分给哪个主题都由两样东西相乘决定,吉布斯抽样的条件概率写得最直白。
p(z_(d,n) = k | 其余所有词的分配) ∝ (n_(d,k) + α) × (n_(k,w) + β) / (n_k + V × β)
第一项是主题 k 在本片段里已经占了多少,第二项是主题 k 有多偏爱这个词。一个片段里住房主题已经占六成,住房主题又很偏爱【租金】,这个【租金】就很可能分给住房主题。
变分贝叶斯把同一件事写成两条交替更新的式子,r 表示一个词分给各主题的份额。
r_(n,k) ∝ φ_(k,w_n) × exp(Ψ(γ_k))
γ_k = α_k + Σ_n r_(n,k)
θ_(d,k) 的估计值 = γ_k / Σ_j γ_j
Ψ:双伽马函数;γ_k 不太小时,exp(Ψ(γ_k)) ≈ γ_k − 0.5
exp(Ψ(γ_k)) 大致正比于主题 k 在本片段里的当前份额,结构和吉布斯抽样的条件概率一样。手算一轮,计算时用当前比例代替 exp(Ψ(γ_k))。片段 d 有三个词,K = 2,当前主题比例约为 (0.6, 0.4),α = 0.1。
| 词 | φ_1 | φ_2 | 0.6 × φ_1 | 0.4 × φ_2 | 分给主题 1 | 分给主题 2 |
|---|---|---|---|---|---|---|
| 租金 | 0.10 | 0.01 | 0.060 | 0.004 | 0.94 | 0.06 |
| 押金 | 0.05 | 0.01 | 0.030 | 0.004 | 0.88 | 0.12 |
| 通勤 | 0.01 | 0.03 | 0.006 | 0.012 | 0.33 | 0.67 |
γ_1 = 0.1 + 0.94 + 0.88 + 0.33 = 2.25
γ_2 = 0.1 + 0.06 + 0.12 + 0.67 = 0.95
θ_d ≈ (2.25 / 3.2, 0.95 / 3.2) ≈ (0.70, 0.30)
片段内部这样来回更新,直到比例不再变化或者达到迭代上限,这一步叫 E 步。全部片段做完 E 步,把每个词分给各主题的份额汇总起来更新 φ,这一步叫 M 步。
λ_(k,w) = β + Σ_d Σ_n r_(d,n,k) × 1[w_(d,n) = w]
φ_(k,w) = λ_(k,w) / Σ_v λ_(k,v)
在线版本每处理一批片段更新一次:λ ← (1 − ρ_t) × λ + ρ_t × λ̂,ρ_t 随批次增加而变小
TATOOLS 用的是在线变分贝叶斯。工具页【专业模式】里的【语料库迭代次数】是完整遍历全部片段的次数,1 到 50,默认 10;【每文档迭代次数】是每个片段内部 E 步的上限,1 到 1,000,默认 50。片段多、主题多的材料,多遍历几次,主题更稳定。随机种子是固定的,词袋方式下同一份材料用同一组设置重跑,主题词和概率都相同。报告【模型训练参数】里的【语料遍历次数(passes)】和【单文档迭代次数(iterations)】记录了这两个次数。
04
一个文件切成许多片段,每个文件单独建模
一份 6,000 字的访谈稿整篇当成一个文档,LDA 只能给它一组主题比例,看不出哪一段在谈什么。切成四五十个片段,每个片段有自己的比例,谈住房的段落和谈养老的段落就分开了,主题的占比也有了可以数的分母。
分析单位(Unit of Analysis)是一次统计针对的对象。LDA 的主题比例 θ 在文档一级估计,文档怎么切,直接决定主题在多细的粒度上混合。TATOOLS 的【高级LDA主题模型】把片段当作 LDA 的文档,按四条规则切分。
先按空行分段,空行分出的段落太少时,改按换行分段。
太短的段落往后合并,超长的段落在句号、问号这类句末标点处拆开。
片段数少于主题数的两倍时,按句子重新切成更小的片段。自动定主题数时按 3 个主题算,至少要 6 个片段。
全部文件合计不足 300 个字符,或者一个文件连 3 个片段都切不出来,任务会停止并提示原因。
N ≥ max(3, 2 × K)
N:一个文件切出的片段数
例:K = 8,至少要 16 个片段
片段数是报告里所有占比的分母。一个主题在 12 个片段里占主导,文件一共 40 个片段,它的占比就是 12 / 40 = 30%。
每个文件单独训练一套主题。文件 A 的主题 3 和文件 B 的主题 3 是两个模型各自编的号,内容可以毫不相干。这个设计适合一份一份地看材料,比如每位受访者一份转写稿、每年一份工作报告,先看各自有哪些主题,再对照着读。想让几份材料共用同一套主题,直接比较同一个主题在各文件里的分量,可以用 TATOOLS 的【经典LDA主题建模】,它把所有文件合成一批文档一起训练。
报告【预处理与集中度统计】里的【最终片段数】是进入模型的片段数,【平均片段长度】按词计。上传了多个文件时,用报告顶部的【选择查看的文件】切换。
05
哪些词会进入模型
【我们社区今年新开了老年食堂,来吃饭的老人比去年多了不少】这句话分词以后有十几个词,真正说明话题的是【社区】【食堂】【老人】这几个。LDA 把每个词都当成主题的证据,【我们】【今年】【不少】这种到处都有的词留在词表里,会被摊进各个主题,挤占真正有区分力的词。所以建词表之前要先筛一遍。
TATOOLS 对每个片段依次做八步处理,每一步都对应工具页【专业模式】里的设置。
| 步骤 | 做什么 | 工具页设置 |
|---|---|---|
| 分词 | 中文切成词,英文按字母串切开 | 【文档主要语言】【自定义词典】【自动补充词典】 |
| 词性 | 只留选中的词性,默认只留名词 | 【保留词性类型】 |
| 停用词 | 去掉系统停用词和自己填写的词 | 【自定义停用词】 |
| 功能词 | 去掉单字和纯数字 | 【过滤功能词(单字、纯数字)】 |
| 词形合并 | 几种写法并成一种再计数 | 【词形合并】 |
| 词组 | 相邻的几个词连成词组 | 【启用词组分析(N-gram)】 |
| 词频 | 去掉出现太少和铺得太开的词 | 【最低词频要求】【最高词频比例】 |
| TF-IDF | 去掉平均 TF-IDF 过低或过高的词 | 【启用 TF-IDF(本文常用、别处少用的程度)智能过滤】 |
词频这一步看两个数,只作用于中文材料。
词 w 保留的条件
n(w) ≥ 最低词频要求
df(w) / N ≤ 最高词频比例
n(w):w 在这个文件全部片段里出现的总次数
df(w):含有 w 的片段数
N:片段数
一个文件切成 40 个片段,【最高词频比例】取默认的 80%,一个词最多只能出现在 32 个片段里。【我们】出现在 36 个片段里,36 / 40 = 90%,被去掉。【最低词频要求】取默认的 2,整个文件只出现过一次的【违建】也被去掉。前一条去掉到处都有的词,后一条去掉偶然出现一次、撑不起任何主题的词。
TF-IDF(词频–逆文档频率,一个词在这段里常见、在别处少见的程度)过滤换了一个角度。每个词在每个片段里算一个 TF-IDF 值,再对全部片段取平均,平均值落在【最低阈值】和【最高阈值】之间的词才保留。
tfidf(t, d) = tf(t, d) × idf(t)
idf(t) = ln((1 + N) / (1 + df(t))) + 1
每个片段的 TF-IDF 向量先缩放到长度 1,再对 N 个片段取平均
平均值过低的,是只在极少数片段里零星出现的词。
每一步过滤之后,TATOOLS 都会检查剩下的词够不够建模。词频过滤后词太少,先放宽一档再试,仍然不够就跳过这一步;TF-IDF 过滤后词太少,也直接跳过。之后还会按片段数自动去掉一轮只在极少片段出现、或者几乎每个片段都有的词,中文材料再去掉单字。词表太小、撑不起设定的主题数时,主题数会自动调低,报告【模型训练参数】里的【主题数】是实际用的数。
Denny 和 Spirling 2018 年在《Political Analysis》上专门检验过预处理。去不去停用词、要不要按词频修剪,这类选择会明显改变无监督模型的结果,写论文时要把这些设置和主题一起报告。
TATOOLS 报告【文档概览与模型指标】里的【建模词数】和【不同词数】,是这几步处理以后留下的词次和词种数。【预处理统计】里的【模型词典词数】是最终词表的大小,【词典覆盖率】等于模型词典词数除以预处理后的不同词数。
06
主题数怎么定
同一批 40 个讲社区生活的片段,K = 3 时可能分出住房、教育和养老;K = 8 时,住房又分成租房和买房,养老分成居家照护和养老机构。两种结果都说得通,主题数决定的是看材料的分辨率。
TATOOLS 工具页的【提取的主题数量】有两种定法。关掉【自动确定主题数(推荐)】,用滑块在 2 到 20 之间指定;打开它,TATOOLS 在 3 到 12 之间替你选。
自动选的候选范围还受两个条件约束。每个主题平均至少要有两个片段,候选 K 不超过片段数的一半;词表太小撑不起的 K 也会去掉。
K_max = min(12, ⌊N / 2⌋, 词表允许的上限)
候选 K = 3, 4, …, K_max
每个候选 K 都用这次的片段、词表和先验完整训练一个模型,再看两件事。
第一件事是有没有退化主题(Degenerate Topic)。一个主题几乎分不到词,它的词分布就只剩先验,每个词的概率都差不多,读不出任何意思。模型训练完,每个主题分到的期望词数 n_k 是现成的,用它算份额。
s_k = n_k / Σ_j n_j
主题 k 有效:s_k ≥ (1 / K) × 0.2
平均份额是 1/K,份额不到平均的五分之一,就算退化。
K = 6 时各主题的期望词数:300, 260, 210, 150, 70, 10,合计 1,000
门槛 = 1,000 × 0.2 / 6 ≈ 33.3
主题 6 只有 10,低于门槛,这个 K 的有效主题数 = 5
第二件事是主题一致性,按工具页【主题一致性评估方法】选中的指标计算,后面会专门讲。两件事合起来决定推荐哪个 K。
合格的 K:K 个主题全部有效
推荐的 K:合格的 K 里一致性最高的一个,一致性相同时取较小的 K
没有合格的 K:取有效主题数最多的 K
| K | 有效主题数 | c_v 一致性 | 能否参加比较 |
|---|---|---|---|
| 3 | 3 | 0.41 | 能 |
| 4 | 4 | 0.46 | 能 |
| 5 | 5 | 0.44 | 能 |
| 6 | 5 | 0.49 | 有退化主题 |
| 7 | 6 | 0.47 | 有退化主题 |
K = 6 的一致性最高,但它有一个退化主题,不参加比较。能参加比较的 K 里 K = 4 最高,推荐 K = 4。
为什么不直接取困惑度最低的 K?Chang 等人 2009 年做过人工评测,请人从一组主题词里挑出混进去的外来词,结果困惑度更低的模型,主题反而更难被人读懂。Newman 等人 2010 年和 Röder 等人 2015 年的研究都显示,基于词语共现的一致性指标和人的判断更吻合。TATOOLS 先用份额排除读不出意思的主题,再在剩下的候选里比一致性。
自动定出的主题数写在报告顶部的提示框里,标题是【自动主题数:N 个】,下面写明这次实际比较的范围,【各指标推荐值】列出【无退化主题中一致性最高】和【有效主题数最多】两个读数。上传多个文件时,每个文件各自选主题数。想先看一条完整的曲线,可以用 TATOOLS 的【LDA主题数评估】,它在你设定的范围内逐个主题数计算困惑度和一致性等指标,给出建议的主题数。
07
词袋方式:按词语在同一个片段里一起出现
三个片段筛完词,数一数每个词出现几次,得到一张表。
| 片段 | 租金 | 房东 | 学校 | 老师 | 通勤 |
|---|---|---|---|---|---|
| 片段 1 | 2 | 1 | 0 | 0 | 1 |
| 片段 2 | 0 | 0 | 2 | 1 | 1 |
| 片段 3 | 1 | 1 | 1 | 0 | 0 |
词袋(Bag of Words)把每个片段表示成一行计数,词表有多少个词就有多少列,LDA 读到的只有这张表。【租金】和【房东】总在同一行里出现,它们会被推到同一个主题;【通勤】在片段 1 和片段 2 都有,概率会分到两个主题上。
在 LDA 里,一个词可以在几个主题里都有概率,把词硬分组的方法做不到这一点。【通勤】同时和住房、上学有关,两个主题都保留它,研究者读的时候能看出它的两层含义。
TATOOLS 默认用词袋方式,它也是三种方式里报告最完整的一种,对应工具页【文本向量化方式】里的【词袋(BoW)】。【最高词频比例】、词组分析和 TF-IDF 过滤只在这个方式下出现,迭代次数和两个先验也只在这里能改。开启【启用词组分析(N-gram)】以后,相邻的几个词可以连成一个词组参与建模,【词组长度】设定最短和最长,最长到 5 个词,【最少出现次数】要求词组在同一个片段里重复出现到这个次数才保留。工具页建议词袋方式用于正式文档,材料在 1,000 个字符以上。
08
语义向量方式:意思相近的片段互相补充关键词
两条评论,【排队排了一个多小时】和【等了好久才轮到我】。筛完词以后,它们几乎没有共同的词,词袋方式很难把它们归到一起。评论、弹幕和开放题这类短文本,每条只有几个实词,同一件事的说法又五花八门,只靠词语共现,主题容易散。
语义嵌入(Sentence Embedding,把一段话变成一组表示意思的数字)把每个片段映射成向量 e_d,意思相近的片段,向量也相近。Reimers 和 Gurevych 2019 年提出的 Sentence-BERT 让这类向量能大规模计算。
TATOOLS 的语义向量方式分三步。
先按词袋方式训练 LDA,得到每个主题的词概率 φ_k 和每个片段的主题比例 θ_d。
为每个片段算语义向量,缩放到长度 1,再用 K 均值(K-Means,把点分成 K 组、让每组尽量围着自己的中心)把片段分成 K 组。
第 k 个主题的关键词,在 LDA 给出的高概率词之外并入第 k 组片段里的高频词,两项加权打分,重新排序取前 10 个。
K 均值:min Σ_(j=1..K) Σ_(d∈G_j) ‖e_d − μ_j‖²
关键词得分:s(w, k) = 0.7 × φ_(k,w) + 0.3 × f_k(w)
f_k(w):词 w 在第 k 组片段里的出现次数 ÷ 这组片段的总词数
候选词的得分再除以全部候选词得分之和,作为报告里的权重
手算两个词。第 k 组片段一共 200 个词。【排队】在 LDA 主题 k 里的概率是 0.02,在这组片段里出现 16 次;【客服】在 LDA 主题里是 0.08,在这组片段里出现 4 次。
s(排队) = 0.7 × 0.02 + 0.3 × 16 / 200 = 0.014 + 0.024 = 0.038
s(客服) = 0.7 × 0.08 + 0.3 × 4 / 200 = 0.056 + 0.006 = 0.062
【排队】在 LDA 主题里排得靠后,靠这组片段里的频次补回了分数。片段的主题比例 θ_d 仍然来自 LDA,报告里的占比、代表性原文和片段归类表都按它计算。
TATOOLS 工具页【文本向量化方式】选【语义向量(Embedding)】以后,词性、功能词和词频这些设置都不再显示,只保留【主题一致性评估方法】。工具页建议这个方式用于短文本,材料 500 个字符起就能用。【分析场景】里的【用户反馈】和【公众号评论】两个预设用的就是这个方式,主题数自动确定。报告里的关键词经过重新打分,和词袋方式的指标不能直接比较,这个方式下报告只显示【主题 PMI(两个词一起出现的紧密程度)均值】一项模型指标,象限图、流向图等依赖词袋口径的几块也不显示。向量计算没能完成时,主题词退回词袋结果,【这份结果说明了什么】会写明这一点。
09
Word2Vec 方式:从上下文学出词义,再把词分组
【房租】和【租金】很少出现在同一个片段里,一个人说话通常只用其中一个。它们前后的词却很像,都跟着【上涨】【每月】【交】。语言学家 Harris 1954 年提出分布假设(Distributional Hypothesis),出现在相似上下文里的词,意思也相近。Mikolov 等人 2013 年提出的 Word2Vec,就是按这个假设学词义的模型。
Word2Vec 的 Skip-gram 结构用中心词去预测它前后 c 个词,训练的目标是让真实出现的上下文词概率尽量高。
max (1 / T) × Σ_t Σ_(−c ≤ j ≤ c, j ≠ 0) log p(w_(t+j) | w_t)
p(w_O | w_I) = exp(u_(w_O) · v_(w_I)) / Σ_w exp(u_w · v_(w_I))
v_w:词 w 作中心词时的向量;u_w:作上下文词时的向量
c:上下文窗口大小;T:语料的总词数
【房租 上涨 年轻人 推迟 结婚】这句话,窗口 c = 2,中心词是【年轻人】时,训练用到四组词对,分别是(年轻人,房租)(年轻人,上涨)(年轻人,推迟)(年轻人,结婚)。上下文相似的词,训练后向量方向相近。
TATOOLS 在每个文件自己的片段上训练 Word2Vec,然后用 K 均值把词向量分成 K 组,每一组就是一个主题。组内的词按出现次数和离组中心的远近打分。
g(w, k) = n(w) × max(cos(v_w, μ_k), 0)
p(w | k) = g(w, k) / Σ_(w'∈C_k) g(w', k)
n(w):词 w 在这个文件里出现的次数
μ_k:第 k 组词向量的中心;C_k:第 k 组的词
一组里有三个词,手算它们的权重。
| 词 | 出现次数 | 与组中心的余弦 | 得分 | 权重 |
|---|---|---|---|---|
| 租金 | 12 | 0.9 | 10.8 | 10.8 / 16.8 ≈ 0.643 |
| 押金 | 5 | 0.8 | 4.0 | 4.0 / 16.8 ≈ 0.238 |
| 中介 | 4 | 0.5 | 2.0 | 2.0 / 16.8 ≈ 0.119 |
片段的主题比例用片段向量和各组中心的余弦相似度来算。片段向量是片段里各词向量的平均,余弦为负的记为 0,再归一化。
v̄_d = 片段 d 里各词向量的平均
θ_(d,k) = max(cos(v̄_d, μ_k), 0) / Σ_j max(cos(v̄_d, μ_j), 0)
例:与三个中心的余弦为 (0.6, 0.3, −0.1),θ_d = (0.6, 0.3, 0) / 0.9 ≈ (0.667, 0.333, 0)
这种做法里,一个词只属于一个主题,词和主题之间是硬划分,LDA 则给每个词在各主题上都留了概率。Sia、Dalmia 和 Mielke 2020 年的实验里,把词向量聚类得到的主题,一致性能和 LDA 相当,计算也快得多。
TATOOLS 工具页选【Word2Vec(从上下文学词义的模型)】以后,出现三项专用设置。【词向量维度】50 到 300,默认 100;【上下文窗口大小】3 到 15,默认 5;【Word2Vec(从上下文学词义的模型)最小词频】1 到 10,默认 1,出现次数更少的词不参与向量训练。词种太少时,TATOOLS 会自动调小向量维度和主题数,窗口也不会超过片段平均词数的一半。这个方式没有困惑度,报告里显示为 N/A,一致性固定按 c_v 计算。自动定主题数时,K 仍然用前面那套 LDA 比较来选。工具页建议这个方式用于中长文本,材料在 2,000 个字符以上。
10
三种方式怎么选
三种方式的区别在于词和词怎样发生关系,片段的主题比例又从哪里来。
| 方式 | 词和词怎样发生关系 | 片段的主题比例从哪来 | 工具页建议的材料 |
|---|---|---|---|
| 词袋(BoW) | 在同一个片段里一起出现 | LDA 推断 | 正式文档,1,000 个字符以上 |
| 语义向量(Embedding) | 片段意思相近,补充关键词 | LDA 推断 | 短文本,500 个字符起 |
| Word2Vec | 前后文相似 | 片段向量与主题中心的余弦 | 中长文本,2,000 个字符以上 |
TATOOLS 工具页【分析场景】的五个预设,把向量化方式、主题数和词表设置一次填好,选完仍然可以逐项改。
| 分析场景 | 适合的材料 | 向量化方式 | 主题数 | 其他预设 |
|---|---|---|---|---|
| 文献综述 | 论文摘要、综述、研究报告 | 词袋 | 5 | 保留名词、动词和形容词,开 TF-IDF 过滤,最低词频 3 |
| 作文/开放题 | 学生作文、问卷开放题、自由作答 | 词袋 | 3 | 保留名词、动词和形容词,最低词频 1 |
| 用户反馈 | 产品评价、客服工单、用户建议 | 语义向量 | 自动 | 无 |
| 访谈编码 | 半结构化访谈、焦点小组 | 词袋 | 8 | 再加副词,开 TF-IDF 过滤和词组分析,最低词频 2 |
| 公众号评论 | 微信评论、弹幕、社交媒体回复 | 语义向量 | 自动 | 无 |
TATOOLS 默认用【普通模式】和词袋方式,主题数自动确定,拿不准的时候从默认开始。材料是短评论,可以换成语义向量方式;想看同一个概念的几种说法怎样聚到一起,可以试 Word2Vec 方式,再和词袋结果对照着读。
11
主题标签和代表性原文
一个主题的前几个词是【租金 押金 房东 中介 合同】,读的人很快会把它归成一件事,比如【租房纠纷】。给主题起名叫主题标注(Topic Labeling)。Mei、Shen 和 Zhai 2007 年最早系统研究自动起名,先从语料里找候选短语,再挑和主题词分布最贴近的一个;Lau 等人 2011 年把维基百科的条目标题也纳入候选。现在常见的做法是让语言模型读关键词和原文,直接概括出一个短名字。
TATOOLS 给每个主题起名分三步。
取这个主题概率最高的几个词。
在原文里找到这些词出现的位置,各截一小段上下文。
把关键词和上下文交给语言模型,要求写一个简短的名字,概括这些词共同指向的意思,不能直接拼接关键词,也不能带【主题】二字。
生成的名字不合要求时,这个主题显示为【主题 N】。
名字方便指称,理解主题还要回到原文。TATOOLS 为每个主题挑出主题概率最高的 3 个片段作为代表性原文,放在【主题分析】每个主题卡片下面的【代表性原文段】里。每段标出来源文件、片段编号和这个主题的概率,超过 200 个字符的截到 200 个字符以内的句末。Grimmer 和 Stewart 为自动内容分析提出四条原则,最后一条是反复验证(validate, validate, validate),主题的含义要靠读原文来确认。关键词告诉你这个主题里常出现什么词,代表性原文告诉你这些词在谈什么。
12
一个主题有多大:占主导的片段比例和平均权重
四个片段、三个主题,每个片段的主题比例如下表。
| 片段 | 主题 1 | 主题 2 | 主题 3 | 概率最高的主题 |
|---|---|---|---|---|
| 片段 1 | 0.80 | 0.10 | 0.10 | 主题 1 |
| 片段 2 | 0.50 | 0.40 | 0.10 | 主题 1 |
| 片段 3 | 0.20 | 0.70 | 0.10 | 主题 2 |
| 片段 4 | 0.30 | 0.25 | 0.45 | 主题 3 |
报告用两个数描述主题的规模。
占比_k = 以主题 k 为最大概率主题的片段数 / N
平均权重_k = (1 / N) × Σ_d θ_(d,k)
| 主题 | 占比 | 平均权重 |
|---|---|---|
| 主题 1 | 2 / 4 = 50% | 1.80 / 4 = 0.45 |
| 主题 2 | 1 / 4 = 25% | 1.45 / 4 ≈ 0.36 |
| 主题 3 | 1 / 4 = 25% | 0.75 / 4 ≈ 0.19 |
主题 2 和主题 3 的占比都是 25%,平均权重差了将近一倍。主题 2 在片段 2 里没排第一,也分到了 0.40。占比只数第一名,平均权重把第二名、第三名的份额也算进去,两个数一起看,才知道一个主题是集中在几个片段里,还是作为次要话题散在很多片段中。
TATOOLS 报告的【主题占比一览】按占比画条形图,条形旁边写着这个主题在多少个片段里占主导。【主题分析】里每个主题都有一个【占比】标签,鼠标停上去能看到平均权重。主题排序先看占比,占比相同再看平均权重。占主导的片段数为 0 的主题,在任何片段里都排不到第一,它的词仍然可能散在很多片段里。【这份结果说明了什么】按占比列出前 5 个主题,附上主题名和代表词。
13
一致性、PMI 和困惑度各量什么
一个主题的前几个词是【租金 房东 押金】,这几个词在材料里经常同时出现,读起来是一件事。另一个主题是【租金 学校 客服】,三个词很少同时出现,读起来像是拼凑的。一致性和 PMI 用词语共现来量这种差别,困惑度量的是模型对这批词有多意外。TATOOLS 报告【模型指标】里的三张卡片,分别对应这一节的三小节。
主题一致性
主题一致性(Topic Coherence)的几种指标都建立在点互信息(PMI,Pointwise Mutual Information,两个词一起出现的次数比偶然碰上多多少)上。
PMI(a, b) = log[ P(a, b) / (P(a) × P(b)) ]
NPMI(a, b) = PMI(a, b) / (−log P(a, b))
P(a) 是一个统计窗口里出现 a 的概率,P(a, b) 是 a 和 b 同时出现的概率。NPMI 把 PMI 缩放到 −1 到 1 之间,1 表示两个词总是一起出现,0 表示碰上的次数和随机一样。手算一个。
P(a) = 0.2,P(b) = 0.25,P(a, b) = 0.1
PMI = ln(0.1 / 0.05) = ln 2 ≈ 0.693
NPMI = 0.693 / (−ln 0.1) = 0.693 / 2.303 ≈ 0.301
| 指标 | 共现在哪里数 | 怎样汇总 | 大致范围 |
|---|---|---|---|
| c_v | 滑动窗口 | 每个词的 NPMI 向量与整组词向量的余弦,取平均 | 0 到 1 |
| c_npmi | 滑动窗口 | 词对 NPMI 取平均 | −1 到 1 |
| c_uci | 滑动窗口 | 词对 PMI 取平均 | 没有固定上下界 |
| u_mass | 整个片段 | 按词的排名顺序算条件概率的对数,取平均 | 通常是负数 |
c_v 由 Röder、Both 和 Hinneburg 2015 年提出,他们系统比较了各种一致性构造,c_v 和人工评分的相关最高。c_uci 来自 Newman 等人 2010 年的研究;u_mass 来自 Mimno 等人 2011 年的研究,只用本语料内部的共现就能算。
TATOOLS 工具页【主题一致性评估方法】可以选这四种,默认 c_v。报告【模型指标】里的整体一致性是所有主题一致性的平均,按选中的指标计算。不同指标的数值不能互相比较,比较几次运行时要固定同一种指标。
主题 PMI
TATOOLS 报告里每个主题还有一个【PMI(两个词一起出现的紧密程度)】标签。它把每个片段当成一个窗口,对主题前 10 个词两两算 PMI,再取平均。
PMI(a, b) = ln[ D(a, b) × N / (D(a) × D(b)) ]
D(a):含有 a 的片段数;D(a, b):同时含有 a 和 b 的片段数;N:片段数
N = 40,【租金】出现在 10 个片段里,【押金】出现在 8 个片段里,两个词同时出现在 6 个片段里。
PMI = ln(6 × 40 / (10 × 8)) = ln(240 / 80) = ln 3 ≈ 1.10
两个词同时出现的次数是随机碰上的 3 倍。从没在同一个片段里出现过的词对不计入平均。这个值可以是负数,也可以大于 1,和上面的 c_v 口径不同。【各主题 PMI(两个词一起出现的紧密程度)对比】把各主题的值画成条形图,【模型指标】里的【主题 PMI(两个词一起出现的紧密程度)均值】是所有主题的平均。
困惑度
困惑度(Perplexity)是语言模型的传统评价指标,衡量模型对这批词有多意外。
ℓ = (1 / N_w) × log p(全部词 | 模型)
困惑度 = exp(−ℓ)
N_w:全部词次
ℓ 是平均每个词的对数似然,LDA 算不出它的精确值,报告的是它的变分下界。ℓ = −6 时,困惑度 = exp(6) ≈ 403,模型预测每个词的难度,相当于从 403 个同样可能的词里猜一个。ℓ 越接近 0,困惑度越小,模型对这批词越不意外。
TATOOLS 报告【模型指标】里的【对数困惑度】就是 ℓ,通常是负数。它只在同一个文件、同一张词表内部可比,换了材料或改了词表设置,数值就不能拿来比较了。前面讲过 Chang 等人的评测,困惑度更低的模型主题反而可能更难读,TATOOLS 自动选主题数用的是一致性。Word2Vec 方式没有困惑度。
14
主题之间有多像,关键词是否独有
两个主题,一个是【租金 房东 押金 合同】,另一个是【租金 房东 中介 看房】,前两个词完全一样。两个主题重叠太多,往往是主题数设多了,同一个话题被拆成了两半。
主题相似度用两个主题的词分布之间的余弦相似度来量,范围是整张词表。
sim(i, j) = (φ_i · φ_j) / (‖φ_i‖ × ‖φ_j‖)
词表只有四个词时手算一次,φ_1 = (0.5, 0.3, 0.2, 0),φ_2 = (0.4, 0, 0.1, 0.5)。
φ_1 · φ_2 = 0.5 × 0.4 + 0.3 × 0 + 0.2 × 0.1 + 0 × 0.5 = 0.22
‖φ_1‖ = √0.38 ≈ 0.616,‖φ_2‖ = √0.42 ≈ 0.648
sim = 0.22 / (0.616 × 0.648) ≈ 0.55
TATOOLS 报告【主题关系】里的【主题相似度矩阵】列出所有主题两两的余弦相似度,按高低分三档着色,【这份结果说明了什么】会写出相似度最高的那一对。相似度高的一对主题,可以把主题数调小一档再跑一次,看它们会不会合成一个。
关键词唯一性从另一面看同一件事。
唯一性_k = 1 − (1 / (K − 1)) × Σ_(j≠k) |T_k ∩ T_j| / |T_k|
T_k:主题 k 的前 10 个词
K = 3,主题 1 的前 10 个词里有 2 个也在主题 2 的前 10 个词里,和主题 3 没有重合,唯一性 = 1 − (0.2 + 0) / 2 = 0.9。【主题分析】每个主题卡片底部把【关键词唯一性】和另外两个数放在一起。【片段覆盖度】是这个主题概率不低于 0.1 的片段所占比例。【代表词共现率】看前 5 个词两两组成的 10 对,至少在一个片段里同时出现过的对数占多少。
【主题占比 × PMI 四象限】把占比放在横轴、PMI 放在纵轴,用两项的中位数画出四个象限。右上角的主题占的片段多,代表词又常在一起出现,是材料里分量重、轮廓清楚的主题。落在右下角的主题,代表词很少一起出现,占的片段却不少,值得回到代表性原文看看它是不是几件事混在了一起。
15
每个片段归到哪个主题
一个片段的主题比例是 (0.52, 0.45, 0.03),它归到主题 1,主题 2 只差 7 个百分点。这样的片段往往同时谈两件事,读原文时最值得看。
TATOOLS 报告的【片段归类表】每行一个片段,列出【主导主题】【主导概率】和【第二主题】,可以按主题筛选,完整表格能下载成 CSV。【文档-主题流向】把片段按原文顺序分成几组,画出每组片段流向哪些主题,色带宽度是片段数。旁边的【平均主导概率】越高,片段越集中在单个主题上;【出现过的主导主题】数出至少在一个片段里排第一的主题有几个。
【主题在片段序列中的分布】按片段在原文里的先后,记录每个主题占过主导的片段区间和次数,以及它在这些片段里的平均概率。它反映主题在文本里的位置,一份访谈稿前半段谈什么、后半段谈什么,从这里能看出来。【集中度统计】里的【单主题片段】是只有一个主题的概率达到 1% 的片段,【高集中主题】是在它主导的片段里平均概率超过 80% 的主题。
16
上传多个文件时怎样对照
TATOOLS 为每个文件单独建模,报告一次显示一个文件,用【选择查看的文件】切换。多文件的报告多出两块内容。
【整体分析概览】汇总所有文件的片段数和主题总数,给出平均一致性和平均对数困惑度。跨文件的对照卡片把各文件并排放在一起,列出平均主题数、各文件每个主题的前 5 个关键词和各文件的整体一致性,还用两个数描述每个文件内部主题之间关键词重复得多不多。
重复率 = 1 − 不重复关键词数 / 关键词总数
主题间差异度 = 1 − 主题两两之间关键词重合比例的平均值
重合比例 = |T_i ∩ T_j| / |T_i ∪ T_j|
一个文件有 4 个主题,每个主题 10 个关键词,共 40 个,其中不重复的有 34 个,重复率 = 1 − 34 / 40 = 15%。
各文件的主题编号各自独立,对照时看关键词和主题标签。文件 A 的主题 2 和文件 B 的主题 5,前 5 个词有 3 个相同,它们谈的很可能是同一件事。也可以在【向这份材料提问】里直接问两份文件的主题有什么不同,报告给出的起手问题里就有这一条。
17
直接向材料提问
读完报告,手里常常还有具体问题,比如受访者谈到租房时最常抱怨什么,某个主题还有哪些原文。TATOOLS 报告里的【向这份材料提问】可以直接问,回答只依据这次上传的材料,每句结论后面用编号标出原文出处,点开就能对照。占比和排名这类数字直接取自任务结果。
检索增强生成(Retrieval-Augmented Generation,RAG,先找原文再回答)由 Lewis 等人 2020 年提出,追问按这个思路来做。任务完成时,每个片段已经建好检索索引,每个主题的片段数、占比和排名也已算好,还配了一句内容概括。问题里写【主题 N】或者主题名,TATOOLS 就知道你问的是哪个主题;每个主题卡片上的【就这个主题提问】按钮,会把【主题 N】自动填进输入框。上传了多个文件时,写成【文件名 · 主题 N】。
18
工具页上的设置一览
TATOOLS 工具页从上到下的设置如下表,【专业模式】里的设置按向量化方式显示。
| 设置 | 在哪里显示 | 范围或选项 | 默认 |
|---|---|---|---|
| 普通模式、专业模式 | 始终 | 两种 | 普通模式 |
| 文档主要语言 | 始终 | 中文、英文 | 中文 |
| 分析场景 | 始终 | 自定义和五个预设 | 自定义(不预设) |
| 提取的主题数量 | 始终 | 自动 3 到 12,手动 2 到 20 | 自动 |
| 文本向量化方式 | 专业模式 | 词袋、语义向量、Word2Vec | 词袋 |
| 保留词性类型 | 词袋、Word2Vec | 名词、动词、形容词、副词 | 名词 |
| 过滤功能词(单字、纯数字) | 词袋、Word2Vec | 开、关 | 开 |
| 自定义词典、自动补充词典、自定义停用词 | 词袋、Word2Vec | 自己填写,自动补充词典只用于中文 | 空 |
| 词形合并 | 词袋、Word2Vec | 一行一组 | 空 |
| 最低词频要求 | 词袋、Word2Vec | 1 到 10 | 2 |
| 最高词频比例 | 词袋 | 10% 到 100% | 80% |
| 启用词组分析(N-gram) | 词袋 | 词组长度最长 5 个词,最少出现次数 1 到 10 | 关 |
| TF-IDF 智能过滤 | 词袋 | 最低阈值 0.001 到 0.1,最高阈值 0.5 到 1 | 关 |
| 词向量维度 | Word2Vec | 50 到 300 | 100 |
| 上下文窗口大小 | Word2Vec | 3 到 15 | 5 |
| Word2Vec 最小词频 | Word2Vec | 1 到 10 | 1 |
| 主题一致性评估方法 | 专业模式 | c_v、c_npmi、c_uci、u_mass | c_v |
| 语料库迭代次数 | 词袋 | 1 到 50 | 10 |
| 每文档迭代次数 | 词袋 | 1 到 1,000 | 50 |
| Alpha | 词袋 | 自定义 0.01 到 1、对称、自动 | 自定义 0.1 |
| Beta | 词袋 | 0.01 到 1 | 0.01 |
按研究需要调参数,可以从下面几种情况入手。
| 想要的效果 | 先调哪个设置 |
|---|---|
| 主题分得更粗,先看大块 | 关掉自动,手动指定较小的主题数 |
| 主题分得更细,看子话题 | 关掉自动,手动指定较大的主题数 |
| 主题词里少出现泛泛的词 | 补进【自定义停用词】,或调低【最高词频比例】 |
| 专有名词被切碎 | 【自定义词典】或【自动补充词典】 |
| 同一个说法的几种写法合成一个词 | 【词形合并】 |
| 动作和评价也要进主题 | 【保留词性类型】加上动词和形容词 |
| 每段话更集中在一两个主题上 | 调小【Alpha】 |
| 每个主题更集中在少数几个词上 | 调小【Beta】 |
| 短评论分出的主题太散 | 换成【语义向量(Embedding)】 |
| 两个主题几乎一样 | 调小主题数 |
19
把结果写进论文
TATOOLS 报告的【主题编码本】把每个主题的编号和标签放在一张表里,旁边列出前 5 个代表词、占比和 PMI,可以下载 CSV 或 Markdown 版本,当作编码表的初稿。【片段归类表】的 CSV 列出每个片段的主导主题和第二主题。方法部分要交代的参数,在【模型训练参数】里都能找到。
Roberts 等人 2014 年用结构主题模型分析问卷开放题,先让模型给出主题,研究者读代表性回答后给主题命名,再用主题比例做后续分析。LDA 的结果写进论文,也常走这条路径。下面是一段方法部分的写法示例,方括号里换成自己的数字。
本研究使用 TATOOLS 的高级LDA主题模型(Blei 等,2003)分析 [文件数] 份文本。每份文本单独建模,按段落切分为片段,共得到 [片段数] 个片段。分词后保留 [名词] 并去除停用词,按词频与片段频率过滤后建立词袋,词表共 [词数] 个词。模型用变分贝叶斯估计,α = [值],β = [值],遍历语料 [次数] 次。主题数在 3 至 12 之间自动选择,排除份额过小的退化主题后取 c_v 一致性最高者,最终为 [K] 个。研究者对照各主题的高概率词与代表性原文逐一命名,主题规模以片段的主导主题比例表示。
20
小结
LDA 假设每个片段由几个主题按比例 θ 混合写成,每个主题是词表上的一组概率 φ,两组概率都从词语在片段里一起出现的规律估计出来。
α 管一个片段集中在几个主题上,β 管一个主题集中在几个词上,两者在估计时都相当于预先垫上的虚拟计数。
TATOOLS 把每个文件切成片段、单独建模,片段数是所有占比的分母;想让多个文件共用一套主题,用【经典LDA主题建模】。
进入模型的词要经过词性、停用词、词频和 TF-IDF 几道筛选,这些设置会改变主题,写论文时一并报告。
自动定主题数先用份额排除退化主题,再取一致性最高的 K。
词袋方式按共现建模,语义向量方式用意思相近的片段补充关键词,Word2Vec 方式把从上下文学出的词向量分组。
占比只数第一名,平均权重把次要份额也算上;c_v 等一致性量主题词是否常一起出现,困惑度只在同一文件内部可比。
主题标签和代表性原文帮助给主题命名,片段归类表和追问帮助回到原文核对。
同一批材料想换个角度看,可以用 TATOOLS 的【BERTopic 主题聚类】按语义把片段聚成主题,和 LDA 的结果对照;正式建模前想先比较几个主题数,可以用【LDA主题数评估】。
21
资料来源
Griffiths 与 Steyvers:Finding Scientific Topics,PNAS,第 101 卷增刊 1,2004
Hoffman、Blei 与 Bach:Online Learning for Latent Dirichlet Allocation,NeurIPS,2010
Wallach、Mimno 与 McCallum:Rethinking LDA: Why Priors Matter,NeurIPS,2009
Chang、Boyd-Graber、Gerrish、Wang 与 Blei:Reading Tea Leaves: How Humans Interpret Topic Models,NeurIPS,2009
Newman、Lau、Grieser 与 Baldwin:Automatic Evaluation of Topic Coherence,NAACL-HLT,2010
Mimno、Wallach、Talley、Leenders 与 McCallum:Optimizing Semantic Coherence in Topic Models,EMNLP,2011
Röder、Both 与 Hinneburg:Exploring the Space of Topic Coherence Measures,WSDM,2015
Reimers 与 Gurevych:Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks,EMNLP-IJCNLP,2019
Sia、Dalmia 与 Mielke:Tired of Topic Models? Clusters of Pretrained Word Embeddings Make for Fast and Good Topics too!,EMNLP,2020
MacQueen:Some Methods for Classification and Analysis of Multivariate Observations,Proceedings of the Fifth Berkeley Symposium on Mathematical Statistics and Probability,1967
Mei、Shen 与 Zhai:Automatic Labeling of Multinomial Topic Models,KDD,2007
Lau、Grieser、Newman 与 Baldwin:Automatic Labelling of Topic Models,ACL,2011
Lewis 等:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,NeurIPS,2020
END
