自然语言处理 - 如何通俗地理解TFIDF?
本博客属个人学习笔记,如有疏漏,欢迎在评论留言指出~转载请注明。
在自然语言处理中,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?的更多相关文章
- 如何通俗的理解spring的控制反转、依赖注入、面向切面编程等等
之前一直不理解spring的一些基础特性是什么意思,虽然网上的解释也很多,但是由于我比较笨,就是看不懂,知道最近才稍微了解,下面就以通俗讲解的方式记录下来. 前言 假设我是一个没有开店经验的小老板,准 ...
- 通俗的理解java设计模式的准则
本文部分内容摘抄自https://www.cnblogs.com/dolphin0520/p/3919839.html,加入了自己的理解: 一.单一职责原则 原文链接:http://blog.csdn ...
- 通俗地理解面向服务的架构(SOA)以及微服务之间的关系
SOA是一种软件的应用架构方法,它基于面向对象,但又不是面向对象,整体上是面向服务的架构.SOA由精确的服务定义.松散的构件服务组成,以及业务流程调用等多个方面形成的一整套架构方法. 这话是不是听起来 ...
- 如何通俗地理解 Gradle
http://www.zhihu.com/question/30432152 一句话概括就是:依赖管理和任务执行. 像Ruby里面的bundler+rake,像iOS中的cocoapods,像node ...
- 通俗的理解HTTPS以及SSL中的证书验证
一.HTTPS的安全性体现在哪 HTTP(超文本传输协议,Hyper Text Transfer Protocol)是我们浏览网站信息传输最广泛的一种协议.HTTPS(Hyper Text Trans ...
- 从互信息的角度来理解tf-idf
先介绍tf idf 在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率.这个数字是对词数(term count)的归一化,以防止它偏向长的文件.( ...
- 通俗的理解java的堆和栈
堆 可以把堆理解为一家餐厅,里面有200张桌子,也就是最多能同时容纳200桌客人就餐,来一批客人就为他们安排一些桌子,如果某天来的客人特别多,超过200桌了,那就不能再接待超出的客人了.当然,进来吃饭 ...
- Array.prototype.slice.call(arguments) 通俗法理解
Array.prototype.slice.call(arguments,num) 能将具有length属性的对象转成数组. slice 从字面上的意思可以理解为截取数组的一部分. call 从字 ...
- 支持向量机通俗导论 ——理解SVM的三层境界 总结
1.什么是支持向量机(SVM) 所谓支持向量机,顾名思义,分为两部分了解:一,什么是支持向量(简单来说,就是支持或支撑平面上把两类类别划分开来的超平面的向量点):二,这里的“机(machine,机器) ...
随机推荐
- 大话Linux内核中锁机制之RCU、大内核锁
大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...
- mysql 5.7设置密码无效
我现在MySQL的版本时8.0.12,以前一直没有给MySQL设置密码. 今天因为需要,给MySQL设置,密码,但是上网搜了好久.....命令都不对.最后搜到csdn的Bpazy大佬的博客.他使用5. ...
- BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
- Linux相关网络命令
1.简述osi七层模型和TCP/IP四层模型 OSI七层模型 TCP/IP四层模型 2.简述iproute家族命令 ip命令: ip [OPTIONS] OBJECT {COMMAND|help} i ...
- JDK1.8降到1.7技巧
前言: 最近部署一个产品,该产品不支持JDK1.8,碰巧我的机器安装的是1.8,这就需要降到1.7才能部署启动成功.那么我也是不赞成卸载1.8来安装1.7,因为很多时候可能需要1.8和1.7来回切换. ...
- PHP获取一篇文章内容中的全部图片,并下载
- Contract Helper
using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk.Que ...
- 嵌入式nand flash详解
一.s3c2440启动后会将nand flash的前4K程序复制到内部的sram中,这个过程是硬件自动完成的,但是如果我们的程序远远大于4K,这个时候就需要将程序从flash拷贝到内存中来运行了. 二 ...
- STM32F4寄存器编写跑马灯例程
最近由于在学习STM32看到别人用寄存器编程控制跑马灯,于是自己也想试一试.可是试了好久终究弄不出来.回头看了下库函数的调用关系才搞明白.首先通过查看GPIOA的设置函数发现设置如下: void GP ...
- USB-Blaster驱动安装失败——文件哈希值不在指定目录中
右击此电脑,选择管理,选择设备管理器,更新USB-Blaster驱动出现问题 问题: 文件的哈希值不在指定的目录文件中,如图: 解决办法: Windows键+R→shutdown.exe /r /o ...