想象你是一个快递仓库的资深分拣员老王。仓库里有十万个包裹,每个包裹里装着五花八门的物品。有一天客服跑来喊:“老王,快帮我找那个装着蓝色水晶奖杯的包裹!”你低头一看,发现工作台上躺着两个包裹:A 包裹里有 3 包纸巾,B 包裹里有 2 包纸巾——你瞬间傻眼了。只靠纸巾这种“满仓库都有”的常见词,你根本分不清哪个是客户要的。但如果其中一个包裹里除了纸巾,还夹着一张写着“六核处理器保修单”的纸条,你立刻就能锁定它。 这个场景,就是搜索引擎的日常。搜索系统面对的“包裹”叫文档,“物品”叫词语,而它最需要回答的问题是:当一个用户输入查询词时,怎么判断哪些文档更相关? TF-IDF 就是这个问题的第一把钥匙——它给每个词语打一个“辨识度分数”,让“常见词”贬值,让“稀有词”升值,从而帮助系统把手里的文档按相关度排好队。

岗位关联

理解 TF-IDF 是入门信息检索的必经之路。它不仅是搜索引擎排名的地基,更是随后 BM25 等现代检索模型的直接改进来源。掌握它,你就拿到了理解搜索、推荐、文本挖掘等 AI 应用的核心思维。

目录
  1. 可视化演示
  2. 检索困境:为什么要给词语打分
  3. 词频计算:数出热度
  4. 逆文档频率:衡量稀有度
  5. 权重公式:TF × IDF 相乘
  6. 平滑变体:让打分更稳健
  7. 场景表现:不同仓库不同策略
  8. 参数调优:敏感性与 BM25 动机
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

查看TF-IDF词频与逆文档频率计算流程,BM25引入词频饱和与长度归一化的改进,以及两模型相关性评分对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

检索相关性评分 TF-IDF基础权重 BM25 词频饱和+长度归一

检索困境:为什么要给词语打分

想象你刚做快递分拣员的那一天:客户报出“帮我找有蓝色水晶奖杯的包裹”,你随手翻了两个包裹,发现里面全是纸巾。你这才意识到,词语就像包裹里的物品,单看名称并不能告诉你它有没有价值。在文档的世界里,一个词“长什么样”并不重要,重要的是“它在哪一份文档里出现、又在多少份文档里出现”。

在信息检索系统里,用户输入一句查询,系统面对的是成千上万份文档。文本本身是没法直接做数学运算的,所以第一步就是把文档拆解成一个个词语特征,再给每个特征赋一个数值。关键问题来了:怎么给“词语—文档”关系打一个合理的分数? 如果只数词的出现次数,那么“的、了、是”这种满篇都是的词会霸占榜单,但它们对区分文档毫无帮助。

一种直觉的解法是:把分数拆成两部分——先看这个词在文档内部热不热(局部信号),再看它在整个文档库里稀不稀(全局信号)。二者相乘,就能得到一个既有热度、又有辨识度的评分。

老王听完这个设计恍然大悟:他要找的“蓝色水晶奖杯”之所以能帮他锁定包裹,不是因为它在包裹里出现了多少次,而是因为整个仓库只有这一个包裹有它。局部的热度配合全局的稀有,辨识度才真正立起来。

score(t,d)=local(t,d)×global(t)\displaystyle \text{score}(t, d) = \text{local}(t, d) \times \text{global}(t)
这个公式是 TF-IDF 的骨架:局部热度与全局稀有度的乘积,构成了词项对文档的“辨识度总分”。
  1. 局部热度\(\text{local}(t, d)\) 刻画词 \(t\) 在文档 \(d\) 中被使用的频繁程度,对应后文的 TF。
    local(t,d)=TF(t,d)\displaystyle \text{local}(t, d) = \text{TF}(t, d)
  2. 全局稀有度\(\text{global}(t)\) 衡量词 \(t\) 在整个文档库中的罕见程度,对应后文的 IDF。
    global(t)=IDF(t)\displaystyle \text{global}(t) = \text{IDF}(t)
  3. 组合辨识度两项相乘,稀缺且高频的词获得高分,泛滥的词被压制。
    score(t,d)=TF(t,d)×IDF(t)\displaystyle \text{score}(t, d) = \text{TF}(t, d) \times \text{IDF}(t)

词频计算:数出热度

老王决定先把第一个信号搞定:数一数某个物品在包裹里出现了几次。这个数字自然叫词频(Term Frequency, TF)——词 \(t\) 在文档 \(d\) 中出现的原始次数,记作 \(f_{t,d}\)。包裹 A 里 10 件物品中有 3 包纸巾,纸巾的原始词频就是 3。

但老王很快发现一个坑:包裹 B 有 100 件物品,里面也有 3 包纸巾。如果只看原始次数,两个包裹的“纸巾热度”一样,可包裹 B 明明更“稀释”——纸巾只占 3%。所以原始计数必须除以文档的总词数,得到归一化词频,也就是物品在包裹中的占比。

在这一步,老王给仓库里的每个包裹都做了一张“物品占比清单”。但占比高还不够——“纸巾”在 A 包裹里占了 30%,可如果客户要找“有纸巾的包裹”,仓库里八成包裹都有纸巾,这个指标依然没有区分度。词频只回答了“热不热”,还没回答“稀不稀”。

TF(t,d)=ft,d∑k=1nfk,d\displaystyle \text{TF}(t, d) = \frac{f_{t,d}}{\sum_{k=1}^{n} f_{k,d}}
归一化词频 = 词出现次数 ÷ 文档总词数。它表示“这个词在这份文档里占了多大分量”,消除了文档长度对热度的影响。
  1. 分子——词的原始计数\(f_{t,d}\) 表示词 \(t\) 在文档 \(d\) 中出现的次数。老王数出了 3 包纸巾,这个 3 就是原始计数。
    ft,d=3\displaystyle f_{t,d} = 3
  2. 分母——文档全部词的计数之和\(\sum_{k=1}^{n} f_{k,d}\) 把文档里所有不同词的出现次数全部加起来,得到文档总词数。
    ∑k=1nfk,d=nd\displaystyle \sum_{k=1}^{n} f_{k,d} = n_d
  3. 占比转换原始次数除以总词数,词频被压缩到 0 到 1 之间的比例,方便横向比较。
    TF=310=0.3\displaystyle \text{TF} = \frac{3}{10} = 0.3

逆文档频率:衡量稀有度

老王的第二步,是拎着一个物品去整个仓库转一圈,看它出现在多少个不同的包裹里。这个“出现在多少个包裹里”的数字,叫文档频率(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 分。稀有度,才是辨识度的真正底牌。

IDF(t)=ln⁡(Nnt)\displaystyle \text{IDF}(t) = \ln\left(\frac{N}{n_t}\right)
IDF = 文档总数 ÷ 包含该词的文档数,再取对数。它量化了一个词在全局的“稀有程度”,越稀有,值越高。
  1. 文档总数 \(N\)整个文档库中的文档数量。在老王的仓库里,\(N = 100000\)。
    N=100000\displaystyle N = 100000
  2. 词出现过的文档数 \(n_t\)统计有多少篇文档包含词 \(t\)。常见词的 \(n_t\) 很大,稀有词很小。
    nt=∣{d∈D:t∈d}∣\displaystyle n_t = |\{d \in D : t \in d\}|
  3. 稀有倍率\(N / n_t\) 表示这个词在整个库中被“稀释”到多少倍。倍率越大,越难得一见。
    Nnt=10000050000=2\displaystyle \frac{N}{n_t} = \frac{100000}{50000} = 2
  4. 对数压缩\(\ln\) 把 2、100000 这样的倍率压缩到温和的数值区间,避免极端词压过其他一切信号。
    ln⁡(2)≈0.693,ln⁡(100000)≈11.513\displaystyle \ln(2) \approx 0.693, \quad \ln(100000) \approx 11.513

权重公式:TF × IDF 相乘

老王手里现在有两张表:一张记着物品在包裹里的占比(TF),一张记着物品在整个仓库的稀有度(IDF)。他随手一算,发现光靠任何一张都不够:TF 高的“纸巾”在满仓库都是,IDF 高的“芯片”可能只在某个包裹里出现一次,热度不足。

于是他把两张表合二为一:先看这个物品在包裹里热不热,再看它在仓库里稀不稀,最后把两个数字相乘。这个乘积,就是经典的 TF-IDF 权重。

当用户输入一句查询 \(q\),它通常包含多个词语。把每个词的 TF-IDF 加起来,就得到文档 \(d\) 对查询 \(q\) 的整体相关度得分。按这个得分排序,最相关的文档自然排到最前面。

老王终于有了一张完整的工作台:他给每个包裹算出一个“总分”,客户再来说“找有蓝色水晶奖杯的包裹”时,他直接按分最高的包裹去找,一找一个准。TF-IDF 本质上就是把“热”与“稀”这两条线索拧成一股绳。

TF-IDF(t,d)=TF(t,d)×IDF(t)\displaystyle \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t)
查询由一个或多个词构成,文档对查询的总得分等于这些词的 TF-IDF 之和。
  1. TF 分量\(\text{TF}(t, d)\) 是词在文档中的占比,最大值不超过 1,它决定“这个词在文档里看着显眼吗”。
    TF(t,d)=ft,dnd\displaystyle \text{TF}(t, d) = \frac{f_{t,d}}{n_d}
  2. IDF 分量\(\text{IDF}(t)\) 是词在全库的稀有度,它决定“这个词在库里能引起多大注意”。
    IDF(t)=ln⁡Nnt\displaystyle \text{IDF}(t) = \ln\frac{N}{n_t}
  3. 组合乘积两者相乘,热度与稀有度都无法单独称霸——常见的词即使 TF 高,也会被低 IDF 拉低;太生僻的词即使 IDF 高,也会因 TF 低而得分不足。
    Score(q,d)=∑t∈qTF-IDF(t,d)\displaystyle \text{Score}(q, d) = \sum_{t \in q} \text{TF-IDF}(t, d)

平滑变体:让打分更稳健

用了一阵子,老王发现这套打分卡有几个扎手的毛病。第一,如果某个稀有词的文档频率 \(n_t = 0\)(词在库里完全没出现,比如客户输入了错别字),分母直接变零,计算崩溃;第二,如果 \(n_t = N\)(词出现在所有文档中),IDF 的值是 \(\ln(1) = 0\),看似没事,但某些变体下会出现负值,负分数在排序时会产生反直觉的结果。第三,长包裹和短包裹的词频天然不公正——长包裹更容易累积高 TF。

于是老王请来数学好的朋友帮忙打补丁。第一招:加法平滑,在 IDF 的分子分母上都加 1,再整体加 1,保证 IDF 恒为正数且最小不低于 1——这样即使某个词出现在所有文档里,它依然有一个微小的基础权重,而不是直接归零。

第二招叫长度归一化:词频不再只除以本包裹的物品总数,而是参照整个仓库的平均包裹大小来修正,避免“长包裹分数虚高、短包裹分数被压”的问题。两个补丁打完之后,老王的分拣准确率肉眼可见地上升了——他再也不会因为某个包裹“东西多”就误判它更相关了。

IDFsmooth(t)=ln⁡(N+1nt+1)+1\displaystyle \text{IDF}_{\text{smooth}}(t) = \ln\left(\frac{N + 1}{n_t + 1}\right) + 1
平滑 IDF 在分子分母同时加 1,再整体加 1,防止分母为零,同时保证 IDF 始终为正。
  1. 分母加一\(n_t + 1\) 确保即使词没有出现在任何文档中,分母也不会为 0。
    nt+1>0\displaystyle n_t + 1 > 0
  2. 分子加一\(N + 1\) 与分母配合,使比值在极端情况下依然有界、平滑。
    N+1nt+1=10000150001≈2.0\displaystyle \frac{N + 1}{n_t + 1} = \frac{100001}{50001} \approx 2.0
  3. 整体加一\(\ln(……) + 1\) 把 IDF 的下限抬到 1,让常见词也有最小权重,避免被完全忽略。
    IDFsmooth≥1\displaystyle \text{IDF}_{\text{smooth}} \geq 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,本质上是给“热度”加了上限,给“长度”加了矫正——这正是检索模型不断进化的缩影。

w(t,d)=IDF(t)×ft,d⋅(k1+1)ft,d+k1⋅(1−b+b⋅∣d∣L)\displaystyle \text{w}(t, d) = \text{IDF}(t) \times \frac{f_{t,d} \cdot (k_1 + 1)}{f_{t,d} + k_1 \cdot \left(1 - b + b \cdot \frac{|d|}{L}\right)}
BM25 对 TF 做饱和压缩:\(k_1\) 控制词频增长曲线的形状,值越大饱和越慢;\(b\) 控制长度归一化的强度,值越大对长文档的惩罚越狠。
  1. IDF 因子\(\text{IDF}(t)\) 继续承担全局稀有度打分,继承 TF-IDF 的核心思想。
    IDF(t)=ln⁡N−nt+0.5nt+0.5\displaystyle \text{IDF}(t) = \ln\frac{N - n_t + 0.5}{n_t + 0.5}
  2. 饱和比例\(\displaystyle \frac{f_{t,d} \cdot (k_1 + 1)}{f_{t,d} + k_1}\) 中,当 \(f_{t,d}\) 从 1 涨到 10,比值涨得很快;从 50 涨到 100,比值几乎停滞,这就是“边际收益递减”。
    lim⁡f→∞f⋅(k1+1)f+k1=k1+1\displaystyle \lim_{f \to \infty} \frac{f \cdot (k_1 + 1)}{f + k_1} = k_1 + 1
  3. 长度归一化项\(\displaystyle 1 - b + b \cdot \frac{|d|}{L}\) 在文档长度等于平均长度 \(L\) 时取 1,不惩罚;文档越长,惩罚越大。
    b⋅∣d∣L,b∈[0,1]\displaystyle b \cdot \frac{|d|}{L}, \quad b \in [0, 1]

AI 应用场景

搜索引擎相关文档排名

阶段:召回与排序

解决的问题:传统方法单纯按关键词匹配,把所有包含查询词的文档不加区分地返回,常见词堆积的无关文档排在最前。TF-IDF 通过衡量词项对文档的辨识度,让稀有词命中者的得分被放大,从而把最相关的文档排到前面。

具体案例:用户在搜索引擎输入“量子纠缠 综述”,系统首先检索包含这些词的页面,然后利用 TF-IDF 计算每个页面的相关度得分并排序。一个只在标题里出现“量子纠缠”的前沿论文页面,比一个通篇都是“量子”却没提“纠缠”的科普页得分更高,因为“纠缠”的 IDF 更高。

关键词提取与文档摘要

阶段:特征工程与内容理解

解决的问题:从一篇长文档中人工提炼关键词耗时费力,且主观性太强。TF-IDF 可以自动计算文档中每个词的得分,按得分高低输出 top-k 关键词,作为自动摘要和文本标签的依据。

具体案例:新闻 APP 对一篇关于“新能源汽车电池回收”的报道做关键词提取。系统分词后计算每个词的 TF-IDF,发现“电池回收”得分远高于“报道”“记者”等高频词,于是自动打上“电池回收”“新能源”等标签,推送给关注此话题的用户。

文本去重与异常检测

阶段:数据清洗

解决的问题:在大规模文档库中,相似文档比例过高,简单按词频匹配会误判。TF-IDF 把文档转换为稀疏向量后,可以通过计算向量相似度找到近似重复的文档;反之,某篇文档中包含大量罕见词,说明其内容异常特殊,值得人工排查。

具体案例:一个企业知识库里堆积了上千份项目报告,运维工程师用 TF-IDF 向量计算两两报告的余弦相似度,找出 89 组高度重复的文档并合并;同时,一份包含大量行业黑话(高 IDF 词)的报告被系统标记为“专业度极高”,优先路由给资深专家审核。

Python 演示

python55 行
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()
目的:实现一个微型 TF-IDF 检索系统,对 5 篇文档进行索引,然后对输入的查询词计算每篇文档的相关度得分并排序,直观展示 TF-IDF 的完整流程。
  1. freq[w] = freq.get(w, 0) + 1逐词统计出现次数,等价于老王清点包裹里某种物品的数量。
  2. total = len(tokens)统计文档总词数,作为 TF 归一化的分母。
  3. {w: c / total for w, c in freq.items()}把原始计数转换为占比,得到 0 到 1 之间的归一化 TF。
  4. for w in set(tokens)用 set 去重后再统计文档频率,同一个词在一篇文档里出现多次只算一次。
  5. doc_freq[w] = doc_freq.get(w, 0) + 1统计包含词 w 的文档数 n_t,这是 IDF 的分母。
  6. math.log(N / d)计算逆文档频率,N 是文档总数,d 是包含该词的文档数。
  7. tf_map.get(t, 0) * idf_map.get(t, 0)对查询词 t 相乘得到 TF-IDF 权重;get 默认值 0 确保查询词没出现时得分为 0。
  8. 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 衡量的是什么?

单选题 · easy

  • A.词在文档中的局部出现热度← 正确答案
  • B.词在整个文档库中的文档数量
  • C.词在查询中的重要性程度
  • D.文档与查询之间的语义距离

答案:A。TF(词频)衡量的是词在某篇文档内部的出现频繁程度,是“局部热度”指标。B 是 DF(文档频率)的定义,C 属于查询权重范畴,D 需要语义模型而非词汇统计,均不符合 TF 的定义。

Q2. 在 IDF 公式 \(\ln(N / n_t)\) 中,\(n_t\) 表示什么?

单选题 · easy

  • A.词 t 在所有文档中出现的总次数
  • B.包含词 t 的文档数量← 正确答案
  • C.文档库中所有词的种数总和
  • D.查询中词 t 的重复次数

答案:B。\(n_t\) 是“文档频率”(DF),即有多少篇文档包含词 t。注意它与“词 t 出现的总次数”不同——同一篇文档里出现多次的 t 只贡献一次文档频率。C 是词表大小,D 是查询词频,都与 IDF 公式无关。

Q3. 如果一个词出现在文档库中的每一篇文档里,它的基础 IDF 值 \(\ln(N / n_t)\) 约为多少?

单选题 · mid

  • 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\)?

单选题 · mid

  • A.对数能压缩数值范围,防止稀有词分数失控← 正确答案
  • B.对数能把分数转换成概率
  • C.对数能加快词频统计的速度
  • D.对数能消除文档长度的影响

答案:A。当某词只在 1 篇文档中出现而库中有百万文档时,\(N / n_t = 10^6\),直接用会碾压其他信号。取对数后大约只有 13.8,压缩了极端值的影响,让得分更平稳。B、C 均无依据,D 是长度归一化解决的问题,不归对数管。

Q5. 在归一化词频公式中,TF 的分母应该除以什么?

单选题 · mid

  • A.整个文档库的总词数
  • B.该文档的总词数← 正确答案
  • C.包含该词的文档数量
  • D.用户查询的总词数

答案:B。归一化 TF 除以的是当篇文档的总词数,目的是把“词出现次数”转为“词在文档中的占比”,消除单篇文档长度的影响。A 是全库统计,C 是 DF 的概念,D 是查询统计,均不正确。

Q6. 以下哪些属于 TF-IDF 变体设计中常见的改进手法?

多选题 · mid

  • 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)\) 的主要优势是什么?

单选题 · hard

  • A.保证 IDF 恒为正且最小值为 1← 正确答案
  • B.让 IDF 能取到负值从而降权
  • C.使 IDF 与文档长度完全无关
  • D.让 TF-IDF 的值恒等于查询词数量

答案:A。平滑公式通过分子分母加 1 避免了 \(n_t = 0\) 时的除零错误,整体加 1 使 IDF 下界为 1,即使常见词也有最小权重。B 与平滑目的相反,C 是长度归一化的职责,D 更是无稽之谈。

Q8. 在长文档场景下,原始 TF-IDF 的主要缺陷是什么?

单选题 · hard

  • A.文档越长,IDF 被自动放大得越大
  • B.长文档累积更高词频,排序偏向长文档← 正确答案
  • C.长文档中的词被过度归一化成零
  • D.查询中的词数会随文档长度增加

答案:B。长文档词数多,每个词的绝对出现次数天然更高,即使做了 TF 归一化,累计的分值仍然偏向长文档。这需要额外的长度归一化或 BM25 中的 \(b\) 参数来修正。A 与 IDF 无直接关系,C 是归一化过度的反向错误,D 与文档长度无关。

Q9. 关于 BM25 对 TF-IDF 的改进动机,以下说法正确的有哪些?

多选题 · hard

  • 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 进行文档排序?

单选题 · extreme

  • A.短新闻标题集合的检索排序
  • B.中等规模语料库中关键词区分度排序
  • C.对每篇文档提取高频关键词做标签
  • D.长度差异巨大的论文库相关度排序← 正确答案

答案:D。论文库中文档长度差异极大,原始 TF-IDF 未做跨文档长度归一化,会导致长论文因累积词频而虚高。此时应使用带长度归一化的 BM25 或引入额外修正。A、B、C 中文档长度相对均匀或对长度不敏感,TF-IDF 都能较好地工作。