干货 | 自然语言处理(3)之词频-逆文本词频(TF-IDF)详解

2017 年 12 月 19 日 机器学习算法与Python学习

微信公众号

关键字全网搜索最新排名

【机器学习算法】排名第一

【机器学习】排名第一

【Python】排名第三

【算法】排名第四


前言

在()中讲到在文本挖掘预处理中,在向量化后一般都伴随着TF-IDF的处理。什么是TF-IDF,为什么一般需要加这一步预处理呢?这里就对TF-IDF的原理做一个总结。


文本向量化存在的不足

在将文本分词并向量化后,就可以得到词汇表中每个词在文本中形成的词向量,比如()这篇文章中,我们将下面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可以反映这一点。


TF-IDF概述

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


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


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


上面是从定性上说明的IDF的作用,那么如何对一个词的IDF进行定量分析呢?这里直接给出一个词x的IDF的基本公式如下:

其中,N代表语料库中文本的总数,而N(x)代表语料库中包含词x的文本总数。为什么IDF的基本公式应该是是上面这样的而不是像N/N(x)这样的形式呢?这涉及到信息论相关的一些知识了(感兴趣的朋友建议阅读吴军博士的《数学之美》第11章)。


在一些特殊情况下上面的公式会有一些小问题,比如某一个生僻词在语料库中没有,则分母为0, IDF就没有意义了。所以常用的IDF我们需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。平滑的方法有很多种,最常见的IDF平滑后的公式之一为:


进而可以计算某一个词的TF-IDF值:

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


TF-IDF实战

在scikit-learn中,有两种方法进行TF-IDF的预处理。


第一种方法是在用CountVectorizer类向量化之后再调用TfidfTransformer类进行预处理。第二种方法是直接用TfidfVectorizer完成向量化与TF-IDF预处理。


第一种方法,CountVectorizer+TfidfTransformer的组合,代码如下:

from sklearn.feature_extraction.text import TfidfTransformer  

from sklearn.feature_extraction.text import CountVectorizer  


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"] 


vectorizer=CountVectorizer()


transformer = TfidfTransformer()

tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))  

print tfidf


输出的各个文本各个词的TF-IDF值如下:


第二种方法,使用TfidfVectorizer,代码如下:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)

print re


输出的各个文本各个词的TF-IDF值和第一种的输出完全相同。


小结

TF-IDF是非常常用的文本挖掘预处理基本步骤,但如果预处理中使用了Hash Trick,则一般就无法使用TF-IDF了,因为Hash Trick后已经无法得到哈希后各特征的IDF值。使用IF-IDF并标准化后,就可以使用各个文本的词特征向量作为文本的特征,进行分类或者聚类分析。


当然TF-IDF不只用于文本挖掘,在信息检索等很多领域都有使用,因此值得好好的理解这个方法的思想。

欢迎分享给他人让更多的人受益

参考:

  1. 宗成庆《统计自然语言处理》 第2版

  2. 博客园

    http://www.cnblogs.com/pinard/p/6693230.html

  3. http://alex.smola.org/papers/2009/Weinbergeretal09.pdf


近期热文


加入微信机器学习交流

请添加微信:guodongwe1991

备注姓名-单位-研究方向


广告、商业合作

请添加微信:guodongwe1991

(备注:商务合作)

登录查看更多
3

相关内容

TF-IDF(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。tf-idf加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了tf-idf以外,互联网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜索结果中出现的顺序。
斯坦福大学经典《自然语言处理cs224n》2020课件合集
专知会员服务
94+阅读 · 2020年5月25日
基于多头注意力胶囊网络的文本分类模型
专知会员服务
76+阅读 · 2020年5月24日
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
347+阅读 · 2020年2月15日
NLP基础任务:文本分类近年发展汇总,68页超详细解析
专知会员服务
57+阅读 · 2020年1月3日
【综述】关键词生成,附10页pdf论文下载
专知会员服务
52+阅读 · 2019年11月20日
学习自然语言处理路线图
专知会员服务
133+阅读 · 2019年9月24日
干货 | 自然语言处理(5)之英文文本挖掘预处理流程
机器学习算法与Python学习
7+阅读 · 2018年4月5日
干货|深度神经网络(DNN)反向传播算法(BP)
全球人工智能
7+阅读 · 2018年1月12日
自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)
机器学习算法与Python学习
5+阅读 · 2017年12月22日
干货 | 自然语言处理(2)之浅谈向量化与Hash-Trick
机器学习算法与Python学习
3+阅读 · 2017年12月13日
干货 | 自然语言处理(1)之聊一聊分词原理
机器学习算法与Python学习
5+阅读 · 2017年12月7日
机器学习(30)之线性判别分析(LDA)原理详解
机器学习算法与Python学习
11+阅读 · 2017年12月6日
干货 | 深度学习之CNN反向传播算法详解
机器学习算法与Python学习
17+阅读 · 2017年11月21日
Arxiv
6+阅读 · 2019年8月22日
Arxiv
15+阅读 · 2019年6月25日
Arxiv
4+阅读 · 2018年10月31日
Arxiv
7+阅读 · 2018年3月21日
VIP会员
相关VIP内容
相关资讯
干货 | 自然语言处理(5)之英文文本挖掘预处理流程
机器学习算法与Python学习
7+阅读 · 2018年4月5日
干货|深度神经网络(DNN)反向传播算法(BP)
全球人工智能
7+阅读 · 2018年1月12日
自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)
机器学习算法与Python学习
5+阅读 · 2017年12月22日
干货 | 自然语言处理(2)之浅谈向量化与Hash-Trick
机器学习算法与Python学习
3+阅读 · 2017年12月13日
干货 | 自然语言处理(1)之聊一聊分词原理
机器学习算法与Python学习
5+阅读 · 2017年12月7日
机器学习(30)之线性判别分析(LDA)原理详解
机器学习算法与Python学习
11+阅读 · 2017年12月6日
干货 | 深度学习之CNN反向传播算法详解
机器学习算法与Python学习
17+阅读 · 2017年11月21日
Top
微信扫码咨询专知VIP会员