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

2020-03-25 18:29:47 浏览数 (1)

引言

今天看了一下网上关于TF-IDF的文章,但是相关文章的知识点比较分散,所以作者对这些分散的知识进行了梳理整合,希望本文能够让你很快了解TF-IDF到底是什么,为什么会存在,以及其优缺点?

最后,还是帮作者点个在看吧,谢谢~~

正文开始

1

First Blood

1、从向量化特征缺失说起

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

代码语言:javascript复制
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"]

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

代码语言:javascript复制
[[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的基本公式如下:

其中,N代表语料库中文本的总数,而N(x)代表语料库中包含词x的文本总数。为什么IDF的基本公式应该是是上面这样的而不是像N/N(x)这样的形式呢?这就涉及到信息论相关的一些知识了。上面的IDF公式已经可以使用了,但是在一些特殊的情况会有一些小问题,比如某一个生僻词在语料库中没有,这样我们的分母为0, IDF没有意义了。所以常用的IDF我们需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。平滑的方法有很多种,最常见的IDF平滑后的公式之一为:

有了IDF的定义,我们就可以计算某一个词的TF-IDF值了:

其中TF(x)指词x在当前文本中的词频。

3、举例说明TF-IDF计算方式

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

代码语言:javascript复制
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就可以了。最终该矩阵为:

代码语言:javascript复制
统计个数:{'我': 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、Sklearn实现TF-IDF算法

[2]https://www.cntofu.com/book/85/nlp/tf-idf.md

[3]https://blog.csdn.net/jiangzhenkang/article/details/86749717

2

0 人点赞