本文始发于个人公众号:TechFlow,原创不易,求个关注
今天的文章和大家聊聊文本分析当中的一个简单但又大名鼎鼎的算法——TF-idf。说起来这个算法是自然语言处理领域的重要算法,但是因为它太有名了,以至于虽然我不是从事NLP领域的,但在面试的时候仍然被问过好几次,可见这个算法的重要性。
好在算法本身并不困难,虽然从名字上看疑惑重重,但是一旦理解了其中的原理,一切都水到渠成,再也不怕面试的时候想不起来了。废话不多说,我们进入正题。
算法原理
TF-idf名字的中间用分隔号进行了分割,并且TF和idf都不像是人名,所以它其实是表明了这个算法是由TF和idf两个部分构成的。我们先来看TF的部分。
TF的解释
TF的英文全称是Term Frequency,Frequency很好理解就是频次、频率。而这个Term硬翻译是项的意思,联系上下文,它其实是指的文本当中的单词或者短语。所以结合起来,Term Frequency就是短语的频率。其实如果你明白了它的意思,剩下的光凭猜测都可以猜测出一个大概。
它的意思很朴素,就是字面意思,即一个单词在本文当中的重要性和它出现的频率有关。
这个观点很直观,比如我们在网页搜索”TechFlow“,出来的网站当中通篇连一个”TechFlow“都没有,显然这次搜索的质量很差。如果一个网站当中包含的”TechFlow“很多,那说明很有可能搜索正确,这个网站就是我们想要的。
除此之外,它还可以反映单词的重要程度。如果在同一个文本当中,一个Term的出现频率比另一个大,那么一般情况下,显然它的重要程度也更大。
据说早期的搜索引擎就是用的这个策略,它衡量用户搜索的关键词在各个网页文本当中出现的频率。倾向于将出现频率高的网页排在前面,由于排名靠前的网页能够获得大量的流量。所以由于利益的驱动,后来越来越多的网页倾向于在内容当中嵌入更多的搜索热词,以此来获得更高的排名和更多的流量。相信大家也都有过类似的体会,当我们使用搜索引擎输入某个关键词,搜索出来的网页号称有相关的匹配,但是当我们真正点击进去却什么也没有发现,或者是满屏的广告。
在早期的互联网当中存在大量这样的网页,它们以囊括更多的搜索热词为生。以此还衍生出了一个技术工种——SEO,即search engine optimization搜索引擎优化,专门用各种手段来替各大网页优化搜索引擎当中的排名。
很快搜索引擎的工程师也都发现了这个问题,也正是为了解决这个问题,才引入了IDF的概念。
IDF的概念
IDF的英文是Inverse Document Frequency,即逆文档频率。这个概念很难翻译,也很难直白地解释,所以往往我们还是使用它的英文缩写。它表达的意思也很简单,就是越广泛存在的Term越不重要,也就是Term的重要性和出现的广泛性成反比。
举个例子,最常用的”的“,”了“,”是的“这些单词肯定广泛出现在各个文章当中,而像是“搜索”,“机器学习”这些短语会出现的文章可能就要少得多。显然对于搜索引擎或者是一些其他模型而言,这些出现更少的单词的参考意义更大,因为往往意味着更加精准的导向。所以IDF可以简单理解成出现广泛程度的倒数,它的定义也很简单:
i d f i = log ∣ D ∣ 1 + ∣ { j : t i ∈ d j } ∣ \displaystyle idf_i=\log\frac{|D|}{1 + |\{j:t_i \in d_j \}|} idfi=log1+∣{ j:ti∈dj}∣∣D∣
其中 ∣ D ∣ |D| ∣D∣是所有文档的数量, t i t_i