微信号:shushuojun

介绍:数据分析师之家.旨在为数据人提供一个学习、分享、互帮互助的家园.

治啰嗦利器~TF-IDF!| 文本分析

2017-03-16 22:44 数说君

这个系列打算以文本相似度为切入点,逐步介绍一些文本分析的干货,包括分词、词频、词频向量、TF-IDF、文本匹配等等。


第一篇中,介绍了文本相似度是干什么的;

第二篇,介绍了如何量化两个文本,如何计算余弦相似度,穿插介绍了分词、词频、向量夹角余弦的概念。


其中具体如何计算,在这里复习:





上文中留下了一个问题:


当文本很长的时候,词频向量的维度会很大,下面《水浒传》里的一段:


这吴氏年纪二十五六,是八月十五生的,小名叫做月姐,后来嫁到西门庆家,都顺口叫他月娘。却说这月娘秉性贤能,夫主面上百依百随。房中也有三四个丫鬟妇女,都是西门庆收用过的。


咦...怎么越读越不对劲...这段话好像不是《水浒传》里的,貌似是另一本神书里的,先截这么多吧......


说正经,先分词:


这/ 吴氏/ 年纪/ 二十五/ 六,是/ 八月十五/ 生/ 的,小名/ 叫做/ 月姐,后来/ 嫁到/ 西门庆/ 家,都/ 顺口/ 叫/ 他/ 月娘。却/ 说/ 这/ 月娘/ 秉性/ 贤能,夫主/ 面上/ 百依百随。房中/ 也有/ 三四/ 个/ 丫鬟/ 妇女,都是/ 西门庆/ 收用/ 过/ 的。


将文本生成词频向量:


这2/ 吴氏1/ 年纪1/ 二十五1/ 六1,是1/ 八月十五1/ 生1/ 的2,小名1/ 叫做1/ 月姐1,后来1/ 嫁到1/ 西门庆2/ 家1,都1/ 顺口1/ 叫1/ 他1/ 月娘2。却1/ 说1/ 秉性1/ 贤能1,夫主1/ 面上1/ 百依百随1。房中1/ 也有1/ 三四1/ 个1/ 丫鬟1/ 妇女1,都是1/ 收用1/ 过1/


(2,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)


这只是这个长篇爱情小说的一小小小部分,已经有35维了,随便一节、一章,上千上万维是必须有的。如果这些文本后期用来跑模型、做分析,计算开销会非常大。


而且,这其中有很多像“的”、“吗”、“是”这样的无用词维度,也有很多只出现极少次的词维度,造成了稀疏矩阵和不必要的计算开销。


因此,抓住关键信息,降低词维度,非常重要。如果你还不能切实感觉到,请阅读以下这段话:


要加强领导,明确责任,认真对照相关要求,把目标任务分解到部门、具体到项目、落实到岗位、量化到个人,真正做到以责任促落实,以责任促成效,形成一级抓一级、层层抓落实的工作局面。目前,有个别同志、个别部门,存在一些很不好的现象,即热衷于搞形式主义,以会议落实会议,用文件传达文件。当然,适当的会议、文件是必要的,但光讲空话、打官腔,是远远不够的,只有扎扎实实推动数据工作的深入开展,抓出实效,抓出成绩,才能确保圆满完成今年的目标任务。


我想你在阅读的时候,大脑都在跟你提意见——能不能告诉我核心信息啊?


TF-IDF是最常用的方法,它通过计算每个词的TF-IDF值,筛选出每个文档中最关键一些词。


那么问题来了,TF-IDF是怎么定义“关键”?作为一个文档中的关键词,我想应该同时满足如下2个特征:


  • 特征1:出现次数多,存在感强,这个没毛病;

  • 特征2:作为某文档的关键词,它尽可能只在这一个文档中出现。类似“的”、“是”、“在”...这样的词,存在感强的都感知不到它的存在了,原因就是因为它——不够关键,因此,关键词要尽可能的唯一


TF-IDF(Term Frequency–Inverse Document Frequency),就是平衡这两者的产物,它由两个部分相乘得到:TF × IDF,下面分别介绍一下:


1. TF


TF不用说了意思很明显,TF值越大,词的存在感越强,他是将特征1进行量化。


这里注意,我们之前的词频是计算词出现的次数,它这里除了文档总词数作为分母,只是做了一个标准化,因为有的文章长,有的文章短,出现100次的不一定算多,出现3次的不一定就少。有时候也用其他作为分母进行标准化(留个问题,你知道会用哪些么?)


2. IDF


计算IDF,我们首先要有一个语料库,可以是关于某个领域的新闻库——可以是聊天记录,也可以是谷歌上亿级的网页文本等等。语料库的作用在于模拟某种语境,当IDF值越大,说明在语境中包含该词的文档树越少,这个词越具有唯一性代表性,某种意义上说,它越关键。它是将特征2进行量化。


注意这里+1的位置,可以有些小变化,在scikit-learn的TfidfTransformer()方法中,如果声明TfidfTransformer(smooth_idf=false),那么IDF的计算就变为:


我们就叫它“不愿smooth的IDF”吧。


最后,将TF与IDF相乘,就可以计算出文档中每个词的TF-IDF值。它综合考虑了一个词的存在感和唯一性。


3. 例子


举个例子,我们来计算这三句话的TF-IDF值:


我是谁?

我从哪里来?

我要到哪里去?


同时,语料库里也就放这三句。为什么我要拿这三句做语料库?因为,这三句话作为唯物的终极问题,蕴含了人类一切语境,没毛病~


计算过程如下:


(1)分词


我/是/谁

我/从/哪里/来

我/要/到/哪里/去


(2)转化成文本向量


>>> text_vec = [[1, 1, 1, 0, 0, 0, 0, 0, 0],

...                       [1, 0, 0, 1, 1, 1, 0, 0, 0],

...                       [1, 0, 0, 0, 1, 0, 1, 1, 1]]


维度是 [我, 是, 谁, 从, 哪里, 来, 到, 去, 要]


(3)计算TF-IDF值


以第一个文档“我是谁”为例,来演示一下如何计算。


  • 该文档每个词的TF值为:[1/9, 1/9, 1/9, 0, 0, 0, 0, 0, 0]

  • 每个词的IDF值,这里用不愿smooth的IDF来计算:[1, log3+1, log3+1, log3+1, log(3/2)+1, log3+1, log3+1, log3+1, log3+1]

  • 每个词的TF-IDF值为:[0.111, 0.164, 0.164, 0, 0, 0, 0, 0, 0]


后面计算方法一样,最终得到每个文档的TF-IDF值:

[[0.111, 0.164, 0.164, 0, 0, 0, 0, 0, 0],

 [0.111, 0, 0, 0.164, 0.131, 0.164, 0, 0, 0]

 [0.111, 0, 0, 0, 0.131, 0, 0.164, 0.164, 0.164]


根据TF-IDF的值,我们筛选出每句最重要的一个字:


  • 我是谁——是/谁 (并列)

    也好,也好,生我之前谁是我,生我之后我是谁?好总结!


  • 我从哪里来?——从/来 (并列)

    是源头,是本我,是最本质的那个我;是现象,是自我,是我之所以成为今天的一切总结,好一个“从/来” !


  • 我要到哪里去?——要/到/去 (并列)

    是美好,也是欲望,是一切的未来;是方法,是行动,是实现美好愿望的途径。好!


什么?

你说我还没有解释“到”?

不想解释了,因为我

实在编不下去了......


- END -


PS:特别说明,最后一部分纯粹胡扯,只是为了结合实例说明一下如何计算TF-IDF,类似“是”这样的词,直接就应该作为停用词去掉。



1. 找合伙做分析→数据分析合作小组

2. 查看所有文章请在后台回复【M】

3. 获取数说君每日私享数据资讯,请关注微博 @数说工作室网站



数说工作室,数据中看大势

微信ID:shushuojun


长按二维码关注数说工作室

 
数说工作室 更多文章 治啰嗦利器~TF-IDF!| 文本分析 文本分析 | 词频与余弦相似度 文本相似度 | 余弦相似度思想 Python & R 代码 对照速查表 数说工作室 2016年干货总结
猜您喜欢 Tomcat的生命周期管理简要分析 Tomcat深入研究文章之十三(bootstrap.jar启动包源码分析) ngxtop:在命令行实时监控 Nginx 的神器 聊聊VueJs 组件化编程 一个实战者的自白:招聘行业应该如何变革?