计算机如何理解事物的相关性-文档的相似度判断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机如何理解事物的相关性-文档的相似度判断相关的知识,希望对你有一定的参考价值。

参考技术A

生活中,我们经常会对比两个事物的 相关性 ,也可以叫做 相似度

人类会根据自己的经验,很容易的判断两件事物是否相似,或者相似度是多少。那如何让 计算机 也能够进行这样的判断呢?

我们都知道,计算机并没有思维,它只能理解数字。所以,如果想让计算机理解我们现实世界中的事物,必须先把现实事物转换成数字。

空间向量模型假设,任何事物都可以转换成 N 维空间中的一个点 ,这个点称为 向量 ,然后通过计算 向量之间的距离或夹角 ,来判断向量的之间相关性,进而判断事物之间的相关性。

什么是向量

向量代表了事物的特征。

向量是相对标量而言,标量只是单个数字,没有方向性。向量也叫矢量,由一组数字构成,具有方向性。

例如,用下图中的 x 表示向量,其中 n 表示向量的维度:

两个向量所对应的两点之间的距离就是向量的距离,距离可以描述不同向量在向量空间中的差异,也就是现实事物之间的差异。

常用的计算距离的方法有四种:

其中使用最多的是欧氏距离,下面一一介绍。

麦哈顿距离

麦哈顿距离 可以理解为街道距离,或者出租车距离。

可以看到下图中,从A 点到B 点,不管是走 1线路 还是 2线路 ,距离都是一样的,这个线路的距离就是麦哈顿距离。

二维空间中的两个点 A(x1, x2) 和 B(y1, y2) ,麦哈顿距离的计算公式为:

n 维空间中的两个点 A(x1...xn) 和 B(y1...yn) ,麦哈顿距离的计算公式为:

欧式距离

欧式距离 也叫欧几里得距离,比较好理解,就是直线距离。

如下图,A 点到B 点的直线距离就是欧式距离。

对于二维空间中的两个点 A(x1, x2) 和 B(y1, y2) ,欧式距离的计算公式为:

对于 n 维空间中的两点 A(x1...xn) 和 B(y1...yn) ,欧式距离的计算公式为:

切比雪夫距离

切比雪夫距离 可以类比为在方格中走格子,怎样走的格子数最少。

如下图中,从A 格子走到B 格子,先斜线走,再直线走,最终走的 格子数 就是切比雪夫距离。

对于二维空间中的两个点 A(x1, x2) 和 B(y1, y2) ,切比雪夫距离的计算公式为:

上面公式的含义是, ∣x1 − y1∣ 和 ∣x2 − y2∣ 两者的最大者。

对于 n 维空间中的两点 A(x1...xn) 和 B(y1...yn) ,切比雪夫距离的计算公式为:

闵可夫斯基距离

闵可夫斯基距离 也叫做闵氏距离,它并不是一种单独的距离,而是上面三种距离的统一。

对于二维空间中的两个点 A(x1, x2) 和 B(y1, y2) ,闵可夫斯基距离的计算公式为:

对于 n 维空间中的两点 A(x1...xn) 和 B(y1...yn) ,闵可夫斯基距离的计算公式为:

根据 p 取值的不同,闵可夫斯基距离表示不同的距离:

向量也是有大小的,向量的大小就是向量的长度。

向量的长度也叫 向量的模 ,它是向量所对应的 点到空间原点的距离 ,通常使用 欧氏距离 来表示向量的长度。

数学中有一个概念叫做 范数 ,范数常被用来衡量向量的长度。

范数有4 种,分别对应向量的4 种距离:

向量的夹角经常用 余弦值 表示。

对于二维空间中的两个点 A(x1, x2) 和 B(y1, y2) ,余弦的计算公式为:

对于 n 维空间中的两点 A(x1...xn) 和 B(y1...yn) ,余弦的计算公式为:

夹角的余弦取值范围是 [-1, 1] ,那么:

我们可以将向量的距离与夹角展现在同一个 N 维坐标系中,如下:

向量的余弦取值范围是 [-1, 1] ,余弦值越大,表示越相似,正好与相似度成正比。

对于向量之间的距离,通常用 欧式距离 ED表示, ED 越小,表示越相似,与相似度成反比,而且 ED 的取值范围非常大。

所以通常会将欧式距离进行 1/(ED+1) 归一化 处理,用 ED\' 表示。 ED\' 的取值范围是 [0, 1] ,并且与相似度成正比:

应用空间向量模型的机器学习算法有 K 近邻(KNN)分类、K 均值(K-Means) 聚类 等。

为了让计算机能够判断现实事物的相似度,我们引出了 空间向量 的概念。

下面我们来看如何使用空间向量,来判断 文档相似度

比如,现在我们有两个中文句子,要判断这两个句子的相似度:

要想将文档转换成向量,首先需要对文档进行分词。

分词

我们可以使用 jieba 对这两个句子进行分词,结果如下:

可以得到所有词的集合:

计算每个句子的分词的词频:

从而可以得到词频向量:

上文中,我们介绍了,可以通过向量的 距离 或者 余弦夹角 来度量向量之间的相似度。这里我们使用余弦夹角来计算。我们知道 N 维空间的余弦公式为:

从而可以计算余弦夹角为:

可以看到,最终算出的余弦夹角为 0.85 ,比较接近 1 ,说明这两个句子还是很相近的。

本篇文章主要介绍了以下几点:

(本节完。)

推荐阅读:

决策树算法-理论篇-如何计算信息纯度

决策树算法-实战篇-鸢尾花及波士顿房价预测

朴素贝叶斯分类-理论篇-如何通过概率解决分类问题

朴素贝叶斯分类-实战篇-如何进行文本分类

如何通过词向量技术来计算2个文档的相似度?

我正好是做记录文档匹配的,提供一个最简单的思路吧,计算两个向量的余弦或者jaccard相似度。即是比较两个向量相同的部分与总数之比,计算两个向量的编辑距离jaro距离或者仿射距离即是一个向量转换为另一个向量所需的最小插入删除更新等编辑操作次数,算出相似度之后,可以直接根据相似度判断是否相似,也可以利用knn分类器等分类方法判断相似与否,用deeplearning的话:短文本:拿word2vec开始,然后上面套CNN(如果n-gram更重要),或者LSTM做短文本的embedding,然后算两个文档在embeddingspace里的相似度。或者拿李航老师的Arc-II直接学word2vec之后的matching。

参考技术A

先不论这样定义的距离是否满足距离的性质(比如对称性),我们考虑这样的情况:文档1中每个词都跟“音乐”密切相关;文档2中只有一个词跟“音乐”密切相关,其余词都跟“音乐”完全无关;文档3中有一个词跟“音乐”密切相关,其他词都跟“音乐”有点关系但关联性不大。我们希望有,但只考虑匹配词对之间的距离和的话无法做到这一点,因为文档1中的所有词在文档2和文档3中都会被匹配到那个跟“音乐”密切相关的词上去,从而可能导致。所以我们希望通过某种约束,使得文档1中的每个词都会以不同权重被“强制性”地匹配到另一个文档的所有词上去。在上面关于“音乐”的例子里,由于文档2或3的所有词都会被匹配到,但文档3的词跟“音乐”更相关,我们便有希望得到。我们先把文档看成词的一个分布(比如使用归一化的词频特征)。首先考虑如何令“文档1中的每个词以不同权重匹配到另一个文档的所有词上”。如下图,很简单,我们允许“部分匹配”就可以了。这里我们把匹配看成是把文档1中的词“移动”到文档2中的词的一个过程,移动代价是两个词向量的Euclidean距离。比如说“Obama”在文档1中的权重(概率)是0.5,如果我把0.4移动到“President”、0.05移动到“greets”……等等,移动代价就是这里应该有个约束:把“Obama”分到文档2中词的权重的和应该等于它在文档1中的权重。

参考技术B

首先,如果不局限于NN的方法,可以用BOW+tf-idf+LSI/LDA的体系搞定,也就是俗称的01或onehotrepresentation。其次,如果楼主指定了必须用流行的NN,俗称word-embedding的方法,当然首推word2vec(虽然不算是DNN)。然后得到了word2vec的词向量后,可以通过简单加权/tag加权/tf-idf加权等方式得到文档向量。这算是一种方法。当然,加权之前一般应该先干掉stopword,词聚类处理一下。还有,doc2vec中的paragraphvector也属于直接得到doc向量的方法。特点就是修改了word2vec中的cbow和skip-gram模型。依据论文《DistributedRepresentationsofSentencesandDocuments》(ICML2014)。还有一种根据句法树加权的方式,是ICML2011提出的,见论文《ParsingNaturalScenesandNaturalLanguagewithRecursiveNeuralNetworks》,后续也有多个改编的版本。当然,得到词向量的方式不局限于word2vec,RNNLM和glove也能得到传说中高质量的词向量。ICML2015的论文《FromWordEmbeddingsToDocumentDistances,Kusner,WashingtonUniversity》新提出一种计算doc相似度的方式,大致思路是将词之间的余弦距离作为grounddistance,词频作为权重,在权重的约束条件下,求WMD的线性规划最优解。最后,kaggle101中的一个word2vec题目的tutorial里作者如是说:他试了一下简单加权和各种加权,不管如何处理,效果还不如01,归其原因作者认为加权的方式丢失了最重要的句子结构信息(也可以说是词序信息),而doc2vec的方法则保存了这种信息。在刚刚结束的ACL2015上,似乎很多人提到了glove的方法,其思想是挖掘词共现信息的内在含义,据说是基于全局统计的方法(LSI为代表)与基于局部预测的方法(word2vec为代表)的折衷,而且输出的词向量在词聚类任务上干掉了word2vec的结果。

以上是关于计算机如何理解事物的相关性-文档的相似度判断的主要内容,如果未能解决你的问题,请参考以下文章

Python Gensim:如何使用 LDA 模型计算文档相似度?

如何计算两个文档的相似度

文本相似度-bm25算法原理及实现

余弦计算相似度理解以及计算

文本相似度计算(一):距离方法

针对许多文档计算文本相似度