机器学习训练营——机器学习爱好者的自由交流空间(入群联系qq:2279055353)

TF-idf 权

在大的文本合集里,一些词出现的频率很高(例如英文里的the, a, is)但包含的实际文本内容的有价值的信息却很少。如果我们把计数的数据直接提供给一个分类器,那些高频词条会影响罕见但更有意义的词条。为了重新加权计数特征为适合分类器使用的浮点值,现在普遍采用tf-idf变换。

tf的意思是term-frequency, 而tf-idf的意思是term-frequency times inverse document-frequency, 公式为:
tftftf-idf(t,d)=tf(t,d)×idf(t)idf(t, d)=tf(t, d)\times idf(t)idf(t,d)=tf(t,d)×idf(t)

这里,使用TfidfTransformer的默认设置,TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)

tf(t,d)tf(t, d)tf(t,d)表示词条频数,即,一个词条在一个给定文档里出现的次数。

idf(t)=log⁡1+nd1+df(d,t)+1idf(t)=\log\dfrac{1+n_d}{1+df(d, t)}+1idf(t)=log1+df(d,t)1+nd​​+1

ndn_dnd​表示文档总数,df(d,t)df(d, t)df(d,t)表示包含词条ttt的文档数,结果tf-idf向量经欧拉范数归一化

vnorm=v∣∣v∣∣2=vv12+v22+⋯+vn2v_{norm}=\dfrac{v}{||v||_2}=\dfrac{v}{\sqrt{v_1^2+v_2^2+\dots+v_n^2}}vnorm​=∣∣v∣∣2​v​=v12​+v22​+⋯+vn2​​v​

这个词条加权方案最初来自信息检索领域,后引入到文档分类、聚类问题,也得到好的效果。

下面我们进一步解释和举例说明tf-idf怎样精确地计算,以及使用TfidfTransformer, TfidfVectorizer计算tf-idf与标准定义的区别。idf的标准定义为

idf(t)=log⁡nd1+df(d,t)idf(t)=\log \dfrac{n_d}{1+df(d, t)}idf(t)=log1+df(d,t)nd​​

在TfidfTransformer, TfidfVectorizer里,通过设置参数smooth_idf=False, 1被加到idf上,而不是标准定义的分母项。

idf(t)=log⁡nddf(d,t)+1idf(t)=\log \dfrac{n_d}{df(d, t)}+1idf(t)=logdf(d,t)nd​​+1

然后,归一化由TfidfTransformer类执行:

from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer(smooth_idf=False)
transformer


让我们用下面的counts举一个例子。第一项(列)出现频率100%, 所以意义不大,后两个向量出现频率低于50%, 故很可能是有代表性的文档内容。

counts = [[3, 0, 1],[2, 0, 0],[3, 0, 0],[4, 0, 0],[3, 2, 0],[3, 0, 2]]
tfidf = transformer.fit_transform(counts)
tfidf
tfidf.toarray()



每一行被归一化为1范数。例如,我们可以按如下公式计算第一项在第一个文档里的tf-idf:

nd,term1=6n_{d, term1}=6nd,term1​=6

df(d,t)term1=6df(d, t)_{term1}=6df(d,t)term1​=6

idf(d,t)term1=log⁡nddf(d,t)+1=log⁡1+1=1idf(d, t)_{term1}=\log\dfrac{n_d}{df(d, t)}+1=\log1 + 1=1idf(d,t)term1​=logdf(d,t)nd​​+1=log1+1=1

tftftf-idfterm1=tf×idf=3×1=3idf_{term1}=tf\times idf=3\times1=3idfterm1​=tf×idf=3×1=3

现在,如果我们重复计算该文档剩余两项,则得到

tftftf-idfterm2=0×(log⁡(6/1)+1)=0idf_{term2}=0\times (\log(6/1)+1)=0idfterm2​=0×(log(6/1)+1)=0

tftftf-idfterm3=1×(log⁡(6/2)+1)≈2.0986idf_{term3}=1\times (\log(6/2)+1)\approx2.0986idfterm3​=1×(log(6/2)+1)≈2.0986

这样,原始tf-idf向量为[3, 0, 2.0986], 然后,按欧式(L2)范数,得到文档1的tf-idf:

[3,0,2.0986]32+02+2.09862=[0.819,0,0.573]\dfrac{[3, 0, 2.0986]}{\sqrt{3^2+0^2+2.0986^2}}=[0.819, 0, 0.573]32+02+2.09862​[3,0,2.0986]​=[0.819,0,0.573]

进一步,缺省参数smooth_idf=True对分子分母分别加1,好像存在一个外部文档,包含每一个词条,这样避免了分母是0的情况。

idf(t)=log⁡1+nd1+df(d,t)+1idf(t)=\log\dfrac{1+n_d}{1+df(d, t)}+1idf(t)=log1+df(d,t)1+nd​​+1

使用这个修正,文档1的第三项的tf-idf修正为:

tftftf-idfterm3=1×log⁡(7/3)+1≈1.8473idf_{term3}=1\times \log(7/3)+1\approx 1.8473idfterm3​=1×log(7/3)+1≈1.8473

这样,经L2归一化的tf-idf修正为

[3,0,1.8473]32+02+1.84732=[0.8515,0,0.5243]\dfrac{[3, 0, 1.8473]}{\sqrt{3^2+0^2+1.8473^2}}=[0.8515, 0, 0.5243]32+02+1.84732​[3,0,1.8473]​=[0.8515,0,0.5243]

transformer = TfidfTransformer()
transformer.fit_transform(counts).toarray()


经fit方法计算的每个特征的权保存在一个模型属性里。

transformer.idf_


由于tf-idf经常用于文本特征数量化,也有另一个类TfidfVectorizer结合CountVectorizer, TfidfTransformer所有的选项在一个模型里:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['This is the first document.','This is the second second document.','And the third one.','Is this the first document?',
]
vectorizer = TfidfVectorizer()
vectorizer.fit_transform(corpus)

精彩内容,请关注微信公众号:统计学习与大数据

【sklearn第六讲】特征提取(下)相关推荐

  1. 高等数学学习笔记——第七十六讲——直角坐标系下二重积分的计算

    一.问题的引入--如何抛开二重积分的几何意义来计算二重积分? 二.X-型区域上的二重积分计算 1. X-型积分区域及非X-型积分区域的分解 2. 累次积分法 三.Y-型区域上的二重积分计算 1. Y- ...

  2. SQL入门之第十六讲——总结下之前的SQL语句书写顺序

    SQL语句的书写顺序与执行顺序不是一致的 1.SQL语句的书写顺序 语句的书写顺序是比较重要的,如果顺序不对去执行也是会报错的. 之前的SELECT.WHERE.ORDER BY.LIMIT.JOIN ...

  3. 【Gazebo入门教程】第六讲 控制器插件的编写与配置(下)

    [Gazebo入门教程]第六讲 控制器插件的编写与配置(下) \qquad 文章目录 [Gazebo入门教程]第六讲 控制器插件的编写与配置(下) 一.系统插件 二.Velodyne传感器插件 1. ...

  4. 趣谈网络协议笔记-二(第十六讲上)

    趣谈网络协议笔记-二(第十六讲上) 流媒体协议:如何在直播里看到美女帅哥? 自勉 给岁月以文明,而不是给文明以岁月!--<三体> 在触不到的獠牙上点火--就像不必仰望那星星就能够解决--就 ...

  5. 推理计算过程_初中物理电学计算题第六讲:极值问题推理和限制条件

    初中物理电学计算题第六讲:极值问题推理和限制条件 前面已经讲过:初中物理电学计算题第三讲:串联电路电流电阻极值推理实例,本讲是这一问题的进一步深入讨论. 题型分析 极值问题是电学计算题中一类较难的题目 ...

  6. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理

    第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 ​​​​​​视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...

  7. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的实践-高斯牛顿法和曲线拟合

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  8. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  9. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  10. Stanford机器学习---第六讲. 怎样选择机器学习方法、系统

    本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学 ...

最新文章

  1. 音频光端机的几个重要指标
  2. Luogu P3731 [HAOI2017]新型城市化
  3. VMWare 虚拟机中安装 CentOS 7
  4. C++11 继承构造函数
  5. 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式...
  6. cad缩放_mac有没有好用的cad看图软件?CAD迷你看图 for Mac4.4.1激活版分享给大家...
  7. 基于PHP+MySQL游戏商城销售网站的设计与实现
  8. MapGIS干货|数据投影生成地质图的8个视频教程
  9. java web实现聊天系统_java web在线聊天系统
  10. python通过selenium模块模拟自动登录(以QQ空间为例)
  11. 时间序列分析之经验模态分解(EMD)和集成经验模态分解(EEMD)
  12. 编程语言和脚本语言是什么
  13. ET和LT的原理和区别
  14. 2019 年度最受欢迎的中国开源软件出炉!!
  15. miui12和鸿蒙系统,鸿蒙2.0和miui12对比_鸿蒙2.0和miui12使用对比
  16. 纳瓦尔宝典 健康、爱和使命,以此为序,其他的都不重要 不把自己太当回事
  17. 移动端音视频从零到上手
  18. HBase的高表和宽表
  19. Oracle系统参数错误,Oracle spfile参数设置错误的处理方法
  20. matlab绘制单摆相图,单摆运动―相图.ppt

热门文章

  1. OVF虚拟镜像的导出方法
  2. BI系统的应用组织思路与数据分析模式
  3. Eclipse RCP中Viewer交互的三种方式/Make your Eclipse applications richer with view linking
  4. CICD详解(四)——Jenkins下载与安装
  5. cobbler报错:No such command: --get-loaders解决方案
  6. Linux下学习进程控制
  7. [游戏制作]-C语言实现井字棋(三子棋)游戏简单版
  8. 关于Scrapy爬虫项目运行和调试的小技巧(上篇)
  9. window.open在Safari浏览器出现的问题
  10. Python脚本控制的WebDriver 常用操作 十八 获取测试对象的css属性