返回教程列表
文本分析基础教程语料检索BM25质性资料分析

语料检索完整教程:从检索单元与 BM25 打分,到语义重排与分数融合,再到结果的核对与引用

三十份访谈稿,怎样找出所有谈到农民收入变化的段落?这篇教程说明 TATOOLS 的【语料检索】怎样把文档切成整篇、段落或句子,先用 BM25 按词频、稀有度和篇幅给片段打分召回候选,再用语义重排判断意思是否贴题,两路分数归一化后按语义权重合成相关度。文中用十个片段手算 BM25,得到 2.93、0.76 和 0.53 三个分数,再演示语义权重从 0.6 调到 0.3 时排序怎样翻转。最后讲查询怎样写,结果怎样回到原文核对,以及报告的读法和论文方法部分的写法。

作者:TATOOLS 研究团队|更新于 2026-09-24|4537 个字符|约 16 分钟读完
corpus-search
立即使用

手里有三十份乡村调研的访谈稿,每份几万字,想找出所有谈到农民收入变化的段落。用查找功能搜增收,只能找到字面上带这个词的地方,谈钱袋子鼓了、日子比以前宽裕的段落都漏掉了;一份份从头读,又要花上好几天。

语料检索做的是另一件事。它把上传的一批文档当作一个小型语料库,切成一个个可以单独返回的片段,对每条查询给每个片段打一个相关度分数,按分数从高到低返回最贴题的几条,并在原文里高亮命中的词。信息检索领域几十年来的做法是两步走,先用快速的关键词打分从全部片段里捞出一批候选,再用更细的语义模型给候选重新排序。

在 TATOOLS 的【语料检索】里【上传文档】,写下一条或几条查询。TATOOLS 先按 BM25 给片段打分召回候选,再让语义重排模型逐条判断候选与查询的贴合程度,两路分数按设定的权重合成最终相关度,每条查询各自返回一份结果。

这篇教程先讲检索单元怎样切,再用一个小例子手算 BM25 和两路分数的融合,讲清各项设置改变什么,最后讲报告的读法和论文里的写法。

01

检索单元:整篇、段落还是句子

检索返回的是一个个片段,片段有多大,决定了结果读起来是什么样子。整篇文档作单元,返回的是哪份材料最相关,要自己再去找具体位置;句子作单元,定位最准,但一句话脱离上下文常常看不懂;段落介于两者之间,多数质性研究按段落检索。

检索粒度 适合的材料 返回的结果
按整篇文档 大量短文本,如评论、摘要 哪几份材料最相关
按段落 访谈稿、政策文件、报告 最相关的段落
按句子 需要精确定位的长文 最相关的句子

TATOOLS 的【检索粒度】默认【自动分段】,对每份文档分别判断。很短的文档整篇作一个单元;段落分明、段落长度适中的文档按段落切;其余按句子切。一段话太长时,TATOOLS 再把它切成几块,块与块之间留一点重叠,避免一句话被从中间截断后两边都找不到。

报告的【资料文件清单】写明每份文件切成了多少个片段、共多少字符,【检索概览】给出全部可检索片段的数目和平均长度。

02

BM25:词频、稀有度与篇幅

BM25 是 Robertson 等人在 Okapi 检索系统里发展出来的打分公式,至今仍是关键词检索的通行基线。它给一个片段打分时看三件事,查询词在片段里出现了几次,这个词在整批资料里罕见不罕见,片段本身有多长。

· · ·

score(D, Q) = Σ IDF(q) × f × (k₁ + 1) ÷ (f + k₁ × (1 − b + b × |D| ÷ avgdl))

IDF(q) = ln((N − n + 0.5) ÷ (n + 0.5))

f:词 q 在片段 D 里出现的次数

|D|:片段长度;avgdl:全部片段的平均长度

N:片段总数;n:含有词 q 的片段数

k₁、b:调节参数,通行取值 1.5 和 0.75

IDF 叫逆文档频率,由 Spärck Jones 1972 年提出,越少片段用到的词,IDF 越高,命中它越说明问题。词频部分有上限,同一个词在一段里重复十次,得分也不会是出现一次的十倍。篇幅部分让长段落略微吃亏,长段落本来就更容易碰巧包含查询词。

手算一个例子。一共 10 个片段,查询是农民增收,分词后是农民和增收两个词。增收只在 1 个片段里出现,农民在 3 个片段里出现。

· · ·

IDF(增收) = ln(9.5 ÷ 1.5) ≈ 1.846

IDF(农民) = ln(7.5 ÷ 3.5) ≈ 0.762

片段 A 平均长度,农民 2 次,增收 1 次

        0.762 × 1.429 + 1.846 × 1 ≈ 2.93

片段 B 平均长度,农民 1 次

        0.762 × 1 ≈ 0.76

片段 C 两倍平均长度,农民 1 次

        0.762 × 0.69 ≈ 0.53

片段 A 同时命中两个词,而且命中了罕见的增收,分数最高;片段 B 和 C 都只提到一次农民,C 更长,分数更低。

TATOOLS 对查询和资料用同一套办法分词,再按 BM25 给全部片段打分。【使用系统停用词】默认打开,的和是这类词不参与打分;【词形合并】把同一个词的几种写法并成一个,资料里写 AI、查询里写人工智能,也能互相命中。

03

语义重排:看意思贴不贴

BM25 只认字面。查询是农民增收,一段谈农民的钱袋子越来越鼓的话,只命中农民一个词,分数不会高;一段恰好把农民和增收都列在一串政策名称里的话,分数反而很高。

Nogueira 和 Cho 2019 年把预训练语言模型用在检索的第二步,先用 BM25 召回候选,再让模型把查询和每个候选放在一起读,判断它们意思上贴不贴,重新排序,检索效果大幅提升。这种先召回、再重排的两步做法,后来成了语义检索的常见架构。

TATOOLS 的做法是同样的两步。每条查询先按 BM25 取出一批得分最高的片段作为候选,候选的数目等于【每条查询返回多少条结果】乘以【候选放大倍数】,默认 10 条乘以 5 倍,也就是 50 个候选。进入候选的片段至少含有查询里的一个词。语义重排模型给每个候选打一个语义分数,最后在候选里选出前 10 条。

候选放大倍数越大,只含一两个查询词、但意思很贴的片段越有机会进入候选,代价是多花一点时间。一次提交的多条查询,重排请求会一起送出,每条查询的结果互不影响。

04

两路分数怎样合成

BM25 分数和语义分数的单位不同,不能直接相加。TATOOLS 先在每条查询的候选里把两路分数各自做最小最大归一化,最高的记 1,最低的记 0,再按【语义权重】加权。

· · ·

归一化 = (分数 − 候选中最低分) ÷ (最高分 − 最低分)

相关度 = (1 − w) × BM25 归一化 + w × 语义归一化

w:语义权重,默认 0.6

接着上面的例子,假设 A、B、C 三个候选的语义分数分别是 0.20、0.90、0.60。

· · ·

         BM25 归一化 语义 归一化

片段 A 2.93 1 0.20 0

片段 B 0.76 0.10 0.90 1

片段 C 0.53 0 0.60 0.57

w = 0.6 A 0.40 B 0.64 C 0.34 B 排第一

w = 0.3 A 0.70 B 0.37 C 0.17 A 排第一

语义权重调高,意思更贴的 B 排到前面;调低,字面命中更多的 A 排到前面。常用的取值在 0.5 到 0.7 之间。

归一化是在每条查询自己的候选里做的,每条查询的最高分都接近 1,相关度只用来排同一条查询内部的先后。两条查询找到的内容哪条更贴题,要回到原文去比。

TATOOLS 下载的结果表里,每条结果同时列出 BM25 评分、语义重排评分和融合评分,三个分数都能核对。

05

查询怎样写

一行写一条查询,可以一次写很多条,每条独立检索、独立返回结果。查询可以是几个关键词,也可以是一句完整的话,比如乡村振兴战略的实施路径。查询和资料用同一套分词、停用词和词形合并设置,分词后查询里的每个词都参与 BM25 打分,整句话交给语义重排判断意思。

几种写法各有用处。

查询写法 例子 适合
单个术语 宅基地 找某个概念出现的地方
几个关键词 农民 增收 渠道 找同时涉及几方面的段落
一句话 返乡青年为什么愿意留下来 找回答某个问题的段落

还没想好查什么,可以打开【自动查询关键词】,TATOOLS 取资料里出现最多的前 10 个词各当一条查询,先看看资料里谈得最多的几件事都落在哪些段落。

资料里有分词词典不认识的专门说法,打开【自动补充词典】,TATOOLS 先从资料里找出这类新词加进词典,查询和资料按同一份词典分词。【文本语言】默认自动检测。

06

高亮与原文核对

检索结果是找到材料的起点,引用之前都要回到原文读一遍。TATOOLS 给每条结果标出来自哪份文件的第几个片段,在原文里把命中的查询词高亮出来,并列出这条结果命中了哪些词。

【原文片段预览长度】决定高亮位置左右各保留多少个字符,默认 60 个;关掉【在结果中显示带高亮的原文片段】时,结果只列出片段开头的一段文字。

一条结果命中的词少、相关度却很高,多半是语义重排认为它意思贴切,这类结果最值得细读,它们往往是关键词检索会漏掉的说法。

07

工具页上的设置一览

设置 选项或范围 默认 影响什么
查询 一行一条 要找什么
自动查询关键词 开或关 用高频词当查询
检索粒度 自动分段、按段落、按句子、按整篇文档 自动分段 结果以多大的片段返回
每条查询返回多少条结果 1 到 50 10 每条查询返回几条
原文片段预览长度 20 到 240 个字符 60 高亮位置左右各留多少字
语义权重 0.10 到 1.00 0.60 相关度里语义分数的比重
候选放大倍数 2 到 15 倍 5 倍 交给语义重排的候选有多少
文本语言 自动检测、中文、英文 自动检测 怎样切词
使用系统停用词 开或关 常见虚词是否参与打分
词形合并 一行一组写法 哪些写法当作同一个词

TATOOLS 的【切词模式】【使用词性过滤】和【自动补充词典】在分词设置里,一般保持默认即可。

08

报告怎么读

区块 先看什么
这份结果说明了什么 几条查询找到了内容,哪些资料被命中得最多
结果亮点 每条查询得分最高的一条片段
检索概览 可检索片段数、查询命中率、资料覆盖率
资料文件清单 每份文件切成多少片段,被命中几次
查询结果 每条查询的结果、相关度分布和高亮原文

查询命中率是找到了内容的查询占全部查询的比例;资料覆盖率是至少被命中一次的文件占全部文件的比例。【查询结果】左边列出全部查询,点一条,右边显示它的结果和相关度分布,分布图前几根柱子明显高出其余的,说明最贴题的内容集中在前几条。

报告页面每条查询展示最前面的几条结果,TATOOLS 下载的结果表里是每条查询的全部结果,每条结果附文件名和片段位置,列出三项分数和命中词,还有片段预览,可以直接拿来整理引文。

09

把结果写进论文

下面是一段质性研究里常见的写法示例,方括号里换成自己的内容。

本研究使用 TATOOLS 的语料检索,在 [数量] 份访谈稿中检索与 [主题] 相关的内容。检索以段落为单位,先按 BM25(Robertson 与 Zaragoza,2009)召回候选段落,再经语义重排,以 [权重] 的语义权重融合两路分数,每条查询保留相关度最高的 [条数] 个段落。全部检索结果经研究者逐条阅读原文确认后纳入编码。

论文里写明查询的具体内容、检索单位、返回条数和语义权重,再说明人工确认的标准,检索这一步就可以复核。

10

小结

语料检索把一批文档切成片段,对每条查询给片段打分,返回最贴题的几条并高亮原文。

检索单元可以是整篇、段落或句子,自动分段按每份文档的长度和段落结构决定。

BM25 看查询词出现的次数、它在资料里的稀有程度和片段长度,重复出现的得分有上限,长片段略吃亏。

语义重排在 BM25 召回的候选里判断意思贴不贴,两路分数归一化后按语义权重合成相关度。

相关度只在同一条查询内部比较,引用之前都要回到原文核对。

想比较一批资料和另一批资料在用词上的差别,可以用 TATOOLS 的【语料对比关键词分析】;想把资料按内容自动归成几类,用【高级文本聚类】;想抽出资料里的专门术语,用【领域术语抽取】。

11

资料来源

Spärck Jones:A Statistical Interpretation of Term Specificity and Its Application in Retrieval,Journal of Documentation,第 28 卷第 1 期,1972

Robertson 与 Zaragoza:The Probabilistic Relevance Framework: BM25 and Beyond,Foundations and Trends in Information Retrieval,第 3 卷第 4 期,2009

Nogueira 与 Cho:Passage Re-ranking with BERT,arXiv:1901.04085,2019


END