团员分享_NLP基本功(2)——TF-IDF 分类_@Insight_20181024
2021年5月11日 更新
开启更多功能,提升办公效能

前言:本文是团员@Insight “NLP基本功”系列的第二篇分享(第一篇文章在《20180125_NLP基本功——文本相似度》),用非技术人员能看得懂的方式介绍NLP相关内容,非常赞。



时隔半年多,NLP基本功系列总算出续集了。


前段时间我的项目重点不在算法侧,空写理论又太过抽象,况且普及理论的文章在CSDN等社区很多,我再写一遍总感觉像个搬运工,内心是有点排斥的。


最近,项目上用到了TF-IDF相关算法,恰好符合我分享算法的标准,故输出此文。


和之前输出的文本相似度一样,我尽量做到以下几点:

1、算法本身不复杂,不会太难理解,不需要特别深的数学知识。

2、项目中确实使用过该类算法,并且在使用过程中积累了一些心得。

3、比较重视逻辑的美感,并尽量结合具体事例,降低理解难度。

4、侧重对算法原理的讲解,不涉及编码(目标读者为 PM从业者,并非开发者)。



一、基本概念

TF-IDF 算法在文本数据领域非常经典。


1、TF ( term frequency, 词频) ,指某个词语出现的频率;


2、IDF ( inverse document frequency, 逆向文档频率 )大致意思是包含某个词语的文档越多,则该频率值越小。


3、文档(或文章),TF-IDF 中的最小单位。假定,所有新闻构成了整个语料库,则每一篇新闻就是一篇文档。特别的,这里的文档,可以理解为一种广义概念——只要一些词按照一定顺序串联起来,即可视为一篇文档。



二、TF-IDF介绍

1、算法思路

一篇文章中会有很多词,每个词的重要性(权重)大小不一。而那些在某类文章中频繁出现,但在整个语料库中较少出现的词,通常被视作更能表征文章类别、重要性更高


例如,赛车类文章中,“舒马赫”出现的频率较高,而在其它类别中却较少/极少出现。因此,“舒马赫”对于赛车这个分类来说,非常重要。


  • TF-IDF 定义&公式:

2、公式一:词频 ( term frequency, tf )

  • 分子表示第 j 篇文档中出现第 i 个词的频数(次数)。
  • 分母表示这篇文档的总词数。
  • 两者结合,即为词频,即“某个词在某文档中的频率”,或者“某个词出现的次数占文档总词数的比例”。


直观理解:某个词出现得频率越多(其它条件不变),该词的重要性越高。

  • PS. 文档中所有词都能计算出词频。
  • PS. 不同文档中出现同一个词,词频通常也不相等。
  • PS. 任一文档中任一词的出现次数均不小于1,因此词频始终大于0。


3、公式二:逆向文档频率 ( inverse document frequency, idf )

  • 分子表示语料库中的文档总数。
  • 分母表示包含第 i 个词的文档数量。


直观理解:包含某词的文档数越多,该词的通用性越高、重要性越低。

边界范围:逆文档频率以整个语料库为范围,算出包含某个词的文档数量。


提问一:为什么分子、分母都用文档数,而不直接用词数呢?

我个人猜测,语料库的总词数通常很大,加上对数函数 log x 的特性 —— x 较大时,斜率趋近于0 —— 导致数值区分度较小(欢迎有其它见解的同学一起交流,微信:116978517)。


4、公式三:两者相乘,得到最终的 TF-IDF 数值

直观理解:TF-IDF 可理解为权重。高频词如果通用性高,则重要性低,即降权;低频词如果通用性低,则重要性高,则加权。


5、举例:利用 TF-IDF 对腾讯体育新闻进行分类/聚类

第一步,从腾讯体育各个分类中抽取 m 篇文档,作为语料库。


第二步,建立各分类核心关键词:将每个分类的 m 篇文档首尾相连,形成一篇超长文档,并计算这篇超长文档中各词的 TF-IDF,取前 n 个词作为分类的核心关键词。


下图为 NBA 类目的核心关键词示意,只取了某一天的部分 NBA 新闻作为样本(m = 30,n = 15)

同样地,NFL、F1、足球等都能形成各自分类的核心关键词。


第三步,计算各篇文章与各分类核心关键词的余弦相似度(对余弦相似度不熟悉的同学,可以回看之前的 https://shimo.im/docs/xezspAaFaHoPyE4L)。


计算方法:

  • 以上图为例,NBA分类有15个关键词,而某篇待分类的文章,计算其每个词的 TF-IDF 之后,同样取前 15 个词。
  • 以这两组词的并集为基准取词向量(取值方法优化技巧中有提到),计算余弦相似度。
  • 同样的,依次计算该文档与NFL、F1、足球等分类的相似度。
  • 相似度最高者视为该文档归属的分类。


1)优化技巧1

两篇文档各取15个词,算出词向量及相似度,属于最原始的经典算法,背后隐含的逻辑是两篇文档“地位平等、没有偏颇”。

而仔细观察,会发现:上面例子中,一方是分类的总体特征,另一方是文章。这两者“地位并不平等”。


各分类的总体特征意味着:

  • 具备中心化特征
  • 数据规整,噪声少

简单来说,就是分类的关键词列表是经过“精心处理”的,比起随便拿出来的一篇文章要更“重要”,因此我们可以只用分类的关键词为基准构建词向量,而无需取并集。


比如,ABDE 和 AACDDF,经典的余弦相似度算法,需要先取并集,即 ABCDEF,再根据词出现的频次取向量值,即向量一是 110110,向量二是 201201。


而如果 ABDE 是某个分类的关键词列表,我们就只取 ABDE 作为词向量,则向量一是1111,向量二是2020。


细心的朋友可以发现:以 ABDE 为基,使得 ABDE 以外的词对向量二的取值没有影响,这在大多数情况下是有偏差的,甚至是不可接受的,但在上述分类问题下却刚好适合,因为其中一方是经过“精心处理”的,而且可以作为分类的主要依据。


2)优化技巧2

技巧1 中所述方法,讲的是如何选向量基,但在生成词向量时,各坐标的取值均为词频数(出现 1 次即取 1,出现 2 次即取 2 ......)。但在计算 TF-IDF 时,每个关键词已计算出了权重,完全可以直接用该数值作为词向量的坐标值,然后再计算余弦相似度。


比如上面 ABDE 的例子,优化后可能就变成下图的数值了。


3)算法效果

以上面的体育频道分类为例,准确率还是很高的:

  • NBA 的文章,正确划分到 NBA 的超过95%。
  • F1 的文章,正确划分到 F1 的超过97%。
  • 足球的稍低,正确划分到足球的也超过了91%。
  • 其它分类就不一一列举了……


我们的实际项目,需要通过职位描述进行岗位的分类,其中大部分职位分类表现非常好,大致和体育频道相当;但个别职位 —— 比如运营这种分支领域特别多的 —— 准确率只有60-70% 甚至更低,此时得结合其它办法,这里就不赘述了。


总之,如果是分类/聚类的相关问题,且数据样本是文档,都可以尝试加入 TF-IDF,有时会有意想不到的效果哦。



附:团员@Insight 的历史文章汇总


以上内容,来自饭团“AI产品经理大本营”,点击这里可关注:http://fantuan.guokr.net/groups/219/ (如果遇到支付问题,请先关注饭团的官方微信服务号“fantuan-app”)


---------------------

作者:黄钊hanniman,图灵机器人-人才战略官,前腾讯产品经理,6年AI实战经验,9年互联网背景,微信公众号/知乎/在行ID“hanniman”,饭团“AI产品经理大本营”,分享人工智能相关原创干货,200页PPT《人工智能产品经理的新起点》被业内广泛好评,下载量1万+。