想象你是一个快递仓库的资深分拣员老王。仓库里有十万个包裹,每个包裹里装着五花八门的物品。有一天客服跑来喊:“老王,快帮我找那个装着蓝色水晶奖杯的包裹!”你低头一看,发现工作台上躺着两个包裹:A 包裹里有 3 包纸巾,B 包裹里有 2 包纸巾——你瞬间傻眼了。只靠纸巾这种“满仓库都有”的常见词,你根本分不清哪个是客户要的。但如果其中一个包裹里除了纸巾,还夹着一张写着“六核处理器保修单”的纸条,你立刻就能锁定它。 这个场景,就是搜索引擎的日常。搜索系统面对的“包裹”叫文档,“物品”叫词语,而它最需要回答的问题是:当一个用户输入查询词时,怎么判断哪些文档更相关? TF-IDF 就是这个问题的第一把钥匙——它给每个词语打一个“辨识度分数”,让“常见词”贬值,让“稀有词”升值,从而帮助系统把手里的文档按相关度排好队。
理解 TF-IDF 是入门信息检索的必经之路。它不仅是搜索引擎排名的地基,更是随后 BM25 等现代检索模型的直接改进来源。掌握它,你就拿到了理解搜索、推荐、文本挖掘等 AI 应用的核心思维。
目录
可视化演示
查看TF-IDF词频与逆文档频率计算流程,BM25引入词频饱和与长度归一化的改进,以及两模型相关性评分对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
检索相关性评分 TF-IDF基础权重 BM25 词频饱和+长度归一
检索困境:为什么要给词语打分
想象你刚做快递分拣员的那一天:客户报出“帮我找有蓝色水晶奖杯的包裹”,你随手翻了两个包裹,发现里面全是纸巾。你这才意识到,词语就像包裹里的物品,单看名称并不能告诉你它有没有价值。在文档的世界里,一个词“长什么样”并不重要,重要的是“它在哪一份文档里出现、又在多少份文档里出现”。
在信息检索系统里,用户输入一句查询,系统面对的是成千上万份文档。文本本身是没法直接做数学运算的,所以第一步就是把文档拆解成一个个词语特征,再给每个特征赋一个数值。关键问题来了:怎么给“词语—文档”关系打一个合理的分数? 如果只数词的出现次数,那么“的、了、是”这种满篇都是的词会霸占榜单,但它们对区分文档毫无帮助。
一种直觉的解法是:把分数拆成两部分——先看这个词在文档内部热不热(局部信号),再看它在整个文档库里稀不稀(全局信号)。二者相乘,就能得到一个既有热度、又有辨识度的评分。
老王听完这个设计恍然大悟:他要找的“蓝色水晶奖杯”之所以能帮他锁定包裹,不是因为它在包裹里出现了多少次,而是因为整个仓库只有这一个包裹有它。局部的热度配合全局的稀有,辨识度才真正立起来。
- 局部热度\(\text{local}(t, d)\) 刻画词 \(t\) 在文档 \(d\) 中被使用的频繁程度,对应后文的 TF。
- 全局稀有度\(\text{global}(t)\) 衡量词 \(t\) 在整个文档库中的罕见程度,对应后文的 IDF。
- 组合辨识度两项相乘,稀缺且高频的词获得高分,泛滥的词被压制。
词频计算:数出热度
老王决定先把第一个信号搞定:数一数某个物品在包裹里出现了几次。这个数字自然叫词频(Term Frequency, TF)——词 \(t\) 在文档 \(d\) 中出现的原始次数,记作 \(f_{t,d}\)。包裹 A 里 10 件物品中有 3 包纸巾,纸巾的原始词频就是 3。
但老王很快发现一个坑:包裹 B 有 100 件物品,里面也有 3 包纸巾。如果只看原始次数,两个包裹的“纸巾热度”一样,可包裹 B 明明更“稀释”——纸巾只占 3%。所以原始计数必须除以文档的总词数,得到归一化词频,也就是物品在包裹中的占比。
在这一步,老王给仓库里的每个包裹都做了一张“物品占比清单”。但占比高还不够——“纸巾”在 A 包裹里占了 30%,可如果客户要找“有纸巾的包裹”,仓库里八成包裹都有纸巾,这个指标依然没有区分度。词频只回答了“热不热”,还没回答“稀不稀”。
- 分子——词的原始计数\(f_{t,d}\) 表示词 \(t\) 在文档 \(d\) 中出现的次数。老王数出了 3 包纸巾,这个 3 就是原始计数。
- 分母——文档全部词的计数之和\(\sum_{k=1}^{n} f_{k,d}\) 把文档里所有不同词的出现次数全部加起来,得到文档总词数。
- 占比转换原始次数除以总词数,词频被压缩到 0 到 1 之间的比例,方便横向比较。
逆文档频率:衡量稀有度
老王的第二步,是拎着一个物品去整个仓库转一圈,看它出现在多少个不同的包裹里。这个“出现在多少个包裹里”的数字,叫文档频率(Document Frequency, DF)。仓库里一共有 10 万个包裹,其中有 5 万个包裹都装了纸巾,那么纸巾的 DF 就是 50000。
现在反过来想:一个物品越常见,它对找出某一个特定包裹就越没用。所以老王关心的是“稀有倍率”——用总包裹数 \(N\) 除以出现该物品的包裹数 \(n_t\)。10 万除以 5 万,得到 2 倍稀有;如果某个物品只在 1 个包裹里出现,稀有倍率就是 10 万倍。但 10 万这个数字太大了,直接用容易让分数失衡,于是取一个自然对数把它压缩下来,这就成了逆文档频率(Inverse Document Frequency, IDF)。
对老王来说,这条公式的画外音是:“纸巾”这种哪哪都有的东西,IDF 只给 0.69 分;而“蓝色水晶奖杯”这样只在 1 个包裹出现的心头好,IDF 能拿到 11.5 分。稀有度,才是辨识度的真正底牌。
- 文档总数 \(N\)整个文档库中的文档数量。在老王的仓库里,\(N = 100000\)。
- 词出现过的文档数 \(n_t\)统计有多少篇文档包含词 \(t\)。常见词的 \(n_t\) 很大,稀有词很小。
- 稀有倍率\(N / n_t\) 表示这个词在整个库中被“稀释”到多少倍。倍率越大,越难得一见。
- 对数压缩\(\ln\) 把 2、100000 这样的倍率压缩到温和的数值区间,避免极端词压过其他一切信号。
权重公式:TF × IDF 相乘
老王手里现在有两张表:一张记着物品在包裹里的占比(TF),一张记着物品在整个仓库的稀有度(IDF)。他随手一算,发现光靠任何一张都不够:TF 高的“纸巾”在满仓库都是,IDF 高的“芯片”可能只在某个包裹里出现一次,热度不足。
于是他把两张表合二为一:先看这个物品在包裹里热不热,再看它在仓库里稀不稀,最后把两个数字相乘。这个乘积,就是经典的 TF-IDF 权重。
当用户输入一句查询 \(q\),它通常包含多个词语。把每个词的 TF-IDF 加起来,就得到文档 \(d\) 对查询 \(q\) 的整体相关度得分。按这个得分排序,最相关的文档自然排到最前面。
老王终于有了一张完整的工作台:他给每个包裹算出一个“总分”,客户再来说“找有蓝色水晶奖杯的包裹”时,他直接按分最高的包裹去找,一找一个准。TF-IDF 本质上就是把“热”与“稀”这两条线索拧成一股绳。
- TF 分量\(\text{TF}(t, d)\) 是词在文档中的占比,最大值不超过 1,它决定“这个词在文档里看着显眼吗”。
- IDF 分量\(\text{IDF}(t)\) 是词在全库的稀有度,它决定“这个词在库里能引起多大注意”。
- 组合乘积两者相乘,热度与稀有度都无法单独称霸——常见的词即使 TF 高,也会被低 IDF 拉低;太生僻的词即使 IDF 高,也会因 TF 低而得分不足。
平滑变体:让打分更稳健
用了一阵子,老王发现这套打分卡有几个扎手的毛病。第一,如果某个稀有词的文档频率 \(n_t = 0\)(词在库里完全没出现,比如客户输入了错别字),分母直接变零,计算崩溃;第二,如果 \(n_t = N\)(词出现在所有文档中),IDF 的值是 \(\ln(1) = 0\),看似没事,但某些变体下会出现负值,负分数在排序时会产生反直觉的结果。第三,长包裹和短包裹的词频天然不公正——长包裹更容易累积高 TF。
于是老王请来数学好的朋友帮忙打补丁。第一招:加法平滑,在 IDF 的分子分母上都加 1,再整体加 1,保证 IDF 恒为正数且最小不低于 1——这样即使某个词出现在所有文档里,它依然有一个微小的基础权重,而不是直接归零。
第二招叫长度归一化:词频不再只除以本包裹的物品总数,而是参照整个仓库的平均包裹大小来修正,避免“长包裹分数虚高、短包裹分数被压”的问题。两个补丁打完之后,老王的分拣准确率肉眼可见地上升了——他再也不会因为某个包裹“东西多”就误判它更相关了。
- 分母加一\(n_t + 1\) 确保即使词没有出现在任何文档中,分母也不会为 0。
- 分子加一\(N + 1\) 与分母配合,使比值在极端情况下依然有界、平滑。
- 整体加一\(\ln(……) + 1\) 把 IDF 的下限抬到 1,让常见词也有最小权重,避免被完全忽略。
场景表现:不同仓库不同策略
老王后来又接手了几个不同类型的仓库,发现同一个 TF-IDF 在不同仓库里的脾气完全不一样。
短文档场景——比如商品名称、微博、新闻标题。这类文档很短,一个词的出现往往具有决定性。TF 的区分度相对较弱,IDF 的稀有度主导排序。用户搜“蓝色奖杯”,一个商品标题里正好有“奖杯”的宝贝,就很容易通过稀有词的 IDF 冲到前面。短文档场景下,TF 不需要做太多归一化就能工作得不错。
长文档场景——比如论文、合同、产品说明书。一篇几万字的文档里,“合同”可能出现了 200 次,而另一篇 500 字摘要里“合同”只出现 5 次。如果不做长度归一化,长文档的 TF 天然压过短文档,检索结果严重偏向长文档。这时 TF 必须配合长度归一化使用,否则文档长度本身就成了一个隐藏的“作弊特征”。
领域差异——在一个全是家电说明书的技术仓库里,“芯片”和“电源”是高频词,IDF 被压低;但在一个全是美食菜谱的仓库里,“芯片”可能压根不出现。这说明 IDF 不是一个词的固有属性,而是依赖于语料库的整体统计。同一个词,换一个仓库,IDF 就变了,它的“稀有度评分”也随仓库而变。
老王总结出一条作业口诀:先看文档长短,再定归一化策略;先看仓库领域,再解读 IDF 的绝对数值。一套打分卡打遍天下不现实,因地制宜才是信息检索的常态。
参数调优:敏感性与 BM25 动机
老王用得越久越觉得,原始 TF-IDF 有一个隐隐的毛病:词频和得分的关系是线性的——出现 10 次就是出现 5 次的两倍分。可现实是,一个词在一篇文档里出现 5 次和出现 50 次,对主题的贡献远没有 10 倍之差;出现第 6 次、第 7 次时,边际信息已经非常有限了。老王希望词频的贡献是“饱和”的:前期增长明显,后期增长递减。
这就是 BM25 的改进动机。BM25 保留 IDF 的全局稀有度思想,但对词频做了一次非线性压缩,引入参数 \(k_1\) 控制饱和速度:
老王看着这个公式笑了:它就像给他那把旧评分卡装上了“阻尼器”。同样的词,出现次数再多也不会无脑刷分;更长的包裹也不会因为体积大就自动赢得排名。从 TF-IDF 到 BM25,本质上是给“热度”加了上限,给“长度”加了矫正——这正是检索模型不断进化的缩影。
- IDF 因子\(\text{IDF}(t)\) 继续承担全局稀有度打分,继承 TF-IDF 的核心思想。
- 饱和比例\(\displaystyle \frac{f_{t,d} \cdot (k_1 + 1)}{f_{t,d} + k_1}\) 中,当 \(f_{t,d}\) 从 1 涨到 10,比值涨得很快;从 50 涨到 100,比值几乎停滞,这就是“边际收益递减”。
- 长度归一化项\(\displaystyle 1 - b + b \cdot \frac{|d|}{L}\) 在文档长度等于平均长度 \(L\) 时取 1,不惩罚;文档越长,惩罚越大。
AI 应用场景
搜索引擎相关文档排名
阶段:召回与排序
解决的问题:传统方法单纯按关键词匹配,把所有包含查询词的文档不加区分地返回,常见词堆积的无关文档排在最前。TF-IDF 通过衡量词项对文档的辨识度,让稀有词命中者的得分被放大,从而把最相关的文档排到前面。
具体案例:用户在搜索引擎输入“量子纠缠 综述”,系统首先检索包含这些词的页面,然后利用 TF-IDF 计算每个页面的相关度得分并排序。一个只在标题里出现“量子纠缠”的前沿论文页面,比一个通篇都是“量子”却没提“纠缠”的科普页得分更高,因为“纠缠”的 IDF 更高。
关键词提取与文档摘要
阶段:特征工程与内容理解
解决的问题:从一篇长文档中人工提炼关键词耗时费力,且主观性太强。TF-IDF 可以自动计算文档中每个词的得分,按得分高低输出 top-k 关键词,作为自动摘要和文本标签的依据。
具体案例:新闻 APP 对一篇关于“新能源汽车电池回收”的报道做关键词提取。系统分词后计算每个词的 TF-IDF,发现“电池回收”得分远高于“报道”“记者”等高频词,于是自动打上“电池回收”“新能源”等标签,推送给关注此话题的用户。
文本去重与异常检测
阶段:数据清洗
解决的问题:在大规模文档库中,相似文档比例过高,简单按词频匹配会误判。TF-IDF 把文档转换为稀疏向量后,可以通过计算向量相似度找到近似重复的文档;反之,某篇文档中包含大量罕见词,说明其内容异常特殊,值得人工排查。
具体案例:一个企业知识库里堆积了上千份项目报告,运维工程师用 TF-IDF 向量计算两两报告的余弦相似度,找出 89 组高度重复的文档并合并;同时,一份包含大量行业黑话(高 IDF 词)的报告被系统标记为“专业度极高”,优先路由给资深专家审核。
Python 演示
import math docs = [ "机器学习模型需要大量数据进行训练", "信息检索系统根据查询返回相关文档", "搜索引擎是信息检索的典型应用场景", "机器学习模型分为监督学习和无监督学习", "自然语言处理与信息检索紧密结合"] query_terms = ["检索", "机器学习"] def tokenize(text): """简单分词:按空格拆分,这里假设文本已用空格分隔。""" return text.split() def compute_tf(tokens): """计算归一化词频 TF = 词出现次数 / 文档总词数。""" freq = {} for w in tokens: freq[w] = freq.get(w, 0) + 1 total = len(tokens) return {w: c / total for w, c in freq.items()} def compute_idf(all_tokens): """计算逆文档频率 IDF = ln(N / n_t),N 为文档总数。""" N = len(all_tokens) doc_freq = {} for tokens in all_tokens: for w in set(tokens): doc_freq[w] = doc_freq.get(w, 0) + 1 return {w: math.log(N / d) for w, d in doc_freq.items()} def score_document(tf_map, idf_map, terms): """文档对查询的总得分 = 各查询词的 TF-IDF 之和。""" return sum(tf_map.get(t, 0) * idf_map.get(t, 0) for t in terms) def main(): all_tokens = [tokenize(doc) for doc in docs] idf_map = compute_idf(all_tokens) print("IDF 词典:") for w, v in sorted(idf_map.items(), key=lambda x: -x[1]): print(f" {w}: {v:.4f}") print("\n查询词:", " ".join(query_terms)) print("\n文档相关度排名:") results = [] for i, doc in enumerate(docs): tf_map = compute_tf(tokenize(doc)) s = score_document(tf_map, idf_map, query_terms) results.append((s, i, doc)) for s, i, doc in sorted(results, key=lambda x: -x[0]): print(f" 第{i+1}篇 得分{s:.4f} {doc}") if __name__ == "__main__": main()
freq[w] = freq.get(w, 0) + 1逐词统计出现次数,等价于老王清点包裹里某种物品的数量。total = len(tokens)统计文档总词数,作为 TF 归一化的分母。{w: c / total for w, c in freq.items()}把原始计数转换为占比,得到 0 到 1 之间的归一化 TF。for w in set(tokens)用 set 去重后再统计文档频率,同一个词在一篇文档里出现多次只算一次。doc_freq[w] = doc_freq.get(w, 0) + 1统计包含词 w 的文档数 n_t,这是 IDF 的分母。math.log(N / d)计算逆文档频率,N 是文档总数,d 是包含该词的文档数。tf_map.get(t, 0) * idf_map.get(t, 0)对查询词 t 相乘得到 TF-IDF 权重;get 默认值 0 确保查询词没出现时得分为 0。sorted(results, key=lambda x: -x[0])按得分降序排列文档,完成检索排序。
常见误区
误区“既然 TF 是词频,那一个词在文档里出现得越多,它的 TF-IDF 值肯定就越高,应该越能代表这篇文档。”
正解TF-IDF 是 TF 与 IDF 的乘积。如果一个词(如“我们”)几乎出现在所有文档中,它的 IDF 趋近于 0,即使 TF 高达 0.9,乘积仍然非常小。反之,一个只在个别文档出现且频率适中的词(如“量子纠缠”),反而因为极高的 IDF 拿下高分。辨识度是热度与稀有度的合力,不是单一指标。
为何常见:人最容易感知到的是“出现次数多 = 重要”的直觉,忽略了“全局稀有”这个对抗性条件。就像老王只看到包裹 A 里纸巾多,却没意识到全仓包裹都装了纸巾。
误区“TF-IDF 的输出在 0 到 1 之间,那它应该表示『这个词属于这篇文档』的概率吧?”
正解TF-IDF 只是一个启发式权重,不是概率。它的数值可以大于 1(尤其当 IDF 较大时),也没有归一化到 0-1 区间,更不满足概率的公理。它衡量的是“区分能力”或“辨识度”,而不是“生成的似然性”。真正的概率检索模型是后续的 BM25 族和语言模型那套体系。
为何常见:初学者看到数值在 0 到 1 附近,容易联想到概率;加上很多教程用“权重”一词一带而过,没有强调其取值范围不受限。
误区“直接用 \(\ln(N / n_t)\) 就好,加 1 是画蛇添足,影响精度。”
正解不加平滑会带来两个灾难:当 \(n_t = 0\)(查询词在库中不存在)时,直接除零;当 \(n_t \to N\) 时,IDF 趋近于 0,会让该词在排序中完全丧失作用。平滑处理(如分子分母同时加 1,再整体加 1)保证 IDF 恒正、有下界,让每个词都保留最小权重,是一种提高稳健性的工程手段。
为何常见:数学公式看起来“干净”,但真实数据充满边界情况。初学者容易把课本上的理想公式直接套用到有噪声的工业数据上。
误区“文档越长,包含的词越多,面试官说 TF-IDF 已经做了归一化,那长文档的分数应该没问题了吧?”
正解TF 归一化解决了“同一篇文档内部”的占比问题,但没解决“跨文档”的长度偏差。长文档的绝对词频更高,词的多样性也更大,用占比归一化后仍可能让长文档获得更高的累计得分。这需要额外的长度归一化(如除以文档长度的加权因子,或引入 BM25 的 \(b\) 参数)来修正。
为何常见:很多初学者把“除以文档总词数”误认为已经处理了文档长度问题,却忽略了跨文档比较时,长度依然是一个隐藏的偏向因子。
面试题
Q1. 在 TF-IDF 中,TF 衡量的是什么?
- A.词在文档中的局部出现热度← 正确答案
- B.词在整个文档库中的文档数量
- C.词在查询中的重要性程度
- D.文档与查询之间的语义距离
答案:A。TF(词频)衡量的是词在某篇文档内部的出现频繁程度,是“局部热度”指标。B 是 DF(文档频率)的定义,C 属于查询权重范畴,D 需要语义模型而非词汇统计,均不符合 TF 的定义。
Q2. 在 IDF 公式 \(\ln(N / n_t)\) 中,\(n_t\) 表示什么?
- A.词 t 在所有文档中出现的总次数
- B.包含词 t 的文档数量← 正确答案
- C.文档库中所有词的种数总和
- D.查询中词 t 的重复次数
答案:B。\(n_t\) 是“文档频率”(DF),即有多少篇文档包含词 t。注意它与“词 t 出现的总次数”不同——同一篇文档里出现多次的 t 只贡献一次文档频率。C 是词表大小,D 是查询词频,都与 IDF 公式无关。
Q3. 如果一个词出现在文档库中的每一篇文档里,它的基础 IDF 值 \(\ln(N / n_t)\) 约为多少?
- A.1
- B.0← 正确答案
- C.正无穷
- D.负无穷
答案:B。当 \(n_t = N\) 时,\(N / n_t = 1\),\(\ln(1) = 0\)。这说明该词没有任何区分能力,对排序贡献为零。A 是平滑 IDF 的下界而非基础 IDF,C 和 D 分别在 \(n_t \to 0\) 和比值小于 1 时才可能出现,均不符合条件。
Q4. 为什么 IDF 要用自然对数 \(\ln\) 而不是直接用稀有倍率 \(N / n_t\)?
- A.对数能压缩数值范围,防止稀有词分数失控← 正确答案
- B.对数能把分数转换成概率
- C.对数能加快词频统计的速度
- D.对数能消除文档长度的影响
答案:A。当某词只在 1 篇文档中出现而库中有百万文档时,\(N / n_t = 10^6\),直接用会碾压其他信号。取对数后大约只有 13.8,压缩了极端值的影响,让得分更平稳。B、C 均无依据,D 是长度归一化解决的问题,不归对数管。
Q5. 在归一化词频公式中,TF 的分母应该除以什么?
- A.整个文档库的总词数
- B.该文档的总词数← 正确答案
- C.包含该词的文档数量
- D.用户查询的总词数
答案:B。归一化 TF 除以的是当篇文档的总词数,目的是把“词出现次数”转为“词在文档中的占比”,消除单篇文档长度的影响。A 是全库统计,C 是 DF 的概念,D 是查询统计,均不正确。
Q6. 以下哪些属于 TF-IDF 变体设计中常见的改进手法?
- A.对 IDF 的分母进行加一平滑← 正确答案
- B.对词频进行对数变换← 正确答案
- C.引入文档长度归一化← 正确答案
- D.用深度神经网络替代所有词频统计
答案:ABC。A(加法平滑)、B(对数变换)、C(长度归一化)都是经典的 TF-IDF 变体,目的是提高稳健性和跨文档公平性。D 属于完全不同的语义模型路线,不是对 TF-IDF 的“变体设计”。
Q7. 平滑 IDF 公式 \(\ln((N+1)/(n_t+1)) + 1\) 相比基础版 \(\ln(N/n_t)\) 的主要优势是什么?
- A.保证 IDF 恒为正且最小值为 1← 正确答案
- B.让 IDF 能取到负值从而降权
- C.使 IDF 与文档长度完全无关
- D.让 TF-IDF 的值恒等于查询词数量
答案:A。平滑公式通过分子分母加 1 避免了 \(n_t = 0\) 时的除零错误,整体加 1 使 IDF 下界为 1,即使常见词也有最小权重。B 与平滑目的相反,C 是长度归一化的职责,D 更是无稽之谈。
Q8. 在长文档场景下,原始 TF-IDF 的主要缺陷是什么?
- A.文档越长,IDF 被自动放大得越大
- B.长文档累积更高词频,排序偏向长文档← 正确答案
- C.长文档中的词被过度归一化成零
- D.查询中的词数会随文档长度增加
答案:B。长文档词数多,每个词的绝对出现次数天然更高,即使做了 TF 归一化,累计的分值仍然偏向长文档。这需要额外的长度归一化或 BM25 中的 \(b\) 参数来修正。A 与 IDF 无直接关系,C 是归一化过度的反向错误,D 与文档长度无关。
Q9. 关于 BM25 对 TF-IDF 的改进动机,以下说法正确的有哪些?
- A.让词频贡献随次数增加而饱和← 正确答案
- B.引入参数 b 控制文档长度惩罚← 正确答案
- C.完全抛弃 IDF 只用词频排序
- D.用 k1 调节词频增长曲线的形状← 正确答案
答案:ABD。BM25 的核心动机是修正 TF 的线性增长问题,使其饱和,并引入 \(b\) 参数做长度归一化。A、B、D 都是正确的改进点;C 错误,BM25 依然保留 IDF 项(通常用 \(\ln((N-n_t+0.5)/(n_t+0.5))\)),并非完全抛弃。
Q10. 以下哪个场景最不适合直接使用原始 TF-IDF 进行文档排序?
- A.短新闻标题集合的检索排序
- B.中等规模语料库中关键词区分度排序
- C.对每篇文档提取高频关键词做标签
- D.长度差异巨大的论文库相关度排序← 正确答案
答案:D。论文库中文档长度差异极大,原始 TF-IDF 未做跨文档长度归一化,会导致长论文因累积词频而虚高。此时应使用带长度归一化的 BM25 或引入额外修正。A、B、C 中文档长度相对均匀或对长度不敏感,TF-IDF 都能较好地工作。