神经网络学习-初探句子相似性衡量方法
初探NLP常见的句子相似性算法
在本次文章中将会讨论计算句子相似度的常见算法,主要是以距离为主的简单方法。作者将会以中文为例,举一些比较常见的例子进行说明。中文语句的相似性计算是有很多方法的,本文主要是讲述几种距离方法,比如杰卡德系数、汉明距离、编辑距离、jaro距离等常见算法。下面我们开始对这些计算句子相似性的算法进行介绍。
首先介绍汉明距离,该距离是从信息论中引申出来的一种计算方法,它比较的是两个只含有1和0的向量,通过计算两个向量元素的1或者0的相同个数,来评价两个向量的相似程度。在NLP领域里面,以中文句子的相似性评判为例,汉明距离的计算方法是比较两个句子在相同位置的字的相同个数,比如有两句话:“我吃苹果”、“我吃西瓜”,这两句话的汉明距离就是2,因为最开始的两个字是一样的。汉明距离的计算方法有一个很明显的缺点,就是当两个句子的长度不相同的时候,会无法使用汉明距离,所以在真实的场景下很少使用汉明距离作为评判句子相似性的标准。
其次我们将介绍一下杰卡德系数,杰卡德系数就是集合论里面的jaccard系数,该系数是衡量两个集合互相之间的相似度,在中文句子相似性的角度来看,其实就是衡量两个句子里的每个字,把字看作是集合的元素,从而计算两个集合的交集和并集,交集除以并集就是最终的jaccard系数,显然该系数越大,两个句子的相似性越强。比如有两个句子:“我买苹果”、“我买水果”,它们的并集是5个字“我、买、苹、果、水”,而它们的交集是3个字“我、买、果”,所以得到的jaccard系数是0.6,显然该系数要比汉明距离的计算更通用,因为它不需要两个句子的长度相等。
然后我们再对编辑距离进行介绍,该方法又称之为莱温斯坦距离,它是在NLP领域衡量句子相似性最经典的方法,因为它的思路是通过修改最少次数的字,将一个句子转为另一个句子,这个修改的最少次数就是所谓的编辑距离。举个例子,假设有两个句子:“我喜欢喝饮料”、“我很喜欢吃日料”,那么我们对于左边的句子会进行三个步骤的操作:先加上文字“很”,再将“喝”字替换成“吃”字,最后将“饮”替换成“日”,也就是编辑距离是3,因为通过三个步骤才将左边的句子转为和右边一样的句子。
最后我们再介绍一下jaro距离,该距离也是NLP领域里常用的一种方法,它的公式如下:
其中m是匹配的字数,|s1|和|s2|分别是两个句子的长度,而t是交换的数目,最终通过公式计算的值就是所谓的jaro距离。假设有两个句子:“我特别喜欢演讲”、“我特别喜欢讲演”,那么这个时候m是7,两个句子的各自长度也是7,t代表交换的次数,t是2/2=1,所以dj=(7/7+7/7+(7-1)/7)/3=0.9524 ,这个值很接近于1,那么也就是说这两句话的相似性比较高。
总的来说,上面介绍的衡量句子相似度的方法是比较简单的算法,其中最为常用的其实是编辑距离和jaro距离,当然在NLP领域里,这类方法是没有结合语料和上下文进行训练的。所以其实对于有语料的情况下也可以考虑向量计算的方法,比如tf-idf、word2vec、doc2vec等方法,通过将句子转化为向量的形式进行相似度计算,得到最终的相似性系数。当然初学者在使用上述的距离计算可以直接调用python的包和方法,但是最好是对于上述的句子相似度计算的原理有所了解,这样可以更好地使用这些方法。