小李是“知味轩”餐厅的主厨。他有个习惯:为每道菜写一张“风味名片”,客人凭名片上的食材排序来找菜。起初他的办法很朴素——数食材出现的次数,次数多的排前面。可写着写着他发现不对劲:番茄炒蛋里“番茄”“蛋”确实该靠前,但每道菜都少不了的“水”“盐”也凑了进来,名片越写越没区分度。更麻烦的是,一道菜里蒜放了三瓣和九瓣,名片都得写成“蒜香浓郁”,可重复那么多次,风味真的翻倍了吗?这两个困扰,正是 TF-IDF 两个经典变体要解决的问题:sublinear TF(次线性词频)压制重复带来的边际收益,max df(最大文档频率)把烂大街的常见词直接倒掉。本文将用这位主厨的后厨故事,把这两个变体的原理、公式、调参与落地讲透,让零基础读者也能建立从“数次数”到“看稀缺”的完整直觉。

岗位关联

对 AI 从业者而言,TF-IDF 变体是检索、分类、推荐三大方向共用的基础调味料。理解 sublinear 与 max df,你就能在特征工程和相关性排序里少走弯路,让模型效果稳定提升几个百分点。

目录
  1. 可视化演示
  2. 变体动机:为什么非要改
  3. 次线性词频:第一勺最咸
  4. MaxDF 过滤:倒掉那盆水
  5. 参数调优:试菜的艺术
  6. 效果评估:品鉴团打分
  7. 应用落地:开向连锁店
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

模拟Sublinear TF变换、Max DF过滤与IDF权重曲线,展示TF-IDF变体如何改善文本特征质量与检索效果。

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

模式1:Sublinear TF变换 标准TF线性增长 Sublinear对数压缩 tf_sub = 1 + log(tf) 对数压缩降低高频词支配。

变体动机:为什么非要改

小李是“知味轩”餐厅的主厨。他有个习惯:为每道菜写一张“风味名片”,客人凭名片上的食材排序来找菜。起初他的办法很朴素——数食材出现的次数,次数多的排前面。可写着写着他发现不对劲:番茄炒蛋里“番茄”“蛋”确实该靠前,但每道菜都少不了的“水”“盐”也凑了进来,名片越写越没区分度。他问自己:数次数,真的能代表风味吗?

在信息检索的世界里,小李的“菜谱”就是文档,“食材”就是词(term)。一种经典打分法是 TF-IDF:词频(Term Frequency)衡量一个词在文档里的分量,逆文档频率(Inverse Document Frequency)衡量它在整个语料里有多稀有,两者相乘得到词的权重。基础公式如下:

但原始 TF 有两个天生的毛病。第一,它按次数线性累加,长文档天然有更高的词频,容易被整体放大;第二,一个词重复 5 次和重复 20 次的信噪比差距远没有 4 倍。再加上只靠 IDF 压不住“又常见又高频”的词,于是业界提出了两类最实用的变体——次线性 TF(sublinear tf)和最大文档频率过滤(max df),也就是本文的主角。

用小李的话说:“数次数只是入门,真正的大厨还要问两个问题:重复加了这么多,风味真的翻倍了吗?这道菜人人都有,写上去还有意义吗?”这两个问题,正是两个变体要解决的事。

tfidf(t,d)=tf(t,d)×log⁡Ndf(t)\mathrm{tfidf}(t,d)=\mathrm{tf}(t,d)\times\log\frac{N}{\mathrm{df}(t)}
通俗地讲:TF 是“这道菜里放了多少”,IDF 是“整个菜单里这道食材稀不稀有”。
  1. 词频 $\mathrm{tf}(t,d)$统计词 $t$ 在文档 $d$ 中出现的次数,它是权重的“分量”。
    tf(t,d)=词 t 在文档 d 中出现的次数\mathrm{tf}(t,d)=\text{词 }t\text{ 在文档 }d\text{ 中出现的次数}
  2. 文档频率 $\mathrm{df}(t)$统计整个语料里有多少篇文档包含词 $t$,用于衡量它有多常见。
    df(t)=∣{d:t∈d}∣\mathrm{df}(t)=\left|\{d:t\in d\}\right|
  3. 稀有度 $\log\frac{N}{\mathrm{df}(t)}$文档总数除以包含该词的文档数再取对数,词越常见该值越小,作为“稀缺度”折扣。

次线性词频:第一勺最咸

小李在调一碗牛骨汤时顿悟:第一勺盐下去,咸味立刻点亮整碗汤;第二勺还能尝出来;到第五勺、第十勺,舌头几乎麻木了。他对徒弟说:“味觉对重复刺激是递减的——第一勺盐最咸。”这让他联想到名片上的食材次数:蒜放了三瓣和九瓣,名次能写成九倍吗?

词频也是同理。一个词在一篇文档中出现 1 次和 10 次,提供的信息量远没有 10 倍差距;出现 100 次和 200 次更是几乎没差别。次线性 TF(sublinear tf)要做的,就是让“重复”的收益逐步递减,别让高频词靠堆次数霸占名片。最常见的实现是取对数后用 $1+\log\mathrm{tf}$,加 1 是为了让 tf=1 时权重保持为 1,与原始计数平滑衔接;对数底用自然常数还是 2 差别不大,只影响整体缩放。

小李把这条经验写进了后厨手册:“第一勺最咸,第十勺白搭。”sublinear TF 让名片的排序更诚实——一道菜里蒜放了三瓣、六瓣、九瓣,名片上不会写出九倍的蒜味,而是温和地说一声“蒜香浓郁”。

tf′(t,d)={1+log⁡tf(t,d),tf(t,d)>00,tf(t,d)=0\mathrm{tf}'(t,d)=\begin{cases}1+\log\mathrm{tf}(t,d),&\mathrm{tf}(t,d)>0\\0,&\mathrm{tf}(t,d)=0\end{cases}
通俗说明:出现 1 次得 1 分;2 次约 1.69 分(自然对数);10 次约 3.3 分——重复 10 倍,分数只涨 2 倍多,这就是“递减”。
  1. 出现词分支当词确实在文档中出现时,取 $1+\log\mathrm{tf}(t,d)$,把“翻倍次数”压缩成“递增增量”。
    1+log⁡1=1,1+log⁡10≈3.31+\log 1=1,\quad 1+\log 10\approx 3.3
  2. 未出现分支当词没出现时直接取 0,因为 $\log 0$ 无意义,且没出现的词本就不该有分量。
    tf′(t,d)=0\mathrm{tf}'(t,d)=0
  3. 与 IDF 结合最终权重等于次线性词频乘上稀缺度,两个因子各司其职。
    w(t,d)=(1+log⁡tf(t,d))×log⁡Ndf(t)w(t,d)=\bigl(1+\log\mathrm{tf}(t,d)\bigr)\times\log\frac{N}{\mathrm{df}(t)}

MaxDF 过滤:倒掉那盆水

小李整理名片时,桌角总堆着一批“废料”食材:水、盐、食用油——餐厅 95% 的菜品都用它们。徒弟问要不要写进名片,小李摇头:“家家户户都有,写上去等于没写。”他定下规矩:出现在超过七成菜品里的食材,直接不上名片。这把废料篓,就是 max df 的雏形。

检索里的“水盐”就是那些文档频率(df)过高的词。df 衡量一个词在多少篇文档里出现,df 越高说明越常见、区分度越低。max df(最大文档频率)的做法是设定一个比例阈值 $\lambda$,凡是 df 超过 $\lambda N$ 的词,一律从词表里剔除——相当于一张数据驱动的自动停用词表。

它和 min_df(最小文档频率)是一对搭档:min_df 过滤只出现一两次的生僻词,避免统计噪声;max_df 过滤烂大街词汇,避免“水盐”稀释区分度。相比人工维护的静态停用词表,max_df 的独特优势是能抓住“这本语料特有”的泛滥词——比如某个社区里刷屏的“打卡”“集美”,人工词表永远跟不上。

小李的废料筐越用越顺手。它告诉后厨一个道理:名片的价值不在于写了多少食材,而在于敢把没用的划掉。“水、盐、油”退场后,松露的香气才真正浮出水面。

V={t  |  df(t)≤λN},λ=max_df\mathcal{V}=\left\{t\;\middle|\;\mathrm{df}(t)\le\lambda N\right\},\quad\lambda=\mathrm{max\_df}
通俗说:词表只收“没烂大街”的词;$\lambda$ 越小门槛越严,常见经验值是 0.5~0.9。
  1. 比例阈值 $\lambda$max_df 通常写成分数,0.7 表示“允许最多 70% 的文档包含该词”。
    λ=max_df,0<λ<1\lambda=\mathrm{max\_df},\quad 0<\lambda<1
  2. 判定不等式把词 $t$ 的文档频率 $\mathrm{df}(t)$ 与 $\lambda N$ 比较,超过则出局。
    df(t)>λN  ⇒  t 被过滤\mathrm{df}(t)>\lambda N\;\Rightarrow\;t\text{ 被过滤}
  3. 保留词表所有没超标的词构成最终词汇表 $\mathcal{V}$,后续打分只在这个词表内进行。

参数调优:试菜的艺术

阈值到底设多大?小李先试 0.3——结果把“蒜”“胡椒”都滤掉了,招牌菜名片变得寡淡;再试 0.9——等于没滤,水盐照旧上榜。最后他在 0.5 到 0.7 之间反复试,才算找到这家店的最佳比例。他的结论是:调料比例看菜系,过滤阈值看语料。

工程实践里有一些经验默认值:sklearn 的 TfidfVectorizer 默认 sublinear_tf=False、max_df=1.0,也就是说两个变体默认都没开启,需要显式配置。短文本场景(新闻标题、商品短标题)常用 max_df=0.5~0.7;长文本和垂直领域语料可以放宽到 0.8~0.95;而 sublinear_tf=True 几乎总是安全的选择,因为它只压缩重复收益,不牺牲任何词。

更严谨的做法是用验证集做参数搜索:把 max_df 和次线性开关作为候选组合,用网格搜索选出让效果指标最优的一组。指标常用 F1——精确率与召回率的调和平均,它同时惩罚“端错菜”和“漏菜”。

好的主厨会按季节换菜单、按客人调咸淡。好的调参工程师也不会照抄默认值,而是用自己的验证集“试菜”——毕竟同一勺盐,在成都和广州的客人尝起来完全不同。

F1=2PRP+R,P=TPTP+FP,R=TPTP+FNF_1=\frac{2PR}{P+R},\quad P=\frac{TP}{TP+FP},\quad R=\frac{TP}{TP+FN}
通俗说:F1 越高说明“端上来的菜既对味又齐全”;精确率 P 管对不对,召回率 R 管齐不齐。
  1. 精确率 P检索结果中真正相关文档的比例,衡量“端上来的菜对不对”。
    P=TPTP+FPP=\frac{TP}{TP+FP}
  2. 召回率 R所有相关文档中被检索出来的比例,衡量“该上的菜上齐没”。
    R=TPTP+FNR=\frac{TP}{TP+FN}
  3. 调和平均 $F_1$对 P 和 R 取调和平均,防止某一项偏科,数值越接近 1 越好。

效果评估:品鉴团打分

改了配方后,小李请来熟客品鉴团。品鉴团只问两个问题:端上来的菜是不是我想吃的?我想吃的菜上齐了吗?不过对搜索引擎来说,还有一个更精细的问题:我想要的菜,有没有排在菜单最前面?

sublinear TF 和 max df 的效果,在很多公开语料上有稳定的正向收益。sublinear 把堆词文档的高频权重压下来,长文档不再靠重复刷分;max df 把“通稿词”清出词表后,中频关键词开始主导排序。典型实验里,sublinear_tf=True + max_df=0.8 相比原始 TF-IDF,F1 能提升数个百分点,语料越脏(噪声越多)收益越明显。这正对应思维导图中的“检索准确率提升、召回率改善、鲁棒性增强”。

工业界看排序质量更常用 NDCG——它不只关心文档相关不相关,还关心相关文档是否真的排在了前面。

品鉴团把“招牌松露面”从第 9 名挪到第 2 名时,小李知道这两个变体起作用了——它们没有发明新菜,只是让真正的好菜不再被“水盐系”挤到菜单角落。

NDCG@k=1IDCG@k∑i=1k2reli−1log⁡2(i+1)\mathrm{NDCG@k}=\frac{1}{\mathrm{IDCG@k}}\sum_{i=1}^{k}\frac{2^{\mathrm{rel}_i}-1}{\log_2(i+1)}
通俗说:越相关且排得越靠前,得分越高;用理想排序的得分做归一化,NDCG 最高为 1。
  1. 相关性等级 $\mathrm{rel}_i$第 $i$ 个位置的文档与查询的相关程度,通常人工标成 0~3 分。
    reli∈{0,1,2,3}\mathrm{rel}_i\in\{0,1,2,3\}
  2. 折损累加每个位置的收益随名次靠后按 $\log_2(i+1)$ 折损,再全部求和。
    DCG@k=∑i=1k2reli−1log⁡2(i+1)\mathrm{DCG@k}=\sum_{i=1}^{k}\frac{2^{\mathrm{rel}_i}-1}{\log_2(i+1)}
  3. 归一化除以理想排序的 $\mathrm{IDCG@k}$,得到 0~1 的 NDCG,方便跨查询比较。

应用落地:开向连锁店

小李的“风味名片”法从一家店火到了整个餐饮集团。总部把它写成标准手册:先压重复增量(sublinear TF),再滤烂大街食材(max df),最后按稀有度排序(IDF)。搜索引擎、文本分类、推荐系统都来“抄作业”。

搜索引擎的相关性打分中,查询词与文档的匹配权重就是这个权重公式;更进阶的 BM25 在它基础上又加了词频饱和度和文档长度归一化,可以看作 sublinear 思想的集大成者。文本分类用 sklearn 一行配置就能完成特征工程——TfidfVectorizer(sublinear_tf=True, max_df=0.8)。推荐系统的内容画像则把每篇文档变成权重向量,用来计算物品相似度和召回候选。

生产环境有几个细节要留意:df 统计来自全量语料,新文档上线后要增量更新;max_df 在离线阶段就把词表固定,线上只查表;idf 预计算成数组,打分时 O(1) 读取。最终权重公式把两个变体合在一起:

连锁店的后厨墙上都挂着同一块牌子:“重复不贪多,常见不废话。”sublinear TF 管住贪多,max df 管住废话——这两条后厨铁律,如今也是整个检索家族入门的第一课。

w(t,d)=(1+log⁡tf(t,d))×log⁡Ndf(t),df(t)≤λNw(t,d)=\bigl(1+\log\mathrm{tf}(t,d)\bigr)\times\log\frac{N}{\mathrm{df}(t)},\quad \mathrm{df}(t)\le\lambda N
一句话理解:“先算次线性分量,再乘稀缺度,且只对过审的词使用”——一行公式同时收编两个变体。
  1. 过审条件词 $t$ 必须先满足 $\mathrm{df}(t)\le\lambda N$,被 max df 滤掉的词没有权重可言。
    df(t)≤λN\mathrm{df}(t)\le\lambda N
  2. 次线性分量$1+\log\mathrm{tf}(t,d)$ 负责压缩重复收益,对应 sublinear TF。
    1+log⁡tf(t,d)1+\log\mathrm{tf}(t,d)
  3. 稀缺度加权$\log\frac{N}{\mathrm{df}(t)}$ 负责突出稀有词,是 IDF 的经典形式。

AI 应用场景

电商搜索引擎排序

阶段:召回与排序阶段的相关性特征计算

解决的问题:商家在商品详情里反复堆砌“包邮”“正品”等词来刷高词频权重,原始 TF 会让这些堆砌词挤占排序位次;同时“女装”“男装”这类全站高频词区分度极低。sublinear TF 让堆词收益递减,max_df 把全站泛滥词直接剔出打分体系,排序更贴近用户真实意图。

具体案例:某电商平台对千万级商品标题做相关性排序升级:分词 → 统计 df → max_df 过滤 → sublinear_tf 打分。上线后搜索“连衣裙 长款”的点击率提升 4%,无效堆词商品跌出首页。

舆情文本分类

阶段:特征工程

解决的问题:原始 TF-IDF 特征里,“公司”“产品”“表示”这类新闻通稿词在几乎所有文档出现,占据大量特征维度甚至干扰分类器;sublinear + max_df 压缩后特征更干净、泛化更强。

具体案例:某舆情系统用 TfidfVectorizer(sublinear_tf=True, max_df=0.8, max_features=50000) 生成文本特征送入逻辑回归,分类 F1 从 0.83 提到 0.87。

推荐系统内容画像

阶段:内容理解与召回

解决的问题:给文章打标签时,每篇长文重复出现的高频词会淹没真正的主题词,导致相似度计算跑偏;平台级高频词(如“小编”“点击”)进一步稀释画像。

具体案例:某资讯 App 用 TF-IDF 变体给每篇文章抽取 20 个主题词建立画像,再按向量相似度做 item2item 召回;max_df 过滤掉平台级高频词后,相似推荐的相关性明显改善。

Python 演示

python39 行
import mathfrom collections import Counter # 五道"菜"(文档),已经分好词docs = [    "这家 餐厅 的 松露 意面 很 好吃",    "这家 餐厅 的 烤鸭 很 有名",    "松露 巧克力 配 咖啡 一绝",    "今天 天气 不错 我们 去 公园",    "咖啡 和 松露 都 是 我们 的 最爱",]max_df = 0.7  # 超过 70% 文档出现的词直接剔除 def sublinear(tf):    # 1 + log(tf):第一勺最咸,后几勺收益递减    return 1 + math.log(tf) if tf > 0 else 0 doc_tfs = []df = Counter()N = len(docs)for doc in docs:    tokens = doc.split()    tf = Counter(tokens)    doc_tfs.append(tf)    for term in tf:        df[term] += 1 # max_df 过滤:数据驱动的停用词表vocab = [t for t in df if df[t] / N <= max_df] def tfidf(tf, df_t):    idf = math.log((N + 1) / (df_t + 1)) + 1  # 平滑 idf,防止除零    return sublinear(tf) * idf print("过滤后词表:", " ".join(sorted(vocab)))print()for i, tf in enumerate(doc_tfs):    vec = {t: round(tfidf(tf[t], df[t]), 3) for t in vocab if t in tf}    print("文档%d 向量: %s" % (i + 1, vec))
目的:用纯 Python 从零实现带 sublinear TF 和 max_df 过滤的 TF-IDF,输出过滤后的词表和各文档的权重向量,直观看到“水盐被倒掉、松露浮现”的过程。
  1. max_df = 0.7定下过滤阈值:超过 70% 文档出现的词直接剔除,这是数据驱动的“停用词表”。
  2. return 1 + math.log(tf) if tf > 0 else 0次线性核心:重复越多,每勺增量越小;tf 为 0 时返回 0 保护。
  3. df = Counter()用一个计数器统计每个词出现在多少篇文档里,这是计算 df 的基础。
  4. vocab = [t for t in df if df[t] / N <= max_df]按比例过滤出最终词表,“的”因出现在 80% 文档中被剔除,“松露”因只有 60% 被保留。
  5. idf = math.log((N + 1) / (df_t + 1)) + 1平滑版 IDF,避免小语料里出现除零和负权重的极端情况。

常见误区

误区看到对数变换就以为权重被压到 0,觉得“次线性就是把出现很多次的词去掉”。于是有人问:那还需要 max_df 干嘛?

正解sublinear 只是让权重增量递减,并不会清零。tf=1 时权重是 1,tf=10 时约 3.3,tf=100 时约 5.6——词还在,只是重复的边际收益变小了。真正把词“删除”的是 max_df,两者一个管“分量”、一个管“去留”,职责完全不同。

为何常见:“次线性”和“过滤”在直觉上都像“打压高频词”,初学者容易把两种机制混为一谈。

误区有人觉得稀有词最有区分度,于是把 max_df 设成 0.1 甚至 0.05,认为保留的全是“精华”。

正解max_df 过小会把大量中频有用词(如“餐厅”“咖啡”)误伤剔除,词表严重缩水,召回率大跌。稀有度只是参考,中频词在区分同类文档时同样重要。实践里 0.5~0.95 是常见区间,具体要靠验证集上试,而不是一味求小。

为何常见:把“稀有”等同于“重要”,忽略了信息检索既要精准也要召回,两者需要平衡。

误区“既然 max_df 能自动删常见词,那人工停用词表是不是可以扔了?”

正解静态停用词表靠人工维护,覆盖的是“的、了、是”这类语言通用词;max_df 是数据驱动的,能发现语料特有的泛滥词,比如某个垂直社区刷屏的“打卡”“集美”。两者互补:先叠加人工停用词表,再用 max_df 兜底统计层面的泛滥词。

为何常见:两者表面上都在“删常见词”,但依据完全不同——一个是语言常识,一个是语料统计。

误区写代码时把 `1 + log(tf)` 误写成 `1 + log(idf)`,认为反正都是对数,给谁的 log 都一样。

正解对数变换只作用在词频 tf 上,因为要压缩的是“重复出现的增量”;IDF 本身已经是对数形式 $\log(N/\mathrm{df})$,再取对数会把稀缺度的差异也压平,反而破坏区分度。

为何常见:公式里同时出现两个 log,位置一不留神就记混,本质是没有理清“压重复”和“量稀缺”是两件事。

误区在 sklearn 里直接 `TfidfVectorizer()` 就以为已经用了 sublinear 和 max_df。

正解TfidfVectorizer 的默认值是 sublinear_tf=False、max_df=1.0、min_df=1,即两个变体默认都没开。要显式设置 sublinear_tf=True, max_df=0.8 才会生效,而且阈值还要根据语料调整。

为何常见:教程里演示的“最优配置”看多了,误以为这些参数是默认行为,忽略了框架的出厂设置。

面试题

Q1. sublinear TF 对高频词权重的处理方式是?

单选题 · easy

  • A.直接清零
  • B.压缩增量← 正确答案
  • C.放大权重
  • D.保持不变

答案:B。sublinear TF 通过 $1+\log\mathrm{tf}$ 让重复词带来的权重增量不断缩小,而不是把词频清零。它只压缩“重复的边际收益”,好比第一勺盐最咸,之后每勺的增咸效果都在递减。

Q2. 某词 tf=8,采用 $1+\log_2(\mathrm{tf})$ 的 sublinear 变换后权重为?

单选题 · easy

  • A.2
  • B.4← 正确答案
  • C.8
  • D.16

答案:B。$1+\log_2 8=1+3=4$。对数把 8 倍的重复压缩成 3 个单位增量,这正是“收益递减”的体现。若用自然对数则约等于 3.08,底数不影响词的相对排序。

Q3. max_df 过滤的作用是什么?

单选题 · easy

  • A.剔除太常见词← 正确答案
  • B.放大稀有词
  • C.压缩长文档
  • D.增加词表量

答案:A。max_df 按文档频率比例过滤掉出现在太多文档里的词,因为这些词区分度低。它不负责放大稀有词(那是 IDF 的事),也不压缩长文档(那是 sublinear 的事),更不会让词表变大。

Q4. 5000 篇文档,设置 max_df=0.8,某词出现在 4200 篇,该词会?

单选题 · mid

  • A.保留进词表
  • B.被过滤剔除← 正确答案
  • C.权重自动加一
  • D.变成主关键词

答案:B。4200/5000=0.84,大于阈值 0.8,词被从词表中剔除。这说明 max_df 是数据驱动的:同一个词换一组语料,df 比例变了,去留就可能反转。

Q5. sublinear TF 与 IDF 谁负责度量词的稀有度?

单选题 · mid

  • A.两者都不负责
  • B.两者都负责
  • C.只有 IDF 负责← 正确答案
  • D.只有 TF 负责

答案:C。稀有度完全由 IDF 的 $\log(N/\mathrm{df})$ 来衡量;TF 只负责“在文档里出现多少”,即便做了次线性变换,也不度量稀有度。两者一个管分量、一个管稀缺,各司其职。

Q6. 原始 TF 最典型的缺陷是什么?

单选题 · hard

  • A.长文档词频被放大← 正确答案
  • B.短文档词频更大
  • C.词表会变小变少
  • D.IDF 无法计算

答案:A。原始 TF 按次数线性累加,长文档天然累积更多词频,容易靠“堆字数”刷高分;sublinear TF 正是用来修正这个线性放大的。选项 B 与现象相反,C 和 D 与词表、IDF 的计算无关。

Q7. sklearn 中应如何开启 sublinear 变换?

单选题 · hard

  • A.max_df 设为 0.85
  • B.sublinear_tf 开启← 正确答案
  • C.norm 设置为 l2
  • D.smooth_idf 开启

答案:B。sklearn 中开启次线性词频的参数是 sublinear_tf=True;max_df 负责过滤常见词,norm 控制向量归一化,smooth_idf 控制 IDF 平滑,都与次线性变换无关。

Q8. 下列哪些属于 TF-IDF 常见变体?

多选题 · mid

  • A.次线性词频← 正确答案
  • B.最大文档频率过滤← 正确答案
  • C.最小文档频率过滤← 正确答案
  • D.修改分词器

答案:ABC。次线性词频、最大文档频率过滤、最小文档频率过滤都是 TF-IDF 的经典变体,分别解决重复收益、常见词泛滥和低频噪声问题;修改分词器属于前置处理,不算 TF-IDF 变体。

Q9. 关于 sublinear TF 的说法,正确的有?

多选题 · mid

  • A.重复收益递减← 正确答案
  • B.第一勺最咸← 正确答案
  • C.高频词被清零
  • D.权重线性增长

答案:AB。sublinear 的核心是“重复收益递减”,“第一勺最咸”正是它的生活化表达;它不会清零高频词,也不会让权重线性增长。C 和 D 与定义相悖。

Q10. max_df 设置过小(如 0.1)可能带来哪些后果?

多选题 · extreme

  • A.中频词被误伤← 正确答案
  • B.词表严重缩水← 正确答案
  • C.检索效果变差← 正确答案
  • D.词表反而膨胀

答案:ABC。max_df 设太小时,大量中频词甚至有用词都会因出现在 10% 以上文档而被剔除,词表严重缩水,召回率和排序质量明显变差。词表只会变小,不会膨胀,D 与逻辑相反。