从0到1,了解NLP中的文本相似度 (2)

数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

img

余弦定理的向量计算公式

使用这个公式,我们会可以更方便的计算余弦距离。

回到余弦距离上来,它与我们上面说的欧几里得距离的区别是什么呢?我们引用一张网上的图片来形象的了解下余弦距离的含义:

img

余弦距离和欧几里得距离

在上图中,欧几里德距离dist(A, B)衡量的是空间中两点的绝对距离,跟各个点所在的位置坐标是直接相关的;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果我们保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离是保持不变的(因为夹角没有发生变化),而A、B两点的欧几里德距离显然在发生改变,这就是两者之间的不同之处。

关于余弦距离和欧几里得距离在现实场景中的区别,我们可以通过下面这个例子来形象的了解。现在有用户A和用户B分别对外卖骑手员工X和员工Y进行了评分。用户A对员工X的评分为2,对员工Y的评分为3,表示到坐标系中为坐标点AB(2, 3);同样用户B对员工X、Y的评分表示为坐标点B(4, 6),因此他们之间的欧几里德距离为:

​ p = sqrt((2 - 4)^2 + (3- 6)^2) = 3.6

而他们的余弦距离为:

​ p = (2 * 4 + 3 * 6) / ( sqrt( 2^2 + 3^2 ) * sqrt( 4^2 + 6^2 ) ) = 1

结合图示如下,其中,点A与点B之间的之间距离为红色线段所示,也就是上述的欧几里得距离。同时,线段0A和线段0B由于斜度相等,也就是夹角为0度,反映出的余弦距离就是cos(0) = 1,说明二者完全相似。

img

用户评分距离图示

欧几里得距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:前者能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。后者则倾向于是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。

汉明距离

Hamming distance在信息论中,表示为两个「等长」字符串之间对应位置的不同字符的个数。换句话说,汉明距离就是将一个字符串变换成另外一个字符串所需要「替换」的字符个数。如下图所示:

0110与1110之间的汉明距离是1;

0100与1001之间的汉明距离是3;

img

汉明距离图示

分词

在了解了上述一系列的距离含义之后,我们已经基本了解了衡量相似度的一个判定方法,但是对于一段文本内容来说,我们对什么来计算距离呢?这就涉及到了第二个基础知识:分词。

分词方法

为了实现对文本相似度的比较,我们需要分析文本的内容,也就必然会涉及到对文本进行分词处理。而说到分词,其中涉及的内容不比任何一个其他知识点要少,考虑到不是本文重点讲述,此处仅仅简单的列举了下当前分词算法的几种方向,有兴趣的同学可以就此列表再去细细琢磨

基于词表的分词方法

正向最大匹配法(forward maximum matching method, FMM)

逆向最大匹配法(backward maximum matching method, BMM)

N-最短路径方法

基于统计模型的分词方法

基于N-gram语言模型的分词方法

基于序列标注的分词方法

基于HMM的分词方法

基于CRF的分词方法

基于词感知机的分词方法

基于深度学习的端到端的分词方法

工程方案

从工程角度来看,目前分词已经有了十分成熟工程实现了,如IK,ansj等,列出一些比较常用的中文分词方案,以供大家学习使用:

结巴分词

ansj分词器

中科院计算所NLPIR

哈工大的LTP

清华大学THULAC

斯坦福分词器 (Github)

Hanlp分词器

KCWS分词器

文本相似度

在介绍完距离和分词之后,接下来,我们就需要来关注计算文本相似度的算法了。总的来说,计算文本相似度的算法共分为4类:

基于词向量

基于具体字符

基于概率统计

基于词嵌入的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxygj.html