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


在自然语言处理中,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. font-failmly字体对应

  2. Linux 下让终端走代理的方法

    转载: https://blog.fazero.me/2015/09/15/%E8%AE%A9%E7%BB%88%E7%AB%AF%E8%B5%B0%E4%BB%A3%E7%90%86%E7%9A%8 ...

  3. 『ACM C++』 PTA 天梯赛练习集L1 | 018-020

    终于一周有这么一天能够安静下来好好学习打打题,还是很美滋滋的哈哈~加油加油~ ------------------------------------------------L1-018------- ...

  4. JavaScript碎片———函数闭包(模拟面向对象)

    经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知, ...

  5. 最新学习springboot 配置注解

    一.概述      Spring Boot设计目的是用来简化新Spring应用的初始搭建以及开发过程.Spring Boot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式. ...

  6. jQuery+zTree

    0 zTree简介 树形控件的使用是应用开发过程中必不可少的.zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 0.0 ...

  7. 全方面了解和学习PHP框架

    PHP框架是什么?    PHP框架提供了一个用以构建web应用的基本框架,从而简化了用PHP编写web应用程序的流程.这样不但节省开发时间,有助于建立更稳定的应用,而且减少了重复编码的开发.框架还可 ...

  8. 客户端与服务器交互中的Token

    Token:在计算机身份认证中是令牌(临时)的意思,类似于 MD5 加密之后的长字符串 特点:1.随机性,不可预测  2.具有有限期 3.唯一 作用:1.防止重复提交  2.防止CSRF(跨站请求伪造 ...

  9. Java HashMap 源代码分析

    Java HashMap jdk 1.8 Java8相对于java7来说HashMap变化比较大,在hash冲突严重的时候java7会退化为链表,Java8会退化为TreeMap 我们先来看一下类图: ...

  10. vue搭建项目

    vue-cli 作用:快速搭建项目脚手架 安装3.0:npm i -g @vue/cli 安装桥接工具:npm i -g @vue/cli-init (vue-cli 3和旧版使用相同的命令,所以2被 ...