找回密码
 立即注册
搜索

机器学习基础——详解自然言语处理之tf-idf

明天的文章和大家聊聊文本分析当中的一个简单但又大名鼎鼎的算法——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可以简单了解成出现广泛程度的倒数,它的定义也很简单:


其中|D|是一切文档的数量,t_i是第i个短语,|{j:t_i ∈ d_j }|表示包含第i个短语的文档的数量。为了防止它为0,我们为它加上一个常数1。异样,我们也可以写出TF的公式:


分母的TN_t表示文章t当中包含的一切Term的数量,分子TF_i表示Term_i在文档中的数量。

我们回顾一下这两个概念可以发现,TF衡量的是短语和文档的关系,而idf衡量的是短语和一切文档的关系。也就是说前者衡量的是短语对于某一个详细文档的重要性,而idf衡量的是短语对于一切文档的重要性。这两者有点像是部分和全体的关系,我们将两者相乘就可以得到一个Term兼容两者最终得到的重要性,也就是说TF-idf是用来计算短语在某个文档中重要性的算法

TF-idf的算法也很简单,我们直接将TF和idf计算得到的取值相乘即可。

算法的原理了解了之后,我们可以本人动手写一个计算TF-idf的算法,并不复杂,整个过程不超过40行:


其中SimpleTextPreprocessing是我本人开发的一个停止文本预处理的类,包括分词、去除停用词以及词性归一化等基本操作。这些内容在之前朴素贝叶斯分类的文章当中曾经提到过,感兴味的同窗可以点击下方的链接停止查看。

我们来实验一下代码:


我们本人创建了一些有意义的文本停止调用,我们计算第一条文本当中go和jurong单词的重要程度。根据TFidf的定义,go出如今了第一条和第二条文本当中,它出现的次数更多,所以它的idf更小,并且两者在第一条文本当中出现的词频分歧,所以应该jurong的TFidf更大。

最后的结果也符合我们预期,jurong的TFidf是0.345,而go的TFidf是0.143。

深度思索



TFidf的原理我们都了解了,代码也写出来了,看似圆满了,但其实有一个关键的点被我们忽略了。有一点很奇异,为什么我们计算idf的时分需求对拟文本频率这个值求log呢?虽然从结果下去看求了log之后的结果看起来愈加正常,并且分布也愈加合理。但这是结果不是缘由,而从原理下去说,这个log出现的缘由是什么呢?

其真实TFidf这个实际出现的早期,并没有人想过这个成绩,可以说是误打误撞。后来有大神从香农信息论的角度给与了解释,这一切才完美的自相矛盾。

在之前关于交叉熵的推导文章当中,我们曾经讨论过,假如存在一个事情A,它包含的信息量是

-log(P(A)),即它发生概率的对数。也就是说发生概率越小的事情,它的信息量越大。这个log的出现是有玄机的,信息论的本质是将信息量化。信息量化的结果是bit,也就是二进制位。我们都知道一个二进制位可以表示0和1两个数字,代表了2分量的信息。随着bit的增多,我们能表示的信息量也在增大,但是信息量不是线性增长的,而是指数增长的。

举个简单又经典的例子,32支球队挺近了世界杯,这其中只要一支球队可以获胜。假设最终获胜的是法国队、西班牙队,我们知道音讯的时分并不会诧异。而假如获胜的是日本队,估计一切人会大吃一惊。这背后的缘由就和信息量有关,我们都知道虽然从表面下去看32支球队是对等的,哪一支都有获胜的能够,但是实践上各个球队获胜的概率是不同的。

假设法国队、西班牙这种劲旅获胜的概率是1/4,

-log(1/4)=2那么我们只需求2个bit就可以表示。假设日本队获胜的概率是1/128,那么我们需求7个bit才能表示,显然后者的信息量大得多。

到这里,大家也就明白了,我们取对数的本质是计算信息量对应的bit的数量。bit的数量是线性的,信息量是指数级的,也就是说我们将一个指数级的信息量转化成了线性的bit。对于大多数模型而言,线性的特征愈加容易拟合,这也是TFidf效果出色的本质缘由。

最后,我们从信息论的角度解释一下idf,假设互联网世界当中一切的文档有 2^30。如今用户搜索中美贸易战,其中包含中国和美国的文档数量都是 2^14 ,那么中国和美国这两个词包含的信息量就是log(2^30/2^14)=16,而假如包含贸易战这个词的文档数量只要2^6,那么贸易战这个词包含的信息量就是log(2^30/2^6)=24,那么显然,贸易战这个词的信息量要比中国和美国大得多,那么它在文档排序当中起到的作用也就应该更大。

假如你能从信息论的角度对TFidf的原理停止解释,而不只是简单地了解原理,那我觉得这个知识点才是真正掌握了,那么当你在面试当中遇到自然也就能游刃不足了。

明天的文章就是这些,假如觉得有所播种,请随手点个关注或者分享吧,你们的举手之劳对我来说很重要。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

盛世祥瑞 2020-3-5 07:00:14 来自手机 显示全部楼层
看起来不错
回复

使用道具 举报

光亭千岛湖 2020-3-5 19:48:22 来自手机 显示全部楼层
我是个凑数的。。。
回复

使用道具 举报

leeon78 2020-3-6 21:36:27 显示全部楼层
LZ帖子不给力,勉强给回复下吧
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies