跳到主要内容

不训练也能干活 — 一整排对照实验,和给一堆散文字自动分堆

这一章讲三件事: 拿到一个新任务,第一步该试什么(答案是:什么都别训); 一堆没人整理过的文字,怎么让机器自己分好堆并给每堆起个人话名字; 以及一个贯穿全书的顺序——能不训练就不训练。 在全书链条里,这一章是方法论的落点:前三章讲机器怎么转,这一章讲你该怎么用。 需要先读第 01、02 章,其余生词都在当场解释。

1. 先看现象:同一个任务,五种做法,分数摆在一起

这一节回答:「要不要训练」这个问题,到底值多少分。

书拿了一个再普通不过的任务:一万多条电影短评,判断是夸还是骂1

这类任务书里叫「分类」——给一段文字贴上一个类别标签。 日常见到的垃圾邮件识别、工单归类、意图识别、语言检测,全是它。 而这个具体任务(判断一段话是夸还是骂)有个专门叫法,就叫情感分析

这次的情感分析只有「好评/差评」两个选项。只在两个选项里挑一个的分类,叫二分类2

书没有把结果排在一起,但它们其实是一整排对照。 我们替它排好:

#做法要不要训练要不要标注得分
1找一个别人已经练好、专门判断褒贬的现成模型,直接用不用不用0.80
2用「读懂型」把每条评论变成一串数,在这串数上面套一个最简单的判别器只练那个判别器,几秒钟0.85
3只写下「一条负面影评」「一条正面影评」这两句话,比谁离得近不用不用0.78
4找一个「会写型」的小模型,在评论前面加一句「下面这句是正面还是负面?」不用不用0.84
5换成当时最好的商业模型,同样加那一句不用不用0.91

这张表比书里任何一段论述都有用。 但要读懂它,得先知道那个「得分」是什么。

「标注」这个词后面天天用,现在讲掉:

标注 = 人工一条条给出标准答案。 它是这一行最贵、最慢、最容易出错的一步—— 书的原话是「获取标注数据是一项资源密集型任务,可能需要大量人力」3上面第 3 行「不用标注」这三个字,是这张表真正的重点。

2. 顶层全景:两条线,取决于你手上有没有标准答案

你有一堆文字,想让机器帮你整理

├── 你已经知道要分成哪几类(比如「好评/差评」)
│ └──▶ 【分类】 有标准答案就能量分数,所以能做对照实验
│ 第 1 节那张表,就是这条线上的五种做法

└── 你不知道里面有几类、也不知道叫什么
└──▶ 【聚类 → 主题建模】 三步流水线:
变成数 → 压扁 → 按扎堆程度分组 → 再给每堆起名字

图说:左边那条线有答案可对,右边那条没有。
**没有答案可对,是右边这条线所有麻烦的来源**——包括「怎么知道分得对不对」。

左边那条线,下面拿同一条影评从头走到尾:

「剧本烂透了,但女主的表演救回来一点。」

它的标准答案是差评(虽然后半句是夸的)。 五种做法各判一次,每一次我们都写出它手里那个数。 这条走查上的所有数值都是为演示编的,不是书里的实测值—— 书只公布了五个总分,没有公布任何单条样本的中间结果。

右边那条线换一个输入,因为书自己换了数据集(前半章是影评,后半章是论文摘要); 那条走查放在 3.7 与 3.11 节。

3. 核心原理

3.1 先学会读分数:四个指标和一张方格

这一节回答:0.80 和 0.85 差在哪儿;以及为什么不能只看「对了百分之多少」。

判断一次预测,有两个维度:猜没猜对,以及猜的是哪一类。两两组合,就是四种情况。 书把它们摆成一个方格,叫混淆矩阵4:

实际是「好评」 实际是「差评」
预测成「好评」 猜对了(真正例) 猜错了(假正例:冤枉了好人)
预测成「差评」 猜错了(假反例:漏了) 猜对了(真反例)

图说:两种错的性质完全不同。「冤枉」和「漏掉」在不同场景下代价差很多。

从这四格能算出四个数,书全都列了5头两个是一对,各讲一段。

精确率就是「我说是好评的这些里,真的有几成是好评」——分母是「我说了多少」。 所以精确率回答的是:我说出去的话有多可信。 它低,说明你冤枉了不少好人。

召回率就是「所有真好评里,被我找出来了几成」——分母是「本来有多少」。 所以召回率回答的是:我漏掉了多少。 它低,说明该找出来的你没找着。

剩下两个是把上面这一对合起来看的:

指标大白话它回答什么问题
准确率所有预测里,对的占几成整体正确程度
F1 就是「把精确率和召回率捏成一个数」得到的那个分数两者都好它才高「整体表现」,这一章用的就是它

把我们那条影评放进这张方格里: 它实际是差评。 做法一判它「差评」,所以它落在右下角那一格(真反例); 如果判成了「好评」,它就落到右上角(假正例)——冤枉了一条差评。 一条样本只会落进一格,四格数满了才能算分。

四格怎么变成一个 F1?拿一组编出来的数走一遍 (下面这四个数是为演示编的,不是书里的实测值)。 一万条测试影评跑完,四格分别是:真好评 4,300、假好评 700、假差评 800、真差评 4,200。

  • 精确率 = 4,300 ÷ (4,300 + 700) = 0.86——我说是好评的里头,八成六真是好评;
  • 召回率 = 4,300 ÷ (4,300 + 800) = 0.84——所有真好评里,我找出来了八成四;
  • F1 = 两者的调和平均 = 0.85——正好是第 1 节那张表里做法二的那一档。

为什么书用 F1 而不用准确率? 因为精确率和召回率会互相拆台: 你可以只在极有把握时才说「好评」,精确率很高,但会漏掉一大堆; 也可以见谁都说「好评」,召回率满分,但精确率很难看。 F1 逼你在两者之间取平衡。 书还特意说明它取的是加权平均,为了让每个类别被平等对待5

这一章往下所有分数,都是 F1。

3.2 做法一:找一个别人已经练好的现成模型

它解决什么问题: 我什么都不想干,有没有拿来就能用的?

它怎么做: 有。书管这种叫任务特定模型—— 它是一个表示模型(比如 BERT 那一支),被别人专门针对某个任务训练过6

书挑的是一个在推特上练过的情感分析模型。注意它挑的时候故意挑错了领域: 那个模型练的是推文,而任务是影评。书自己说明了动机—— 虽然它不是专门针对电影评论训练的,但探索该模型的泛化能力是很有趣的7

结果 0.80。 书的评价:对于一个没有专门在我们的领域数据上训练过的模型来说,这已经很棒了8

走查第一步:那条影评经过它,出来什么。 把「剧本烂透了,但女主的表演救回来一点。」原样喂进去,它吐出的是一个标签加一个把握程度: 差评,0.86这一条它判对了。 注意它连一次都没被训练过——你什么都没做,已经站在 0.80 上了。

这一步的实操难点其实不在技术,在选型。 书给了两个很实在的数字: 光是文本分类,现成的模型就超过六万个;产出嵌入的模型超过八千个9

书给的办法有两条:

  1. 先拿几个公认的方案跑一遍当起跑线,以后所有改进都跟它比;这条起跑线行话叫基线。 书列了六个 BERT 家族的模型当起点10;

  2. 看排行榜(就是把一批模型在同一套公开考题上的成绩挂出来排的那种榜),但别只看分数。 书的提醒值得抄下来—— 在实际解决方案中,推理速度的重要性不应被低估11

「排行榜」在这一行指的是:一群人商量好一批公开考题,大家把自己的模型跑一遍、 把成绩挂出来排队。 好处是可比,坏处见本章第 5 节。

补充(不在书里): 书反复提到的那个嵌入模型排行榜,背后是一套叫 MTEB 的公开考卷。 它覆盖的任务种类和语言数量都远超任何一张单项考卷(具体规模见脚注9), 而它的主要发现恰恰是一句泼冷水的话:没有哪一种嵌入方法在所有任务上都占优。 来源:《MTEB: Massive Text Embedding Benchmark》(Muennighoff、Tazi、Magne、Reimers,2022-10-13) https://arxiv.org/abs/2210.07316(查阅于 2026-08-25)

3.3 做法二:把文字变成数,再套一个最简单的判别器

这一节是全书最该背下来的起手式。

它解决什么问题: 找不到正好对口的现成模型,又不想训一个大家伙。

它怎么做: 拆成毫不相干的两步12:

① 用一个通用嵌入模型,把每条评论变成一串数(768 个)
模型全程「冻着」——一个参数都不动


② 把这串数当成这条评论的「特征」,喂给一个最普通的判别器,只训它

图说:第一步很贵但不用训,第二步很便宜但要训。**贵的那半可以白嫖。**

冻结:训练时把某些部分锁住,不允许它的数被改动。 书这里冻住的是整个嵌入模型13——所以上图第一步虽然要跑一个大模型,却一分钱训练费都不花。

特征:喂给判别器的那一组输入数值。这里就是那 768 个数,一个不多一个不少。

书用的判别器是逻辑回归——统计学里最老、最简单的一种二选一判别方法, 一台普通电脑几秒钟就能训完

分类器就是「判断这段文字属于哪一类」的那个小程序。 这是书用的名字; 本组文档在自己说话时叫它「判别器」,引用书里原话时保留「分类器」——两个名字同一样东西。

书特意说明:因为第一步冻着, 我们可以在 CPU 上训练一个分类器,如逻辑回归14,根本用不上显卡。

走查第二步:同一条影评在这一步长什么样。 「剧本烂透了,但女主的表演救回来一点。」过完嵌入模型,变成 768 个数; 前五个假设是 [0.02, -0.31, 0.14, 0.08, -0.22]。 把这 768 个数交给逻辑回归,它吐出两个数:差评 0.73 / 好评 0.27,所以判差评

注意这一步和上一步的分工: 那 768 个数完全没变过(模型冻着), 训出来的只有「768 个数 → 两个数」这一小段映射——几秒钟的事。

结果 0.85,是这五种做法里排第二的。

书还补了一条让它更彻底的做法:第一步也可以直接调用别人的接口来做, 这样整个流程就可以完全在 CPU 上运行15——一张显卡都不需要。

判断(我们的,不是书里的): 这一条应该当成新任务的默认第一步,而不是备选。 理由是它的失败成本极低:半小时之内你就知道「这个任务在现成表示上能到几分」, 而这个分数是你后面所有努力的地板。低于它的方案不必再考虑。 如果错,会错在: 如果任务的判据高度依赖领域内的细微差别 (医学、法律里的近义术语),通用嵌入可能压根分不开,这条地板会低到没有参考价值—— 那时该直接进第 08 章的微调。判据是:把几条你认为「明显不同类」的样本嵌入后比一比, 如果它们的距离和随机两条差不多,说明这个模型看不见你关心的区别。

3.4 做法三:一条标注都没有,怎么办

这一节是这一章最值得记住的一招。

它解决什么问题: 我连标准答案都没有,还要不要花人力去标?

书的回答很有工程感:先别标,先验证这事儿能不能成。

先讲一个词。零样本:一个例子都不给,直接让它干。 相对地,给一个例子叫「一样本」,给几个叫「少样本」——这三个词第 05 章还会用到。

书的原话是——我们可以先做零样本分类,即在没有标注数据的情况下探索任务是否可行16

它怎么做:一个非常聪明的绕法。

你没有标注数据,但你知道标签叫什么。那就——

├── 把标签也写成一句话:「一条负面电影评论」「一条正面电影评论」

├── 用同一个嵌入模型,把这两句话也变成两串数

└── 每条评论跟这两串数各比一次,离谁近就归谁

图说:**问题被换掉了。** 原本是「分类」,现在变成了「比距离」——
而比距离不需要任何标注数据。

「离得近」怎么算?

余弦就是三角函数里的一个数:两条线方向完全一致时它等于 1,互相垂直时等于 0。 这一节要比的「两条线」,就是两串数各自指向的方向。

点积就是把两串数逐位相乘、再全部加起来得到的那一个数。 它是算余弦时的中间产物,你不必会算,只要知道下面那个式子里有它。

书用的办法叫余弦相似度:它是两个向量之间夹角的余弦值,通过嵌入的点积除以它们长度的乘积来计算17

不用管这个式子。 记住它的性质就够: 它只看两串数「指向的方向」像不像,不看它们各自有多大。 方向完全一致得 1,毫无关系得 0。 这一行凡是说「两段文字有多像」,默认就是在说这个数。 它会一路用到第 06、07、08 章。

走查第三步:同一条影评,这次连模型都不用挑。 把两句标签也变成 768 个数,然后各比一次余弦:

跟谁比余弦
「一条非常负面的电影评论」0.42
「一条非常正面的电影评论」0.11

0.42 比 0.11 大,所以归差评。 三种做法到这里都判对了, 而这一种一条标注都没用过。

结果 0.78。 书的评价:考虑到我们根本没有使用任何标注数据,这相当令人印象深刻18

书还给了一条能免费再提一点的技巧,值得照抄: 不要写「一条负面/正面评论」,写**「一条非常负面/正面的电影评论」—— 这样嵌入里就带上了「这是电影评论」这个信息,而且会更关注两个标签的极端情况**19

换句话说:标签怎么措辞,本身就是一个可调的设定。 这是「不训练也能提分」的一个具体例子。

书在这里还做了一件很诚实的事,用一条注主动交代了自己的取舍: 它承认有专门做零样本分类的模型(基于自然语言推理的那一类)表现更好, 它选嵌入来演示,是为了展示嵌入在各种任务中的灵活性20

3.5 做法四和五:让「会写型」直接回答

它解决什么问题: 手上只有一个会写字的模型,能不能拿来做分类?

能,但要换个思路。 书点明了差别:这类模型接收文本、生成文本, 所以叫序列到序列模型;而任务特定模型是从一串词元生成一个数值21

所以你不能只把评论丢给它,得告诉它要干什么。 书的做法是在每条评论前面加一句话: 「下面这句是正面还是负面?」22

这个「加一句话来引导它」的动作,就叫提示工程。 书在这里第一次给出定义——提示工程是**「一遍一遍地改你写的那段话,以求更好的输出」的那个过程**23第 05 章整章讲它。

上面那句「一遍一遍地改」,行话叫迭代——每一遍都在上一遍的基础上接着改,不是推倒重来。

做法四用的是一个开源小模型,而且是最小的那一档(书说选最小的是为了跑得快)24结果 0.84 ——已经追平了要训练的做法二。

做法五换成当时最好的商业模型,结果 0.91,五种做法里最高25

走查第四、五步:同一条影评,这次它是「写」出答案的。 发进去的那段话是:

Is the following sentence positive or negative?
剧本烂透了,但女主的表演救回来一点。

它吐出来的不是一个分数,是一个词:negative 拿这个词去对标准答案「差评」,对上了记一分,对不上记零分—— 前三种做法输出的是数,这两种输出的是字,所以中间多了一道「把字翻回标签」的手续。 格式一乱这道手续就崩,那正是第 05 章 3.7 节要治的事。

但书紧接着写了这一章最诚实的一句话,必须原样带走:

由于我们不知道模型是在什么数据上训练的,我们不能轻易使用这类指标来评估模型。 据我们所知,它可能实际上是在我们的数据集上训练过的!26

这句自我拆台在同类书里很罕见。 它指出的问题今天更严重: 你用的公开数据集,很可能早就在别人的训练语料里了。 分数好看,不代表它真会。

顺带记一个成本数字: 跑完整个测试集(约一千条),花了 3 美分27。 书还提醒了接口调用会撞频率限制。先讲一个词:指数—— 这里说的是「每一步都乘上一个固定倍数」那种涨法,1、2、4、8 地翻上去,而不是 1、2、3、4。

通用的应对办法叫指数退避:撞限之后短暂休眠再重试, 还不行就把休眠时间按上面那种翻倍的涨法加长,直到成功或者放弃28

3.6 这张阶梯真正在说什么

回到第 1 节那张表。它有三条读法:

第一条,也是最重要的一条:第 3 行(0.78)是一条「零成本地板」。 一分钱不花、一条标注不要,你已经站在 0.78 上了。 这意味着任何方案在提案时都得回答:你比 0.78 好多少,多花了多少?

第二条:第 2 行(0.85)说明「贵的那半可以白嫖」。 你不必训一个大模型,只需要在别人训好的表示上训一个几秒钟就能好的小东西。

第三条:第 5 行(0.91)是天花板,但它是别人的天花板。 它贵、数据要出门、不能改,而且那个分数还未必可信(见上面那句自我拆台)。

所以「先不训练」不是懒,是一个把不确定性前置的顺序: 先花半小时知道地板在哪儿,再决定要不要花两周去够天花板。

书还夹了一条容易被跳过、但非常重要的提醒: 它建议把这些做法与经典且强大的基线方法进行比较,比如用最老的词频办法表示文本、 再训一个逻辑回归29

换句话说:那条地板可能比 0.78 还低一层,而且更便宜。先量一量再说。

3.7 另一半:没有标准答案的时候

从这里开始换一条线。

它解决什么问题: 你有四万篇论文摘要,不知道里面有几个主题,也不知道叫什么。

书用的数据很具体:1991 到 2024 年之间,某学术平台「计算与语言」板块的 44,949 篇摘要30

它怎么做:三步,而且这三步是各自独立的零件31:

① 嵌入:每篇摘要 → 一串数(书用的模型给 384 个)


② 降维:384 个数压成 5 个


③ 分堆:按「哪些点扎在一起」把它们分组

图说:三步各用各的算法,可以单独替换。这条性质在 3.10 节会变成一个大优点。

聚类就是「让机器自己把相似的东西归到一起」——事先不告诉它有几类,也不告诉它类叫什么。 书的定义:根据文本的语义内容、含义和关系将相似的文本分组32它和分类的区别只有一条:分类有一张事先定好的标签清单,聚类没有。

书还列了聚类除「分类」之外的几个用途,都很实用: 发现离群点(就是「跟谁都不像、孤零零落在外面的那些点」)、加速标注,以及发现被标错的数据33

最后一条值得停一下:如果一堆本该同类的东西里混进了一条离群的, 那条很可能是标错了。这是一个非常便宜的数据质检手段。

3.8 为什么中间非要加一步「降维」

这一节回答:为什么不能拿 384 个数直接分堆。

书给的理由是一句很关键的话:

随着维度的增加,每个维度中可能的取值数量呈指数增长, 找到每个维度内的所有子空间变得越来越复杂34

大白话:数一多,所有点之间的距离都会变得差不多,「谁离谁近」这件事就没了区分度。

所以第二步是降维——用更少的数表示同样的数据,同时尽量保住原来的整体结构35

书点名了两种方法,并说明了自己的选择理由:

先讲一个词:非线性说的是「数据的形状不是一块平板,而是卷曲的」—— 像一张揉皱的纸,直接拿尺子量两点之间的直线距离是错的,得沿着纸面量。

方法书的评价
主成分分析(PCA)经典做法
UMAP书选它,理由是通常比 PCA 更好地处理非线性关系和结构36

书在这里加了一条很诚实的注(先讲一个词:高维就是「每个数据点用很多个数来描述」——384 个数就是 384 维):

降维技术并非完美无缺。它们无法在低维表示中完美地捕获高维数据。 这个过程总会丢失信息。37

几个实操设定,书给了经验值,可以直接抄: 压到 5 到 10 维之间通常能有效抓住整体结构;点与点的最小距离设成 0, 因为这通常会产生更紧密的聚类;距离用余弦而不用直线距离, 因为基于欧几里得的方法在处理高维数据时会遇到问题38

3.9 为什么用「按密度分堆」而不是「预设几堆」

这一节回答:一个看起来是技术细节、其实是产品决策的选择。

书把两类算法的区别讲得很清楚39:

按中心点分堆(如 k-means)按密度分堆(书选的)
要不要先说有几堆要,你得先猜一个数不要,它自己算出来
每个点都要归堆吗是,所有点必须属于某一堆不是,可以判为「哪堆都不属于」

第二行才是关键。 那些「哪堆都不属于」的点叫离群点——书的措辞是: 它们不会被分配或强制属于任何聚类,换句话说,它们被忽略40

为什么这条重要? 书给的理由很实在: 由于这批论文可能包含一些冷门论文,使用能够检测离群点的模型可能会有所帮助41

换句话说:强行给每个点找个堆,等于往每一堆里掺沙子。

书用的算法叫 HDBSCAN,它的性质是能找到密集的小簇,而无需明确指定聚类数量42。 在那四万多篇摘要上,它自己算出了 156 个堆43; 想要更多堆就把「一堆最少要几个」这个设定调小44

分完之后书做了人工检查——这一步不是可选的。 它从第 0 堆随机抽了三篇, 发现全是关于手语翻译的45

而且书在可视化那里又强调了一次,措辞很重:

用降维来画图会丢信息,它只是对原始嵌入的一个近似表示, 可能把聚类推得更近或拉得更远,与实际情况不符。因此, 人工评估(即我们自行检查聚类)是聚类分析的关键组成部分46

这是「没有标准答案」这条线的根本代价:你没法量分数,只能自己去看。

3.10 从「分好堆」到「起好名字」

它解决什么问题: 156 堆摆在那儿,一堆一堆点开看太慢了。

书的做法是:给每堆挑几个最能代表它的词。 这件事有个名字叫主题建模47

主题建模 = 在一大堆文档里找出「里面都在谈些什么」。 传统做法不给一个名字,而是给一串关键词,让你自己看着理解48

在往下讲之前,先把这套流水线的名字点出来,因为它牵着一件你该知道的事:

书用来做主题建模的那套工具叫 BERTopic;3.13 节那个「按语义重排关键词」的做法, 则来自另一个提关键词的工具,叫 KeyBERT这两个都是本书作者之一 Maarten Grootendorst 自己写的东西—— 书末的参考文献里,两条都署着他的名字49

这不是说它们不好。 但要知道:书对这两个工具的推荐,背后没有任何独立第三方的对比。 下面几节读到「它很好用」这类话时,把这一点放在心上;本章第 4 节末尾会再说一次。

经典办法(比如一种叫「潜在狄利克雷分配」的方法)的做法是: 假设每个主题对应词表上的一个概率分布(就是给每个词各分一个可能性,全部加起来正好等于 1), 给每个词按「跟这个主题多相关」打分50

但书指出了它的软肋: 这类方法通常使用词袋技术作为主要特征, 而这种技术不考虑单词和短语的上下文或含义51

但这里要补一级台阶,不然下一句读不通:词袋不懂意思这件事,只在「分堆」这一步致命。 分堆要判断的是「这两篇是不是在讲同一件事」,不懂意思就一定分错; 而「起名字」本来只是从一堆文档里挑几个最有代表性的词,挑词根本不需要懂意思—— 词袋不但够用,而且比任何一个嵌入模型都快得多。

所以书要讲的那套做法不是二选一,是分工:分堆交给懂意思的嵌入,起名交给不懂意思但飞快的词袋。 它分两半52:

前一半:嵌入 → 降维 → 分堆 ← 就是 3.7 节那三步,负责「按意思分」


后一半:在每一堆里数词频 ← 最老的办法回来了,负责「起名字」

图说:新办法负责分堆(它懂意思),老办法负责起名(它快)。各干各最擅长的。

3.11 数词频这件老手艺,做了两处改动

第一处改动:不在单篇文档里数,在整堆里数。

书说得很直接:词的频率不是仅在单个文档中计算,而是在整个聚类中计算53因为我们关心的是「这一堆讲什么」,不是「这一篇讲什么」。

第二处改动:给「哪儿都出现的词」降权。

问题很明显:「的」「我们」「the」这类词到处都是,数出来永远最高, 可它们对文档的实际含义贡献甚微——这类词有个统称叫停用词54

解法:一个词的最终分数 = 它在这一堆里出现得多不多 × 它是不是只在这一堆里出现。

这套加权的通用名字叫 TF-IDF;书用的是它的按堆版本,叫 c-TF-IDF。三个部件,一个一个拆55:

部件全称大白话
cclass(类)按堆算,不按篇算
TFterm frequency(词频)这个词在这堆里出现了多少次
IDFinverse document frequency(逆文档频率)越是「到处都有」的词,这个值越小

两者相乘,结果就是:在这堆里常见、在别的堆里少见的词,分数最高。 而「到处都有」的停用词,会被第二项自动压下去。

右边那条线的走查:一篇摘要走完全程。 书跑的是 44,949 篇论文摘要,第 0 堆它抽查过——全是关于手语翻译的45。 拿其中一篇走一遍(下面的数值和词是为演示编的,书只公布了「第 0 堆是手语翻译」这一条):

这一步这篇摘要在这一步的样子
① 嵌入384 个数
② 降维压成 5 个数,比如 [1.8, -4.2, 0.6, 2.9, -1.1]
③ 分堆它周围挤着两百多个点,于是被归进第 0 堆
④ 数词频第 0 堆里 sign 出现 3,140 次,而the出现 41,000 次
⑤ 给到处都有的词降权the 在 156 堆里堆堆都有,被压到几乎为零;sign 只在这一堆多,分数最高
⑥ 出关键词sign · language · translation · gloss · deaf

第 ⑤ 步就是这套老手艺今天还在用的全部理由:它不懂意思,但它算得飞快, 而且「起名字」这一步本来就只需要挑词。

3.12 模块化:这套东西为什么能一直用下去

这一节讲的是一个设计性质,而不是一个算法。

关键性质:分堆和起名这两步基本上是互相独立的—— 书的原话是使用 c-TF-IDF 时,我们并不依赖于聚类文档时使用的模型56

后果:每个零件都能单独换。

书自己打的比方很好用:你可以把这种模块化视为搭乐高积木, 流程的每个部分都可以完全替换为另一个类似的算法57。 它举的例子是:不想要离群点,就把按密度分堆换成按中心点分堆58

而这个性质带来的真正好处是:

随着这一行不断出新模型,这套流水线不用重写——把嵌入那一格换掉就行。57

判断(我们的,不是书里的): 这条设计性质比这一章任何一个具体算法都值钱。 凡是「一整套流程绑死在一个模型上」的方案,在这个领域的更新速度下都活不过两年。 挑工具时应该先问:换掉其中一格,要不要重跑全部? 如果错,会错在: 如果某种端到端的做法(整条链一起训)在效果上大幅领先, 那模块化就成了要付出代价的洁癖。判据是:端到端方案的收益, 有没有大到值得每次换模型都重训一遍。

3.13 起名字的三种办法,以及它们各自的毛病

数词频挑出来的关键词还不够好。书给了三层递进的改进,每一层都有明确的代价59:

办法它干什么代价 / 毛病
只数词频挑出这堆里得分最高的那些词会挑出停用词;不懂意思
按语义重排把候选词和「这堆的平均意思」比一比,重新排名次会把行业缩写误删——书举了一个例子:代表「神经机器翻译」的缩写被移除了,而对于领域专家来说,这些缩写非常有信息量60
按多样性重排从一批候选词里挑出「互相不重复」的一小组治的是冗余:同一堆里同时出现 summaries 和 summary 属于浪费格子61
让生成模型起名把几篇代表性文档 + 关键词交给它,让它吐一个短标签可能起得过于宽泛——书举的失败例子是一个小模型给出了「科技类」这种没信息量的标签62

最后一行有一个成本上的精妙之处,值得单独说:

不是让生成模型去读几百万篇文档,而是让它只对几百个「堆」各起一次名。 书的原话:表示块只需要对每个主题应用一次,而不是对每个文档应用一次63

这是「让贵的模型只干最少的活」这个思路的一个标准范例,值得迁移到别处。

具体给它看什么?书说得很清楚:每堆挑约 4 篇最有代表性的文档 + 那堆的关键词64

书最后的建议很实在:别只留一种。 没有模型是完美的,通常建议生成多个主题表示,同一堆可以同时挂着几套不同的说法, 从不同角度观察同一个主题65

4. 作者的判断与证据

这一节把「书里给了证据的」和「书里只是断言的」分开。

说法属于哪一类说明
五种做法的那一排分数有实测同一数据集、同一测试集、同一指标,五个数都是跑出来的1
「商业模型 0.91 这个分数不可信」作者主动坦白「据我们所知,它可能实际上是在我们的数据集上训练过的」26
冻住嵌入模型 + 训一个轻判别器就够用有实测0.85,而且明说可以只用 CPU14
零样本能到 0.78有实测但书没有给出「换一个数据集还成不成立」的证据
「用更具体的标签措辞会更好」建议,没有实测书的原话是「试一试,看看它如何影响结果」19
降维必然丢信息、人工检查必不可少作者主动坦白,而且说了两遍一次在讲降维时,一次在讲可视化时3746
模块化是这套流水线的核心优点设计主张有例子(换掉分堆算法),没有对照实验57
「按语义重排会误删行业缩写」有实例书自己举了缩写被删的例子,这是一处难得的自我拆台60

但这一章有一处沉默值得警惕: 书从头到尾用来做主题建模的那套工具(BERTopic), 以及它用来提关键词的那个工具(KeyBERT),都是本书作者之一的作品49。 书里没有和任何同类方案做过对比,也没有像对待商业模型那样对它们提出质疑。

判断(我们的,不是书里的): 这不构成「书写错了」——那套流水线的每一步都有独立的理由, 而且拆开看全是通用零件。但它构成一处该由读者自己补的空白: 书对 BERTopic 和 KeyBERT 的推荐没有独立证据支持,你应该把它当成推荐,不是结论。 如果错,会错在: 如果在独立评测里它们确实优于同类方案,那这就不是利益相关, 只是作者恰好写了两个好工具——书里没给对比,我们无从判断。

5. 边界与局限

第一,那五个分数是 2024 年的模型给的,今天要重测。 尤其第 4、5 行: 免费小模型这两年进步最大。但阶梯的形状——「不训练已经能到接近八成」——大概率没变。

第二,这一章的「分类」全是二选一,书没有碰更难的情况。 多标签(一条评论同时属于好几类)、类别极不平衡(一万条里只有十条是欺诈)、 层级类别(大类下面还有小类)——这三种真实世界最常见的麻烦,一个都没讲。

第三,评测的可信度问题书点了一句就过去了。 「模型可能在我的数据上训练过」这句话应该引出一整节「那你该怎么建自己的评测集」, 但书没有写。 这是全书最大的一处缺口(第 09 章还会再遇到一次)。

第四,聚类那条线没有量化的成功标准。 书老老实实说了「只能人工检查」,这是诚实的; 但它没有给任何一条「怎么判断分得好不好」的可操作建议—— 比如怎么抽样检查、抽多少、什么情况下该回头调设定。

第五,零样本那一招有一个书没提的前提。 它成立的前提是标签能用一句自然语言描述清楚。 「正面/负面影评」很好描述,而「符合我们公司 2024 版售后规程第 3 条」就没法描述—— 这时零样本会直接失效,而书没有交代这条边界。

判断(我们的,不是书里的): 判断零样本能不能用,有一个三十秒的自测: 把你的标签写成一句话,拿给一个完全不了解你业务的人看,他能不能据此判对? 能,零样本大概率能用;不能,那模型也不能——因为你给它的信息和给那个人的一样多。 如果错,会错在: 如果标签的判据其实藏在数据本身的分布里 (比如「这类工单历史上都由 A 组处理」),那人和模型都读不出来, 但从标注数据里能学出来——那时该走做法二,而不是做法三。

6. 可带走的

  1. 新任务的第一步不是训练,是量地板:零样本大约半小时,你就知道「什么都不干能到几分」;
  2. 「一条标注都不要,接近八成」——这是这一章最该记住的一个数;
  3. 默认起手式是「冻住的嵌入模型 + 一个几秒钟就能训好的轻判别器」,连显卡都不用;
  4. 看 F1,别只看准确率:精确率管「我说的可不可信」,召回率管「我漏了多少」,F1 逼你平衡;
  5. 两种错的代价不一样:冤枉和漏掉,在不同业务里差价很大,选指标前先想清楚;
  6. 零样本的诀窍是「把标签也变成一串数」,然后比距离——问题从「分类」被换成了「比距离」;
  7. 标签怎么措辞是一个免费的设定:写「一条非常负面的电影评论」比写「一条负面评论」更好;
  8. 余弦相似度只看方向,不看长短,后面三章都在用它;
  9. 公开分数可能不可信——你的测试集很可能早就在别人的训练数据里了。书自己承认了这一点;
  10. 挑模型别只看榜首,推理速度在真实系统里同样重要;而且没有哪种嵌入方法在所有任务上都占优;
  11. 没有标准答案那条线的三步:嵌入 → 降维 → 按密度分堆;
  12. 必须降维,因为数一多,「谁离谁近」就失去了区分度;而降维一定会丢信息;
  13. 优先用「按密度分堆」,因为它不用你先猜有几堆,而且允许「哪堆都不属于」——强行归堆等于掺沙子;
  14. 离群点本身有价值:它们常常就是标错的数据;
  15. 起名字用最老的数词频办法就够,只做两处改动:按堆算、给到处都有的词降权;
  16. 让贵的模型只干最少的活:给几百个堆各起一次名,而不是读几百万篇文档;
  17. 模块化比算法更值钱:挑工具先问「换掉其中一格,要不要重跑全部」;
  18. 聚类没有分数可量,只能人工看——书说了两遍,这是这条线的根本代价。

7. 原文地图

主题原书章原文位置
分类的用途范围文本分类text/06-fm.txt:5(搜「情感分析和意图检测」)
数据集:一万条影评文本分类text/06-fm.txt:27(搜「5,331」) · text/06-fm.txt:75(搜「二分类情感分析」)
建议与经典基线对比文本分类text/06-fm.txt:23(搜「逻辑回归分类器」)
任务特定模型 vs 嵌入模型文本分类text/06-fm.txt:79(搜「任务特定模型或使用嵌入模型」) · text/06-fm.txt:83(搜「任务特定模型是一种表示模型」)
保持模型冻结文本分类text/06-fm.txt:85(搜「冻结」)
六万个分类模型、八千个嵌入模型文本分类text/06-fm.txt:93(搜「60,000」)
仅编码器模型体积小文本分类text/06-fm.txt:95(搜「体积要小得多」)
六个可靠基线文本分类text/06-fm.txt:101(搜「可靠的基线」)
推特模型跨领域用文本分类text/06-fm.txt:115(搜「探索该模型的泛化能力」)
排行榜与推理速度文本分类text/06-fm.txt:117(搜「推理速度的重要性不应被低估」)
混淆矩阵与四个指标文本分类text/06-fm.txt:202(搜「混淆矩阵」) · text/06-fm.txt:206(搜「精确率、召回率、准确率和 F1 分数」)
做法一得分 0.80文本分类text/06-fm.txt:220(搜「我们的预训练 BERT 模型给出的 F1 分数为 0.80」)
两步方法、CPU 上训逻辑回归文本分类text/06-fm.txt:232(搜「两步方法」) · text/06-fm.txt:236(搜「在 CPU 上训练一个分类器」)
768 维、做法二得分 0.85文本分类text/06-fm.txt:258(搜「(8530, 768)」) · text/06-fm.txt:292(搜「0.85 的 F1 分数」)
用外部接口做嵌入,全程 CPU文本分类text/06-fm.txt:296(搜「完全在 CPU 上运行」)
标注很贵、先验证可行性文本分类text/06-fm.txt:300(搜「资源密集型任务」) · text/06-fm.txt:302(搜「零样本分类」)
把标签写成一句话文本分类text/06-fm.txt:306(搜「这是一条负面电影评论」)
余弦相似度的定义文本分类text/06-fm.txt:315(搜「夹角的余弦值」)
做法三得分 0.78文本分类text/06-fm.txt:350(搜「0.78 的 F1 分数」)
更具体的标签措辞文本分类text/06-fm.txt:354(搜「A very negative/positive movie review」)
为什么用嵌入而不用专门的零样本模型文本分类text/06-fm.txt:348(搜「自然语言推理模型」)
序列到序列、提示工程的定义文本分类text/06-fm.txt:358(搜「序列到序列模型」) · text/06-fm.txt:364(搜「提示工程」)
加的那句提示、选最小的模型文本分类text/06-fm.txt:405(搜「Is the following sentence positive or negative?」) · text/06-fm.txt:401(搜「最小的以加快速度」)
做法四得分 0.84文本分类text/06-fm.txt:468(搜「0.84 的 F1 分数」)
做法五得分 0.91 与那句自我拆台文本分类text/06-fm.txt:590(搜「0.91 的 F1 分数」) · text/06-fm.txt:590(搜「它可能实际上是在我们的数据集上训练过的」)
3 美分、指数退避文本分类text/06-fm.txt:551(搜「3 美分」) · text/06-fm.txt:557(搜「指数退避」)
聚类的定义与用途文本聚类与主题建模text/07-fm.txt:7(搜「将相似的文本分组」) · text/07-fm.txt:11(搜「发现错误标注的数据」)
数据集:四万多篇摘要文本聚类与主题建模text/07-fm.txt:23(搜「44,949」)
三步流水线文本聚类与主题建模text/07-fm.txt:43(搜「三个步骤和算法」) · text/07-fm.txt:73(搜「(44949, 384)」)
高维为什么难文本聚类与主题建模text/07-fm.txt:78(搜「呈指数增长」)
降维、PCA 与 UMAP文本聚类与主题建模text/07-fm.txt:80(搜「降维技术」) · text/07-fm.txt:88(搜「非线性关系和结构」)
降维必然丢信息文本聚类与主题建模text/07-fm.txt:92(搜「这个过程总会丢失信息」)
设定经验值文本聚类与主题建模text/07-fm.txt:107(搜「5 到 10 之间」) · text/07-fm.txt:109(搜「更紧密的聚类」)
密度聚类 vs 中心点聚类文本聚类与主题建模text/07-fm.txt:119(搜「需要预设聚类数量」) · text/07-fm.txt:123(搜「HDBSCAN」)
156 个堆、调堆的最小规模文本聚类与主题建模text/07-fm.txt:142(搜「156」) · text/07-fm.txt:143(搜「我们需要减小 min_cluster_size 的值」)
人工检查第 0 堆文本聚类与主题建模text/07-fm.txt:181(搜「手语翻译」)
可视化会骗人、人工评估是关键文本聚类与主题建模text/07-fm.txt:212(搜「人工评估」)
主题建模的定义、传统做法给关键词文本聚类与主题建模text/07-fm.txt:241(搜「这种在文本数据集合中寻找主题或潜在主题的思想通常被称为主题建模」) · text/07-fm.txt:245(搜「通过这些关键词来理解主题的含义」)
潜在狄利克雷分配文本聚类与主题建模text/07-fm.txt:247(搜「潜在狄利克雷分配」)
词袋不考虑上下文文本聚类与主题建模text/07-fm.txt:251(搜「不考虑单词和短语的上下文或含义」)
两半流程文本聚类与主题建模text/07-fm.txt:257(搜「可以分为两个步骤」)
按堆数词频文本聚类与主题建模text/07-fm.txt:267(搜「而是在整个聚类中计算」)
停用词与 c-TF-IDF文本聚类与主题建模text/07-fm.txt:271(搜「停用词」) · text/07-fm.txt:273(搜「IDF 值」)
两步互相独立、模块化文本聚类与主题建模text/07-fm.txt:287(搜「并不依赖于聚类文档时使用的模型」) · text/07-fm.txt:293(搜「乐高积木」) · text/07-fm.txt:289(搜「k-means 替代」)
词袋不懂语义,需要重排文本聚类与主题建模text/07-fm.txt:509(搜「没有考虑语义结构」) · text/07-fm.txt:511(搜「重排序」)
重排只需按主题数执行文本聚类与主题建模text/07-fm.txt:517(搜「而不是对每个文档应用一次」)
按语义重排会误删缩写文本聚类与主题建模text/07-fm.txt:598(搜「这些缩写非常有信息量」)
按多样性重排治冗余文本聚类与主题建模text/07-fm.txt:600(搜「最大边际相关性」) · text/07-fm.txt:606(搜「更多样化的关键词集」)
让生成模型起名、给它看什么文本聚类与主题建模text/07-fm.txt:656(搜「为我们的主题生成一个标签」) · text/07-fm.txt:660(搜「通常为4篇」)
小模型起的名字过于宽泛文本聚类与主题建模text/07-fm.txt:718(搜「过于宽泛」)
建议保留多套说法文本聚类与主题建模text/07-fm.txt:780(搜「生成多个主题表示」)

Footnotes

  1. 出处:「文本分类」第 27 段(text/06-fm.txt:27,搜「5,331」)。五个分数分别见:第 220 段(text/06-fm.txt:220,搜「我们的预训练 BERT 模型给出的 F1 分数为 0.80」)、第 292 段(text/06-fm.txt:292,搜「0.85 的 F1 分数」)、第 350 段(text/06-fm.txt:350,搜「0.78 的 F1 分数」)、第 468 段(text/06-fm.txt:468,搜「0.84 的 F1 分数」)、第 590 段(text/06-fm.txt:590,搜「0.91 的 F1 分数」)。把这五个数排成一张阶梯是我们做的,书里它们分散在五处、没有并列过。 2

  2. 出处:「文本分类」第 5 段(text/06-fm.txt:5,搜「情感分析和意图检测」)与第 75 段(text/06-fm.txt:75,搜「二分类情感分析」)。

  3. 出处:「文本分类」第 300 段(text/06-fm.txt:300,搜「资源密集型任务」)。原文还追问了一句:「此外,收集这些标签是否真的值得?」

  4. 出处:「文本分类」第 202 段(text/06-fm.txt:202,搜「混淆矩阵」)。

  5. 出处:「文本分类」第 206 段(text/06-fm.txt:206,搜「精确率、召回率、准确率和 F1 分数」)与第 220 段(text/06-fm.txt:220,搜「加权平均值」)。书取加权平均的理由是「确保每个类别被平等对待」。 2

  6. 出处:「文本分类」第 83 段(text/06-fm.txt:83,搜「任务特定模型是一种表示模型」)与第 79 段(text/06-fm.txt:79,搜「任务特定模型或使用嵌入模型」)。

  7. 出处:「文本分类」第 115 段(text/06-fm.txt:115,搜「探索该模型的泛化能力」)。

  8. 出处:「文本分类」第 220 段(text/06-fm.txt:220,搜「我们的预训练 BERT 模型给出的 F1 分数为 0.80」)。

  9. 出处:「文本分类」第 93 段(text/06-fm.txt:93,搜「60,000」)。原文还提醒选型时要考虑「语言兼容性、底层架构、大小和性能」。补充(不在书里):正文提到的那套 MTEB 公开考卷,论文摘要给的规模是 8 类任务、58 个数据集、112 种语言、33 个模型。来源:《MTEB: Massive Text Embedding Benchmark》https://arxiv.org/abs/2210.07316(查阅于 2026-08-25) 2

  10. 出处:「文本分类」第 101 段(text/06-fm.txt:101,搜「可靠的基线」)与第 95 段(text/06-fm.txt:95,搜「体积要小得多」)。书列的六个是 BERT base、RoBERTa base、DistilBERT base、DeBERTa base、bert-tiny、ALBERT base v2。

  11. 出处:「文本分类」第 117 段(text/06-fm.txt:117,搜「推理速度的重要性不应被低估」)。

  12. 出处:「文本分类」第 232 段(text/06-fm.txt:232,搜「两步方法」)与第 258 段(text/06-fm.txt:258,搜「(8530, 768)」)。

  13. 出处:「文本分类」第 85 段(text/06-fm.txt:85,搜「冻结」)与第 238 段(text/06-fm.txt:238,搜「保持冻结状态」)。

  14. 出处:「文本分类」第 236 段(text/06-fm.txt:236,搜「在 CPU 上训练一个分类器」)与第 292 段(text/06-fm.txt:292,搜「0.85 的 F1 分数」)。「逻辑回归是统计学里最老最简单的二选一判别方法」是我们补的解释,书直接用了这个名字。 2

  15. 出处:「文本分类」第 296 段(text/06-fm.txt:296,搜「完全在 CPU 上运行」)。

  16. 出处:「文本分类」第 302 段(text/06-fm.txt:302,搜「零样本分类」)。

  17. 出处:「文本分类」第 315 段(text/06-fm.txt:315,搜「夹角的余弦值」)。「点积」是把两串数逐位相乘再相加得到的一个数;这里不需要理解它怎么算,只需要知道整个式子的结果代表「方向像不像」。

  18. 出处:「文本分类」第 350 段(text/06-fm.txt:350,搜「0.78 的 F1 分数」)。

  19. 出处:「文本分类」第 354 段(text/06-fm.txt:354,搜「A very negative/positive movie review」)。这段在原书里是一条「提示」框,书没有给出改动后的分数,只说「试一试,看看它如何影响结果」。 2

  20. 出处:「文本分类」第 348 段(text/06-fm.txt:348,搜「自然语言推理模型」)。这段在原书里是一条「注意」框。

  21. 出处:「文本分类」第 358 段(text/06-fm.txt:358,搜「序列到序列模型」)与第 360 段(text/06-fm.txt:360,搜「从词元序列生成数值」)。

  22. 出处:「文本分类」第 405 段(text/06-fm.txt:405,搜「Is the following sentence positive or negative?」)。

  23. 出处:「文本分类」第 364 段(text/06-fm.txt:364,搜「提示工程」)。

  24. 出处:「文本分类」第 401 段(text/06-fm.txt:401,搜「最小的以加快速度」)。书用的是 Flan-T5 系列里最小的一档;这个系列的来历是在微调阶段塞进了一千多种任务(第 386 段,text/06-fm.txt:386,搜「一千多个任务」)。

  25. 出处:「文本分类」第 590 段(text/06-fm.txt:590,搜「0.91 的 F1 分数」)。

  26. 出处:「文本分类」第 590 段(text/06-fm.txt:590,搜「它可能实际上是在我们的数据集上训练过的」)。 2

  27. 出处:「文本分类」第 551 段(text/06-fm.txt:551,搜「3 美分」)。

  28. 出处:「文本分类」第 557 段(text/06-fm.txt:557,搜「指数退避」)。

  29. 出处:「文本分类」第 23 段(text/06-fm.txt:23,搜「逻辑回归分类器」)。这段在原书里是一条「提示」框,原话是「强烈建议将这些示例与经典且强大的基线方法进行比较」。

  30. 出处:「文本聚类与主题建模」第 23 段(text/07-fm.txt:23,搜「44,949」)。

  31. 出处:「文本聚类与主题建模」第 43 段(text/07-fm.txt:43,搜「三个步骤和算法」)与第 73 段(text/07-fm.txt:73,搜「(44949, 384)」)。

  32. 出处:「文本聚类与主题建模」第 7 段(text/07-fm.txt:7,搜「将相似的文本分组」)。

  33. 出处:「文本聚类与主题建模」第 11 段(text/07-fm.txt:11,搜「发现错误标注的数据」)。

  34. 出处:「文本聚类与主题建模」第 78 段(text/07-fm.txt:78,搜「呈指数增长」)。

  35. 出处:「文本聚类与主题建模」第 80 段(text/07-fm.txt:80,搜「降维技术」)。原文:降维「旨在通过寻找低维表示来保留高维数据的全局结构」。

  36. 出处:「文本聚类与主题建模」第 88 段(text/07-fm.txt:88,搜「非线性关系和结构」)。

  37. 出处:「文本聚类与主题建模」第 92 段(text/07-fm.txt:92,搜「这个过程总会丢失信息」)。这段在原书里是一条「注」。 2

  38. 出处:「文本聚类与主题建模」第 107 段(text/07-fm.txt:107,搜「5 到 10 之间」)与第 109 段(text/07-fm.txt:109,搜「更紧密的聚类」)。「欧几里得」就是我们平时说的直线距离。

  39. 出处:「文本聚类与主题建模」第 119 段(text/07-fm.txt:119,搜「需要预设聚类数量」)。

  40. 出处:「文本聚类与主题建模」第 123 段(text/07-fm.txt:123,搜「它们被忽略」)。

  41. 出处:「文本聚类与主题建模」第 123 段(text/07-fm.txt:123,搜「冷门论文」)。

  42. 出处:「文本聚类与主题建模」第 123 段(text/07-fm.txt:123,搜「HDBSCAN」)。它是一个更老的算法 DBSCAN 的层次版本。

  43. 出处:「文本聚类与主题建模」第 142 段(text/07-fm.txt:142,搜「156」)。

  44. 出处:「文本聚类与主题建模」第 143 段(text/07-fm.txt:143,搜「我们需要减小 min_cluster_size 的值」)。

  45. 出处:「文本聚类与主题建模」第 181 段(text/07-fm.txt:181,搜「手语翻译」)。 2

  46. 出处:「文本聚类与主题建模」第 212 段(text/07-fm.txt:212,搜「人工评估」)。这段在原书里是一条「注」。 2

  47. 出处:「文本聚类与主题建模」第 241 段(text/07-fm.txt:241,搜「这种在文本数据集合中寻找主题或潜在主题的思想通常被称为主题建模」)。

  48. 出处:「文本聚类与主题建模」第 245 段(text/07-fm.txt:245,搜「通过这些关键词来理解主题的含义」)。

  49. 出处:「文本聚类与主题建模」第 255 段(text/07-fm.txt:255,搜「BERTopic:一个模块化的主题建模框架」)与第 554 段(text/07-fm.txt:554,搜「关键词提取包 KeyBERT」)。这两个工具的作者就是本书作者之一:书末参考文献第 828 段(text/07-fm.txt:828,搜「arXiv:2203.05794」)与第 830 段(text/07-fm.txt:830,搜「KeyBERT: Minimal keyword extraction」)都署名 Maarten Grootendorst。书在正文里没有点破这层关系,这一条是我们补的。 2

  50. 出处:「文本聚类与主题建模」第 247 段(text/07-fm.txt:247,搜「潜在狄利克雷分配」)。这是 2003 年的一个经典方法,书只用它当对照,没有展开讲。

  51. 出处:「文本聚类与主题建模」第 251 段(text/07-fm.txt:251,搜「不考虑单词和短语的上下文或含义」)。

  52. 出处:「文本聚类与主题建模」第 257 段(text/07-fm.txt:257,搜「可以分为两个步骤」)。

  53. 出处:「文本聚类与主题建模」第 267 段(text/07-fm.txt:267,搜「而是在整个聚类中计算」)。

  54. 出处:「文本聚类与主题建模」第 271 段(text/07-fm.txt:271,搜「停用词」)。

  55. 出处:「文本聚类与主题建模」第 271 段(text/07-fm.txt:271,搜「c-TF-IDF」)与第 273 段(text/07-fm.txt:273,搜「IDF 值」)。三个字母的全称展开是我们补的;书直接用了这个缩写。

  56. 出处:「文本聚类与主题建模」第 287 段(text/07-fm.txt:287,搜「并不依赖于聚类文档时使用的模型」)。

  57. 出处:「文本聚类与主题建模」第 293 段(text/07-fm.txt:293,搜「乐高积木」)。原文接着说:「通过这种模块化,新发布的模型可以集成到其架构中。」 2 3

  58. 出处:「文本聚类与主题建模」第 289 段(text/07-fm.txt:289,搜「k-means 替代」)。

  59. 出处:「文本聚类与主题建模」第 509 段(text/07-fm.txt:509,搜「没有考虑语义结构」)与第 511 段(text/07-fm.txt:511,搜「重排序」)。书还指出「对初始结果集进行重排序的思想是神经搜索的主要内容」——那是第 06 章的伏笔。

  60. 出处:「文本聚类与主题建模」第 598 段(text/07-fm.txt:598,搜「这些缩写非常有信息量」)。原文承认这「展示了使用基于嵌入的技术的缺点」。 2

  61. 出处:「文本聚类与主题建模」第 600 段(text/07-fm.txt:600,搜「最大边际相关性」)与第 606 段(text/07-fm.txt:606,搜「更多样化的关键词集」)。做法是从约 30 个候选词里挑出约 10 个互相不重复的。

  62. 出处:「文本聚类与主题建模」第 718 段(text/07-fm.txt:718,搜「过于宽泛」)。

  63. 出处:「文本聚类与主题建模」第 517 段(text/07-fm.txt:517,搜「而不是对每个文档应用一次」)。原文的例子:数百万个文档、一百个主题,表示这一步只需要跑一百次。

  64. 出处:「文本聚类与主题建模」第 660 段(text/07-fm.txt:660,搜「通常为4篇」)。挑法是按 c-TF-IDF 的相似度选出最能代表该堆的几篇。

  65. 出处:「文本聚类与主题建模」第 780 段(text/07-fm.txt:780,搜「生成多个主题表示」)。这段在原书里是一条「提示」框。