TF-IDF 向量化模拟器 返回
机器学习

TF-IDF 向量化模拟器

体验将文章转换为机器学习可处理的数值向量的经典方法「TF-IDF」。通过改变文档数、单词出现次数、文档长度,可实时了解单词频率TF、逆文档频率IDF、TF-IDF权重,看清哪些词最能表征该文档。

参数设置
语料库的文档数 N
用于学习的文档总数
目标单词的出现次数
该单词在该文档内出现的次数
文档的总单词数
目标文档包含的单词总数
包含该单词的文档数 df
语料库中至少出现该单词一次的文档数
IDF的计算方式
切换逆文档频率的定义式
计算结果
单词频率 TF
逆文档频率 IDF
TF-IDF 权重
文档频率 DF (%)
单词的识别力
停用词判定
语料库与单词权重 — 向量化的可视化

并排的图标代表语料库的每份文档。包含目标单词的文档用彩色标记并脉动。下方的条形显示TF-IDF权重的大小,分别表示TF和IDF的贡献。

TF-IDF vs 出现文档数 df
TF-IDF vs 单词频率(出现次数)
理论·主要公式

$$\text{TF-IDF}=\underbrace{\frac{f_{t,d}}{n_d}}_{\text{TF}}\times\underbrace{\ln\frac{N}{df_t}}_{\text{IDF}}$$

单词t在文档d中的权重。$f_{t,d}$:在该文档中的出现次数,$n_d$:文档的总单词数,$N$:语料库的文档数,$df_t$:包含该单词的文档数。出现在某个文档中频繁且在整个语料库中罕见的单词,其TF-IDF值越高。

$$\text{idf}_{\text{smooth}}=\ln\frac{1+N}{1+df_t}+1$$

平滑化IDF。分子分母都加1以避免除零,末尾的+1确保即使一个词出现在所有文档中,其权重也不会完全为0。与scikit-learn的TfidfVectorizer默认公式接近。

什么是TF-IDF

🙋
我在机器学习的书中经常看到「TF-IDF」这个词,但最后还是不明白这究竟是用来做什么的?
🎓
简单来说,它是「把文章转换成一串数字的工具」。机器学习模型无法直接处理文字,所以需要将其转换为「这篇文档中单词A出现了多少次,单词B出现了多少次...」这样的数值向量。最简单的方法就是列出出现的次数,但这样的话「是」「的」这样的词会在每篇文档中都大量出现,得到最大的数值。TF-IDF巧妙地进行了补正,使得「能够表征该文档的词」获得更大的权重。
🙋
名字中的TF和IDF分别是什么的缩写呢?
🎓
TF是Term Frequency的缩写,就是「单词频率」。表示某个单词在我们正在查看的文档中出现了多少次。由于文档越长这个数字会越大,通常会用文档的总单词数来进行归一化。IDF是Inverse Document Frequency的缩写,是「逆文档频率」。它考察该单词在整个语料库中的出现范围,在越多文档中都出现就值越小,越少文档中出现就值越大,用ln(N/df)来计算。两者相乘就得到了TF-IDF。在左边的参数中,提高「目标单词的出现次数」会增加TF,降低「包含该单词的文档数」会增加IDF,你会看到数值的变化。
🙋
原来是相乘啊。那TF-IDF值大的单词是什么样的单词呢?
🎓
就是「在这篇文档中频繁出现,但在其他文档中很少出现」的单词。比如说新闻文章的语料库。在体育新闻中「本垒打」这个词会出现多次,但在政治新闻或经济新闻中几乎不会出现。所以它的TF高,df低也就是IDF高,两者相乘后TF-IDF就很大了,能够向机器表明「这篇文章是关于体育的」。反过来,「新闻」这样的词虽然在所有文章中都会出现一次以上,但由于出现在几乎所有文档中,IDF接近0,最后TF-IDF也很小。
🙋
那这样的话,「是」「的」「the」这样的词的停用词列表就不需要了吗?
🎓
是的,这正是TF-IDF最舒服的地方。常见的词会出现在语料库中的几乎所有文档中,所以df会接近N。这样的话ln(N/df)就会趋向于0,TF-IDF也会自动趋向于接近0。也就是说,即使不手工准备停用词列表,统计意义上「常见的词=信息量少」也会被自动判定,权重会自动降低。试试在左边的滑块上,把「包含该单词的文档数」拉到文档总数那样的位置。你会看到识别力变成「低(常见词)」,停用词判定也变成了停用词。
🙋
既然这么方便的话,为什么还需要像BERT这样的新技术呢?
🎓
这是个好问题。TF-IDF只看「单词的出现次数」,不能表示词序或语义的联系。「狗咬了人」和「人咬了狗」用TF-IDF来看就是完全相同的向量,而且「汽车」和「车」是同义词这一点也无法理解。Word2Vec和BERT则是从文本的语境中学习,能够捕捉这样的含义联系。但TF-IDF计算起来轻量级,结果也容易解释,即使学习数据很少也能稳定运行。所以在实际应用中,「先用TF-IDF做分类的基准线,不够的话再考虑用嵌入方法」这样的顺序到现在还是标准做法。

常见问题

TF-IDF(Term Frequency – Inverse Document Frequency)是一种将文章转换为机器学习可处理的数值向量的经典方法。它给每个单词分配一个权重,这个权重是「该单词在该文档中的出现频率TF」和「在整个语料库中的罕见程度IDF」的乘积。TF-IDF值大的单词是在该文档中频繁出现,但在其他文档中很少出现的词,正是能够表征该文档特征的词。多年来,它一直被用于搜索引擎排名和文档分类中,是一种易于解释的强大基准方法。
TF(单词频率)是目标单词在该文档中出现的次数除以文档的总单词数。tf = 出现次数 / 文档长度。IDF(逆文档频率)用标准公式idf = ln(N / df)计算(N是语料库的文档数,df是包含该单词的文档数)。平滑化公式idf = ln((1+N)/(1+df)) + 1可以避免df为0时的除零错误,并使出现在所有文档中的词的idf也不为完全的0,因此更加稳定。TF-IDF = tf × idf。
「是」「的」「the」「is」这样的词几乎出现在语料库的全部文档中,所以文档频率df会很高。IDF = ln(N/df)当df接近N时会趋向于0,所以这些词的TF-IDF会自动降到接近0。也就是说,使用TF-IDF就算不准备手工制作的停用词列表,常见的词也会自然地获得低的权重。这是TF-IDF的一大优点。
TF-IDF只使用单词的出现统计,生成稀疏向量,无法表示词序或语义相似性。而Word2Vec和BERT等单词嵌入是从文本上下文学习得到的密集向量,能够捕捉「汽车」和「车辆」在语义上相近这样的关系。但TF-IDF计算轻量,结果易于解释,在训练数据较少的情况下也能稳定运行。在实际应用中,它作为分类任务的强大基准方法仍被广泛使用。

现实世界中的应用

搜索引擎和文档排名:早期的网络搜索和全文搜索引擎都把搜索词的TF-IDF作为评分的核心。搜索词出现次数越多(高TF),且是罕见的特定词汇(高IDF)的文档就会被排在更靠前的位置。现代的BM25是对TF-IDF的改进版本,加入了TF的饱和处理和文档长度的补正,是Elasticsearch和Solr等搜索引擎的默认评分方法,至今仍被广泛使用。

文档分类和垃圾邮件过滤:新闻分类、电子邮件垃圾判定、评论的正负面判定等任务中,将文档转换为TF-IDF向量并输入逻辑回归、线性SVM、朴素贝叶斯等分类器是标准做法。计算资源少、学习速度快,还能从系数中解读出哪个单词对哪个类别有影响,非常适合需要解释结果的商业系统。

关键词提取和摘要:取出单个文档中TF-IDF值最高的前几个词作为该文档的代表关键词。用于文章的自动标签、相关文档推荐、词云生成等。比较多个文档提取的TF-IDF高频词,还可以定量地把握各文档话题的差异。

聚类和相似度计算:把文档转换为TF-IDF向量后,可以用余弦相似度来测量「文档之间的接近程度」。利用这个可以用k-means对文档进行聚类分组,或者搜索相似的文章。在清除搜索结果中的重复或对大量文档进行俯瞰性的可视化(制作话题地图)之前,常常作为预处理步骤使用。

常见误解和注意事项

最常见的错误是「在学习数据和评估数据上分别计算IDF」。IDF是语料库全体的统计量,在学习时求得的df和N必须保存下来,对测试文档和生产环境的数据也要使用同样的IDF。如果只对评估数据重新计算IDF,学习时和特征量的尺度会不匹配,精度会下降。在scikit-learn中的做法是,用学习数据进行fit处理,之后只进行transform处理,这种分离是避免「数据泄露」的铁则,对所有前处理都适用。

另一个常见问题是「误认为TF-IDF理解了文字的含义」。TF-IDF只是单词出现次数的统计,既不理解词的含义也不考虑词序。「品质好」和「品质差」意思完全相反,但用TF-IDF表示就几乎完全相同。同义词「汽车」和「车」也会被作为不同的维度对待,无法识别它们的关联。在需要考虑语义接近度和上下文的任务中,应该把TF-IDF作为基准线,再结合单词嵌入或文本理解模型。

最后是「忽视前处理的重要性」。TF-IDF的质量在很大程度上取决于前面的令牌化(分词)和正规化处理。日语没有空格分隔,所以形态素分析器(MeCab、Sudachi等)的选择和词典会影响结果。大小写统一、活用形转换为词根(词干化)、用min_df/max_df过滤极度罕见或频繁的词,这些都直接影响向量的维数和精度。虽然TF-IDF本身的公式很简单,但在实际应用中,前端的文本处理的设计最为关键。

使用指南

  1. 设置目标文档数量(nDocsNum)。例如,如果假设一个包含1000份技术文档的语料库,输入1000
  2. 指定单词的出现频率(termFreqNum)和目标文档的长度(docLengthNum),计算TF值。TF=出现次数/文档长度,如500字的文档中「机器学习」出现15次,则TF=0.03
  3. 输入包含该单词的文档数(docsWithTermNum),计算IDF值。IDF=log(全文档数/该单词出现的文档数),如1000份文档中有100份包含该词,则IDF=log(1000/100)=1.0
  4. TF-IDF权重、文档频率DF、识别力得分会实时计算,停用词判定会自动执行

具体计算示例

在500份金融报告语料库中分析「风险管理」这个词:单词出现8次,文档长度320词,则TF=8/320=0.025。包含该词的文档数180份,则IDF=log(500/180)=0.44。TF-IDF权重=0.025×0.44=0.011。DF=180/500=36%。识别力得分0.011,不属于高频词(DF>50%),因此作为机器学习特征是有用的。相比之下,助动词「的」出现在全部400份文档中,则DF=80%,属于停用词,应该从特征提取中排除

实务中的注意事项