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