重磅!「自然语言处理(NLP)」一文带你了解TF-IDF

纵饮孤独 提交于 2020-03-17 07:59:13

来源: AINLPer 微信公众号(每日更新…
编辑: ShuYini
校稿: ShuYini
时间: 2020-03-12

引言

    本文主要整理TF-IDF的基本内容,能够让你很快了解TF-IDF到底是什么,为什么会存在,以及其优缺点?

1、向量化特征缺失

    在将文本分词并向量化后,我们可以得到词汇表中每个词在各个文本中形成的词向量,我们将下面4个短文本做了词频统计:

corpus=["I come to China to travel", 
    "This is a car polupar in China",          
    "I love tea and Apple ",   
    "The work is to write some papers in science"]

    不考虑停用词,处理后得到的词向量如下:

[[0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0]
 [0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0]
 [1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1]]

    如果我们直接将统计词频后的19维特征做为文本分类的输入,会发现有一些问题。比如第一个文本,我们发现"come","China"和“Travel”各出现1次,而“to“出现了两次。似乎看起来这个文本与”to“这个特征更关系紧密。但是实际上”to“是一个非常普遍的词,几乎所有的文本都会用到,因此虽然它的词频为2,但是重要性却比词频为1的"China"和“Travel”要低的多。如果我们的向量化特征仅仅用词频表示就无法反应这一点。因此我们需要进一步的预处理来反应文本的这个特征,而这个预处理就是TF-IDF.

2、什么是TF-IDF

    TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”。它由两部分组成,TF和IDF

    前面的TF也就是我们前面说到的词频,我们之前做的向量化也就是做了文本中各个词的出现频率统计,并作为文本特征,这个很好理解。关键是后面的这个IDF,即“逆文本频率”如何理解。在上一节中,我们讲到几乎所有文本都会出现的"to"其词频虽然高,但是重要性却应该比词频低的"China"和“Travel”要低。我们的IDF就是来帮助我们来反应这个词的重要性的,进而修正仅仅用词频表示的词特征值。

    概括来讲, IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低,比如上文中的“to”。而反过来如果一个词在比较少的文本中出现,那么它的IDF值应该高。比如一些专业的名词如“Machine Learning”。这样的词IDF值应该高。一个极端的情况,如果一个词在所有的文本中都出现,那么它的IDF值应该为0。

    上面是从定性上说明的IDF的作用,那么如何对一个词的IDF进行定量分析呢?这里直接给出一个词x的IDF的基本公式如下:
IDF(x)=logNN(x)IDF(x)=log\frac{N}{N(x)}     其中,N代表语料库中文本的总数,而N(x)代表语料库中包含词x的文本总数。为什么IDF的基本公式应该是是上面这样的而不是像N/N(x)这样的形式呢?这就涉及到信息论相关的一些知识了。上面的IDF公式已经可以使用了,但是在一些特殊的情况会有一些小问题,比如某一个生僻词在语料库中没有,这样我们的分母为0, IDF没有意义了。所以常用的IDF我们需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。平滑的方法有很多种,最常见的IDF平滑后的公式之一为:
IDF(x)=logN+1N(x)+1+1IDF(x)=log\frac{N+1}{N(x)+1}+1 有了IDF的定义,我们就可以计算某一个词的TF-IDF值了:
TFIDF(x)=TF(x)IDF(x)TF−IDF(x)=TF(x)∗IDF(x) 其中TF(x)指词x在当前文本中的词频。

3、举例说明

比如有这么一个简单语料库:

corpus = [["我","a","e"],["我","a","c"],["我","a","b"]]

    计算文本频率:统计的语料中词语出现的次数与所有词语的总数的比值,比如在上述例子中,一共有五个词(我,a,b,c,e),所有词汇总数是5,其中“c”这个字出现了1次,所以“我”的文本频率是1/5,其他依次类推。

    计算逆文档词频:逆文档频率就是所有文档的条数与有某词的文档条数的比值的对数,比如上述例子中,文档总数是3条,出现“c”的是第二条,总共一条,所以“c”的逆文档频率指数就是log(3+1/1+1),在实际操作中,我们会加平滑因子,防止统计数为0这种情况出现。

    文本频率和逆文档频率(TF-IDF) 指数就是把这两个结果相乘,就是这个词的权重,比如"c"的TFIDF值就是1/5 * log(3+1/1+1)

    对于以上这个语语料库:对每个词都做一下这样的计算,最后得到的是一个样品数量 * 唯一token总数维度的矩阵,在例子中样本数量为3,唯一token总数为5,那么我们会得到一个3*5的矩阵,如果这一条文档中没有这个词就直接赋值0就可以了。
    最终该矩阵为

统计个数:
{'我': 3, 'a': 3, 'e': 1, 'c': 1, 'b': 1}
token编号:
{'我': 0, 'a': 1, 'e': 2, 'c': 3, 'b': 4}
TFIDF矩阵
[[0.6        0.6        0.41972246 0.         0.        ]
 [0.6        0.6        0.         0.41972246 0.        ]
 [0.6        0.6        0.         0.         0.41972246]]

4、TF-IDF算法的不足

    TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。

    在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。

    TF-IDF算法实现简单快速,但是仍有许多不足之处:

    (1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。

    (2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。

    (3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。

    (4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。

参考文献

[1]https://blog.csdn.net/asialee_bird/article/details/81486700#5%E3%80%81Sklearn%E5%AE%9E%E7%8E%B0TF-IDF%E7%AE%97%E6%B3%95
[2]https://www.cntofu.com/book/85/nlp/tf-idf.md
[3]https://blog.csdn.net/jiangzhenkang/article/details/86749717

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!