前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「自然语言处理(NLP)」一文带你了解TF-IDF

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

作者头像
ShuYini
发布2020-03-25 18:29:47
1.3K0
发布2020-03-25 18:29:47
举报

引言

今天看了一下网上关于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%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

2

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AINLPer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、从向量化特征缺失说起
  • 3、举例说明TF-IDF计算方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档