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进行定量分析呢?这里直接给出一个词

的IDF的基本公式如下:

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

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

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

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf2 = TfidfVectorizer()

re = tfidf2.fit_transform(corpus)

print re

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

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

完整例子:

1 安装scikit-learn包

pip install scikit-learn

2 中文分词采用的jieba分词,安装jieba分词包

pip install jieba

3  关于jieba分词的使用非常简单,参考这里,关键的语句就是(这里简单试水,不追求效果4 )

import jieba.posseg as pseg

words=pseg.cut("对这句话进行分词")

for key in words:

print key.word,key.flag

输出结果:

对 p

这 r

句 q

话 n

进行 v

分词 n

4 采用scikit-learn包进行tf-idf分词权重计算关键用到了两个类:CountVectorizer和TfidfTransformer,具体参见这里

一个简单的代码如下:

# coding:utf-8

import jieba

import jieba.posseg as pseg

import os

import sys

from sklearn import feature_extraction

from sklearn.feature_extraction.text import TfidfTransformer

from sklearn.feature_extraction.text import CountVectorizer

if __name__ == "__main__":

corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开

"他 来到 了 网易 杭研 大厦",#第二类文本的切词结果

"小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果

"我 爱 北京 天安门"]#第四类文本的切词结果

vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频

transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值

tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵

word=vectorizer.get_feature_names()#获取词袋模型中的所有词语

weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重

for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重

print u"-------这里输出第",i,u"类文本的词语tf-idf权重------"

for j in range(len(word)):

print word[j],weight[i][j]

程序输出:(每行格式为:词语  tf-idf权重)

-------这里输出第 0 类文本的词语tf-idf权重------           #该类对应的原文本是:"我来到北京清华大学"

中国 0.0

北京 0.52640543361

大厦 0.0

天安门 0.0

小明 0.0

来到 0.52640543361

杭研 0.0

毕业 0.0

清华大学 0.66767854461

硕士 0.0

科学院 0.0

网易 0.0

-------这里输出第 1 类文本的词语tf-idf权重------           #该类对应的原文本是: "他来到了网易杭研大厦"

中国 0.0

北京 0.0

大厦 0.525472749264

天安门 0.0

小明 0.0

来到 0.414288751166

杭研 0.525472749264

毕业 0.0

清华大学 0.0

硕士 0.0

科学院 0.0

网易 0.525472749264

-------这里输出第 2 类文本的词语tf-idf权重------           #该类对应的原文本是: "小明硕士毕业于中国科学院“

中国 0.4472135955

北京 0.0

大厦 0.0

天安门 0.0

小明 0.4472135955

来到 0.0

杭研 0.0

毕业 0.4472135955

清华大学 0.0

硕士 0.4472135955

科学院 0.4472135955

网易 0.0

-------这里输出第 3 类文本的词语tf-idf权重------            #该类对应的原文本是: "我爱北京天安门"

中国 0.0

北京 0.61913029649

大厦 0.0

天安门 0.78528827571

小明 0.0

来到 0.0

杭研 0.0

毕业 0.0

清华大学 0.0

硕士 0.0

科学院 0.0

网易 0.0

TF-IDF小结

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

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

参考:

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

http://blog.csdn.net/liuxuejiang158blog/article/details/31360765

http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

http://blog.csdn.net/eastmount/article/details/50323063

tfidf+java+权重,使用scikit-learn tfidf计算词语权重相关推荐

  1. python networkx 边权重_Python/NetworkX:动态计算边权重

    我有一个用networkx创建的未加权图,我想根据边出现的计数/频率计算节点之间的边的权重.图中的一条边可以出现多次,但是边出现的频率是事先不知道的.其目的是基于连接节点之间移动的权重(例如计数/频率 ...

  2. matlab tf-idf,java 兑现tfidf

    java 实现tfidf tfidf 做自然语言理解的经常用.文档的作为权重计算, 许多初学者搞不清楚,权重计算特征选择. 针对文本分类而言 作为很简单的说明,特征选择都跟 类别有关比如 卡方 信息增 ...

  3. TF-IDF 原理及sklearn中的tf-idf实例分析

    背景介绍 在一个大的文本语料库中,一些单词将出现很多次(例如 "the", "a", "is" 是英文),因此对文档的实际内容没有什么有意义 ...

  4. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  5. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  6. 文本相似性检测---词语权重计算

    本文讨论如何计算词(有时候称特征向量)权重和向量空间模型及其应用.本文的"文档"是指查询对象,它们可以使一条条单独的记录或者是一本书的各章,还可以是一个网页,或者xml文件等. 1 ...

  7. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  8. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  9. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

最新文章

  1. python爬取抖音用户数据_python批量爬取下载抖音视频
  2. java class类文件结构
  3. 概念区分:并行、分布式、集群、云、超算
  4. gomod和govendor的简单理解
  5. java 构造函数抛出异常,构造函数抛出异常;嵌套异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext...
  6. 中科曙光服务器怎么装系统_如何给服务器装系统
  7. 华为哪款手表支持鸿蒙,华为Watch 3最早或于5月发布 采用鸿蒙系统并支持eSIM
  8. Python + Appium 环境搭建
  9. ios开发 将json格式数据上传服务器
  10. html写手机登录界面,使用HTML做手机端的登录界面
  11. 经纬度转化为xy坐标系_高德地图经纬度导入Gis有偏移,纠正方法(附Python代码)丨GCJ-02转WGS84...
  12. 对数幅度谱图像matlab,幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱...
  13. 甲骨文裁员后会打算将云计算作为主战场吗?
  14. 服务器数据存储在哪个位置,数据存储在云服务器什么地方
  15. 【转载】遥感影响数据集整理
  16. 【软件工程-UML建模】
  17. 词袋模型和词向量模型
  18. 不错的每日站会的一个实践
  19. 《东周列国志》第四十八回 刺先克五将乱晋 召士会寿余绐秦
  20. 如何使得自己说话有底气?

热门文章

  1. 批处理判断文件夹是否为空
  2. 豆瓣电影:TOP250榜单爬虫
  3. JAVA Web学习笔记15 mybatis之查看详情 条件查询
  4. 数据分析——EXCEL可视化
  5. arcgis直方图导出地图_ArcGIS教程地图导出花式教你如何选择
  6. COMSOL with Matlab连接
  7. 7层网络协议和4层网络协议有什么区别和联系?
  8. 小平方水果店怎么摆放,水果店陈列怎么比较好
  9. 金蝶K3存货跌价准备案例专题
  10. 机器人杆长标定_一种SCARA机器人标定方法与流程