前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >治啰嗦利器~TF-IDF!| 文本分析

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

作者头像
数说君
发布2018-04-08 11:47:49
1.2K0
发布2018-04-08 11:47:49
举报
文章被收录于专栏:数说工作室

这个系列打算以文本相似度为切入点,逐步介绍一些文本分析的干货,包括分词、词频、词频向量、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,类似“是”这样的词,直接就应该作为停用词去掉。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数说工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档