前言:本文是团员@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、算法思路
一篇文章中会有很多词,每个词的重要性(权重)大小不一。而那些在某类文章中频繁出现,但在整个语料库中较少出现的词,通常被视作更能表征文章类别、重要性更高。
例如,赛车类文章中,“舒马赫”出现的频率较高,而在其它类别中却较少/极少出现。因此,“舒马赫”对于赛车这个分类来说,非常重要。
2、公式一:词频 ( term frequency, tf )
直观理解:某个词出现得频率越多(其它条件不变),该词的重要性越高。
3、公式二:逆向文档频率 ( inverse document frequency, idf )
直观理解:包含某词的文档数越多,该词的通用性越高、重要性越低。
边界范围:逆文档频率以整个语料库为范围,算出包含某个词的文档数量。
提问一:为什么分子、分母都用文档数,而不直接用词数呢?
我个人猜测,语料库的总词数通常很大,加上对数函数 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)。
计算方法:
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)算法效果
以上面的体育频道分类为例,准确率还是很高的:
我们的实际项目,需要通过职位描述进行岗位的分类,其中大部分职位分类表现非常好,大致和体育频道相当;但个别职位 —— 比如运营这种分支领域特别多的 —— 准确率只有60-70% 甚至更低,此时得结合其它办法,这里就不赘述了。
总之,如果是分类/聚类的相关问题,且数据样本是文档,都可以尝试加入 TF-IDF,有时会有意想不到的效果哦。
附:团员@Insight 的历史文章汇总
以上内容,来自饭团“AI产品经理大本营”,点击这里可关注:http://fantuan.guokr.net/groups/219/ (如果遇到支付问题,请先关注饭团的官方微信服务号“fantuan-app”)
---------------------
作者:黄钊hanniman,图灵机器人-人才战略官,前腾讯产品经理,6年AI实战经验,9年互联网背景,微信公众号/知乎/在行ID“hanniman”,饭团“AI产品经理大本营”,分享人工智能相关原创干货,200页PPT《人工智能产品经理的新起点》被业内广泛好评,下载量1万+。