🙋
我在机器学习的书中经常看到「TF-IDF」这个词,但最后还是不明白这究竟是用来做什么的?
🎓
简单来说,它是「把文章转换成一串数字的工具」。机器学习模型无法直接处理文字,所以需要将其转换为「这篇文档中单词A出现了多少次,单词B出现了多少次...」这样的数值向量。最简单的方法就是列出出现的次数,但这样的话「是」「的」这样的词会在每篇文档中都大量出现,得到最大的数值。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本身的公式很简单,但在实际应用中,前端的文本处理的设计最为关键。