本博客属个人学习笔记,如有疏漏,欢迎在评论留言指出~转载请注明。


在自然语言处理中,TFIDF常常被人提及。很多材料都提及TFIDF中的“普遍重要性”,但很少有材料去简单解释其中的原理。TFIDF其实分为两个部分:TF与IDF。

(1)词频 TF

TF即Term Frequency,中文也叫词频。这个相对容易理解。

假设这里给出的文档$d_1$是:

 “我有一只超级超级可爱的猫”

那么分词后我们很可能会得到:

['我','有','一只','超级','超级','可爱','的','猫']

我们分别给这些词标上序号与出现次数:

词语 序号 出现次数
$w_1$ 1
$w_2$ 1
一只 $w_3$ 1
超级 $w_4$ 2
可爱 $w_5$ 1
$w_6$ 1
$w_7$ 1

不难发现,这个文档中有一共8个词语。

对于'我'(即$w_1$)这个词来说,它在这个文档$d_1$中的词频TF为:$$tf(w_1,d_1) = \frac{1}{8}$$

而对于'超级'(即$w_4$)这个词来说,它在这个文档$d_1$中的词频TF则为:$$tf(w_4,d_1) = \frac{2}{8} = \frac{1}{4}$$

而对于'猫'(即$w_7$)这个词来说,它在这个文档$d_1$中的词频TF则为:$$tf(w_7,d_1) = \frac{1}{8} $$

小结:词频TF的计算公式为$$tf(词语w_i,文档d_j)=tf(w_i, d_j) = \frac{文档d_j中词语w_i出现的次数}{文档d_j中的词语总数}$$

(2) 逆向文档频率 IDF

IDF即Inver Document Frequency,中文也叫逆向文档频率。先不着急理解它的作用~我们先来看看它是怎么算出来的。

假设我们的语料库(这里我们称它为D)中有两个文档——

文档1:“我有一只超级超级可爱的猫”

文档2:“我有一只超级淘气的狗”

如果我们忘记自己在做自然语言处理,改成用人脑思考这两句话的差别,我们会发现真正有区别的无非是“可爱的猫”和“淘气的狗”。

而“我”,“有”,“一只”,“超级”并没有提供什么关键信息,因此它们并不太重要。“猫”、“狗”、“淘气”、“可爱”才是提供关键信息的词语。

而IDF正是在为我们处理这个问题——

对于“我”这个词而言,它分别在文档1和文档2里各出现了一次——这说明虽然“我”是一个在语料库中非常常见的词,但是它并不对区别语义起到很大的作用,因此它的重要性可能并不是特别高。

对应的,“我”这个词的idf是:$$idf(“我”,语料库D) = log \frac{语料库D中的文档总数}{包含“我”的文档个数} = log \frac{2}{2} = log(1) = 0$$

而对于“猫”这个词而言,它只在文档1中出现过一次。 这说明,它可能对区分文档语义有着重要的作用,因此它的重要性比较大。

对应的,“猫”这个词的idf是:$$idf(“猫”,语料库D) = log\frac{语料库D中的文档总数}{语料库中包含“猫”的文档个数} = log\frac{2}{1} = log(2) $$

注意到,$$log(2) > 0$$可见IDF实际上是为我们筛选了对语义起到重要作用的词语。

小结:逆向文档频率的计算公式为$$idf(词语w,语料库D) = idf(w,D) = \frac{语料库D中的文档总数}{语料库D中包含该词语w的文档个数}$$

(3)TF-IDF

定义:对于语料库D中,文档d包含的一个词w,有TF-IDF为$$tfidf(词语w,文档d,语料库D) = tfidf(w,d,D) = tf(w,d) \dot idf(w,D)$$.

比如说在刚才的例子中,对于不是很重要的“我”:$$tfidf(“我”, d1, D) = tf(“我”,d_1 \dot idf(“我”,D) = \frac{1}{8} \dot 0 = 0$$

而对于比较重要的“猫”:$$tfidf(“猫”, d1, D) = tf(“猫”,d_1 \dot idf(“猫”,D) = \frac{1}{8} \dot log(2) = \frac{log(2)}{8}$$

注意到$\frac{log(2)}{8} > 0$.

假设我把第一个文档$d_1$改为只有“猫”一个词,那么毋庸置疑,对文档$d_1$来说最重要的就是“猫”了。在这个情况下,猫的词频就是1了——乘数的其中一个会变大。

$$tfidf(“猫”, d1, D) = tf(“猫”,d_1 \dot idf(“猫”,D) = 1 \dot log(2) = log(2)$$

注意到$log(2) > \frac{log(2)}{8}$.

这就是为什么,TFIDF可以过滤掉过于常见的词语,以此保证所提取出的词语具有“普遍重要性”。

参考资料:

https://en.wikipedia.org/wiki/Tf%E2%80%93idf

自然语言处理 - 如何通俗地理解TFIDF?的更多相关文章

  1. 如何通俗的理解spring的控制反转、依赖注入、面向切面编程等等

    之前一直不理解spring的一些基础特性是什么意思,虽然网上的解释也很多,但是由于我比较笨,就是看不懂,知道最近才稍微了解,下面就以通俗讲解的方式记录下来. 前言 假设我是一个没有开店经验的小老板,准 ...

  2. 通俗的理解java设计模式的准则

    本文部分内容摘抄自https://www.cnblogs.com/dolphin0520/p/3919839.html,加入了自己的理解: 一.单一职责原则 原文链接:http://blog.csdn ...

  3. 通俗地理解面向服务的架构(SOA)以及微服务之间的关系

    SOA是一种软件的应用架构方法,它基于面向对象,但又不是面向对象,整体上是面向服务的架构.SOA由精确的服务定义.松散的构件服务组成,以及业务流程调用等多个方面形成的一整套架构方法. 这话是不是听起来 ...

  4. 如何通俗地理解 Gradle

    http://www.zhihu.com/question/30432152 一句话概括就是:依赖管理和任务执行. 像Ruby里面的bundler+rake,像iOS中的cocoapods,像node ...

  5. 通俗的理解HTTPS以及SSL中的证书验证

    一.HTTPS的安全性体现在哪 HTTP(超文本传输协议,Hyper Text Transfer Protocol)是我们浏览网站信息传输最广泛的一种协议.HTTPS(Hyper Text Trans ...

  6. 从互信息的角度来理解tf-idf

    先介绍tf idf 在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率.这个数字是对词数(term count)的归一化,以防止它偏向长的文件.( ...

  7. 通俗的理解java的堆和栈

    堆 可以把堆理解为一家餐厅,里面有200张桌子,也就是最多能同时容纳200桌客人就餐,来一批客人就为他们安排一些桌子,如果某天来的客人特别多,超过200桌了,那就不能再接待超出的客人了.当然,进来吃饭 ...

  8. Array.prototype.slice.call(arguments) 通俗法理解

    Array.prototype.slice.call(arguments,num) 能将具有length属性的对象转成数组.   slice 从字面上的意思可以理解为截取数组的一部分. call 从字 ...

  9. 支持向量机通俗导论 ——理解SVM的三层境界 总结

    1.什么是支持向量机(SVM) 所谓支持向量机,顾名思义,分为两部分了解:一,什么是支持向量(简单来说,就是支持或支撑平面上把两类类别划分开来的超平面的向量点):二,这里的“机(machine,机器) ...

随机推荐

  1. 基于 Axis2的webService接口的基本开发步骤

    Axis2webServicejavaWeb 前言: 今天给大家分享一下前段时间在做项目的时候做webservice接口的一些心得. 在web工程lib目录下导入 Axis2相关jar包 enter ...

  2. js正则表达式——元字符

    元字符 具有特殊意义的元字符 \d 匹配0-9的数字,相当于[0-9] \D 匹配除了0-9的任意字符 \w 匹配0-9.a-z.A-Z._ 的数字或字符,相当于[0-9a-zA-Z_] \W 匹配不 ...

  3. MongoDB 简单上手

    MongoDB 是什么 MongoDB 是一种非关系型数据库(NoSQL). MongoDB中的术语解释 文档(document):形如 { name: "sue", <-- ...

  4. 第二篇:shell基础命令(部分)

    目录 一.shell命令规则 二.基础命令详解(部分) ls :列出目录内容 mkdir : 创建目录 rmdir :删除目录 touch:新建文件 mv:修改文件(目录)名.移动路径 cp:复制文件 ...

  5. Dbshop v1.3任意用户密码重置漏洞

    0x00 前言 年也过的差不多了,各自也都回到岗位忙碌起来了,新的一年祝大家诸事顺利,洞洞高危!好了进入正题 0x01 漏洞简介 本次主要写个简单的逻辑漏洞!然后抛个Message 内置高危. 1.找 ...

  6. less-7

    题目是要求导出文件GET字符型注入 看看代码 这里可以使用报错注入 先按要求用导出文件做 导出文件就是可以向服务器写入文件,但是利用的时候要知道数据库,网站的路径 我们现在less-1查看 www目录 ...

  7. 数据结构与算法之有序数组(2)——in dart

    本文比第一篇,采用了类实现.增加了运算符重载等功能.本来有序数组是不能修改某个位置的值的,因为这样会打破数组的有序性:但为了演示,保留了修改的方法,但为此增加了排序. import 'dart:mat ...

  8. Oracle入门第六天(下)——高级子查询

    一.概述 主要内容: 二.子查询介绍 1.简单子查询(WHERE子查询) SELECT last_name FROM employees WHERE salary > (SELECT salar ...

  9. 20155301 2016-2017-2 《Java程序设计》第3周学习总结

    20155301 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 1.在clothes类中定义了两个变量,很像C语言中自定义变量,clothes属于非公开类. ...

  10. 20155306 实验四 Android程序设计

    20155306 实验四 Android程序设计 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...