1. 文本向量化特征的不足

    在将文本分词并向量化后,我们可以得到词汇表中每个词在各个文本中形成的词向量,比如在文本挖掘预处理之向量化与Hash Trick这篇文章中,我们将下面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进行定量分析呢?这里直接给出一个词xx的IDF的基本公式如下:

IDF(x)=logNN(x)IDF(x)=logNN(x)

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

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

IDF(x)=logN+1N(x)+1+1IDF(x)=logN+1N(x)+1+1

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

TF−IDF(x)=TF(x)∗IDF(x)TF−IDF(x)=TF(x)∗IDF(x)

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

3. 用scikit-learn进行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值如下:

  (0, 4)   0.442462137895(0, 15)   0.697684463384(0, 3)    0.348842231692(0, 16)   0.442462137895(1, 3)    0.357455043342(1, 14)   0.453386397373(1, 6)    0.357455043342(1, 2)    0.453386397373(1, 9)    0.453386397373(1, 5)    0.357455043342(2, 7)    0.5(2, 12)  0.5(2, 0)   0.5(2, 1)   0.5(3, 15)  0.281131628441(3, 6)    0.281131628441(3, 5)    0.281131628441(3, 13)   0.356579823338(3, 17)   0.356579823338(3, 18)   0.356579823338(3, 11)   0.356579823338(3, 8)    0.356579823338(3, 10)   0.356579823338

    现在我们用TfidfVectorizer一步到位,代码如下:

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

    输出的各个文本各个词的TF-IDF值和第一种的输出完全相同。大家可以自己去验证一下。

    由于第二种方法比较的简洁,因此在实际应用中推荐使用,一步到位完成向量化,TF-IDF与标准化。

4. TF-IDF小结

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

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

本文转自刘建平Pinard博客园博客,原文链接:http://www.cnblogs.com/pinard/p/6693230.html,如需转载请自行联系原作者

文本挖掘预处理之TF-IDF相关推荐

  1. tf-idf词向量和bow_使用词袋Bow和TF IDF进行多标签分类

    tf-idf词向量和bow 1.加载数据 (1. Load the data) For this study, we are using Kaggle data for Toxic Comment C ...

  2. 中文文本挖掘预处理流程总结

    在对文本做数据分析时,我们一大半的时间都会花在文本预处理上,而中文和英文的预处理流程稍有不同,本文就对中文文本挖掘的预处理流程做一个总结. 1. 中文文本挖掘预处理特点 首先我们看看中文文本挖掘预处理 ...

  3. 搜索引擎:文本分类——TF/IDF算法

    原理 TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类.TFIDF实际上是:TF * IDF,TF ...

  4. 文本挖掘预处理流程总结(2)— 英文

    目录 1.  英文文本挖掘预处理特点 2.  英文文本挖掘预处理 2.1 预处理一:数据收集 2.2  预处理二:除去数据中非文本部分 2.3  预处理三:拼写检查更正 2.4  预处理四:词干提取( ...

  5. 文本挖掘预处理流程总结(1)— 中文

    目录 1. 中文文本挖掘预处理特点 2.  中文文本挖掘预处理 2.1 预处理一:数据收集 2.2  预处理二:除去数据中非文本部分 2.3 预处理三:处理中文编码问题 2.4 预处理四:中文分词 2 ...

  6. 关键词提取算法—TF/IDF算法

    关键词提取算法一般可分为有监督学习和无监督学习两类. 有监督的关键词提取方法可以通过分类的方式进行,通过构建一个较为完善的词表,然后判断每个文档与词表中的每个词的匹配程度,以类似打标签的方式,达到关键 ...

  7. tf/idf_Neo4j:带密码的TF / IDF(和变体)

    tf/idf 几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wik ...

  8. Neo4j:带密码的TF / IDF(和变体)

    几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wikipedia的 ...

  9. 中文 lda数据预处理_英文文本挖掘预处理流程总结

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 整理:AI算法之心 作者:刘建平Pinard   博客地址:https://www.c ...

最新文章

  1. 科研文献|粪便污染可以解释人为影响环境中抗生素耐药基因丰度
  2. Hibernate的批量操作
  3. c如何返回数组给java
  4. matlab里数据类型转换,Matlab数据类型及转换(Matlab data type and conversion).doc
  5. windows资源管理器已停止工作后,使用命令提示窗口拷贝文件和运行exe程序
  6. 【英语学习】【WOTD】decoct 释义/词源/示例
  7. python怎么改变字体大小_python IDLE 背景以及字体大小的修改方法
  8. 【解决方案】: hyper-v 导入虚拟机报这个错误 32784
  9. [No00002D] “大学生还不如农民工”背后的“身份教育”困境
  10. 两轮电动车高端VS中低端,雅迪、爱玛谁更靠近市场?
  11. git两个分支代码合并
  12. Order Siblings by 排序
  13. GitHub分享的微软开源计算器项目
  14. 统计输入数据的个数、求和、平均值、方差、中位数
  15. USB开发-USB从启动到运行
  16. python遇到执行超时如何跳过避免任务卡死
  17. 随意发表见解易成无效表达
  18. Qt4程序打包_包含MySql数据库情况下
  19. 五分钟免费获得自己的永久域名,免费!永久!
  20. 干货!学会这些动漫绘画素材,小白也能学会动漫绘画,简单易学!

热门文章

  1. Linux下如何让普通用户具备sudo执行权限(普通用户提权)
  2. Gazebo仿真平台
  3. Z-Stack Home Developer's Guide—2. Overview中文翻译【Z-Stack Home 1.2.0开发文档】
  4. python学习—python中的引用本质
  5. 电子游戏市场的演变————零售
  6. Flume1.5.0的安装、部署、简单应用(含伪分布式、与hadoop2.2.0、hbase0.96的案例)
  7. myeclipse显示行号
  8. SVN使用import导入新数据到版本库
  9. C++ builder报错
  10. 解读OpenShift的逻辑架构和技术架构