开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:文本相似度计算】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15495
文本相似度计算
关于文本相似度的定义,目前没有公认统一的定义。下面的定义的只是基于一个常理,基于一个假设推论。
它的一种形式化的相似度定义的表达。那么这个表达是这样子就是两串文本A和B它的相似度等于它们公共的信息common,然后以及它的整体的描述信息description。
这是它们的数学关系。接着来看看这个公共信息是怎么定义的,A和B的公共信息,用common(A,B)来表达它,形式化表达它。共性越大、差异越小、则相似度越高;共性越小、差异越大,则相似度越低。那么再看看它的整体信息,A、B的全部信息用descfiption(A,B)来表示,相似度最大的情况就是文本完全相同。
然后和整体的一个全部信息的比例那应该是1,也就是相似度,如果定义在0和1的这个范围里面的,那么就有这样一个性质。下面关于相似度还有两个概念,一个是相似度,一个是相关度。先看相关度,那么相关度体现在文本共现或者以任何形式相互关联,包括上下位关系,同义关系,反义关系,部件-整体关系,值-属性关系等。它反映的是文本的组合特征,这是它的相关度。
相似度是相关度的一种特殊情况。它包括了相关度里面的这种上下位关系,同义关系。那么文本相似度越高,则相关度越高,但是反过来相关度越大的话,并不能说明相似度越高。所以要注意这两个概念的这个区分。
下面来看看文本相似度的计算有什么应用,有什么价值,也就是相似度的应用领域。应用领域实际上是还是非常多的,这里面列几个比较经典,比较主要的应用领域。一个是在搜索引擎里面,搜索文本的时候还需要做相似度计算。
那么还有文献的精准推送,就是你需要什么文献?需要查什么文献?还能够给你精准推送。然后还有这个文献的查重。这个可能以后就能遇到毕业论文要查重。再是一些自动问答。q and a,这个问题和答案之间有相似度的匹配。然后是一些聊天机器人,随着人工智能时代不断的推进,像聊天机器人,这个可能会越来越多,那么在这些应用场景里面,都需要进行文本相似度的计算。
这个文本相似度计算,它的这个等级的话,可以分为单词等级的相似度,句子等级的,一句话是不是相似?整个段落是不是相似,以及整篇文章是不是相似?这样不同的粒度,这都是完美相似度研究的范畴。有些应用里面可能要考虑整篇文章它的相似。那么有的时候呢要考虑什么?它的段落是不是相似?有的时候考虑到句子是不是相似?然后再考虑到用的单词是不是相似?
首先大家想像一下,说这个论文查重的话,这个论文查重系统,如果它的功能更强大的话,那它可以做到什么?可以做到句子级别,单词级别的这样的查重。那这个就更严格了。以前学生反应有经验,就是说怎么样能够让查重的这个重复率降低。他就把这个参考的文献的一句话,用谷歌翻译一下,翻译成中文,再拿中文到百度翻译里,再去翻译成英文。或者他就是说把别人给的一段中文,到谷歌里去翻译成英文,再把这个英文到百度里去翻译成中文,再把这个中文用做文章。他说逃避这个查重,降低查重率。那如果说真的要做到单词级别,句子级别的话,那这个论文写起来可能要求就更高了。
下面我们来看一看文本像素的计算有哪些方法?这里给大家列出了四大类方法。第一种是基于字符串的方法,文本都是由字符串构成的,那么它是从字符串的匹配出发,以字符串它的共现和重复程度为相似度衡量标准。字符串之间是不是匹配?它们匹配共现出现多少?重合有多少?作为衡量标准,根据计算的粒度,这个方法可以分为有字符级别的和词语级别的。
可以到字符,可以到词语,这是字符串的一个文本相似度计算的方法。第二种是基于语料库,那么语料库的就是说需要很多的文本信息。那么一大批,前面的字符串的话,可能要的能量就比较少。它需要在一大片的语料库里面基于词袋模型,把文本分成词组成的。然后对词袋模型里的哎进行量化。比如说用词频,TF-IDF调节商户信息。量化以后,进行什么?进行那个量化的向量的一些相似度计算。再可以基于神经网络的方法,主要是什么?主要是基于一些词向量的方法。它也是量化,但是量化它是向量,是一种分布式表示。接着基于搜索引擎的方法,就是在搜索引擎上面有大量的这个文档,大量的语料。在它里面来判断这个文本是不是相似,搜索引擎主要是表示它的语料的数据的来源更大。但是它背后的算法也可以用前面的这个讲的这种词袋或者是词向量的这个方法。那么这里讲到了前两种方法,是以待比较相似度的文档集合为语料库。所以语料库它是一大批文档集合,搜索引擎是以web这个语料库,然后可能更大一点。所以这是基于语料库,大家要理解一下。
第三种就是基于知识组织。这个概念可以很好的层次相关组织起来,这是组织,叫知识组织。是由规范组织体系的知识库来计算文本的相似度。那么一般是两种,一种是去本体的方法。
另外一个基于网络的知识,像维基百科知识。那么本体的话,不知道以前接触过没有。它那是一个概念层次体系,完全通过语义连起来。这个在文本的语义理解里面,也是非常重要的一个本体的方法。
然后再就是有其它的方法,不属于这三种方法之外的方法,都认为是其他方法。那么用的比较多的一种就是句法分析。那么介绍了四种相似度的计算方法,后面的话,会把这个前三种给大家再详细展开一下。
来看看基于字符串的代表方法有哪些?前面刚刚讲到,字符串方法里面按照粒度可以分为两种,一种是基于字符,一种是基于词语的。那么在字符级别的这个字符串的比较,方法的话,有一些编辑距离,汉明距离,lcs,Jaro-Winkler,N-gram等等。如果是基于词语的方法的话,可以计算这个词语构成向量的余弦相似度。欧式距离,Dice系数等等。
那么这么一个方法,它的基本思想,表格里都有描述。包括就是说,它的这个特点和不足在这个表格里也有统计,所以这一份资料的话,同学们课后可以仔细研究。在课里面,直接给大家简单提一下。就是字符串的方法,代表方法有这样一些。然后再基于语料库的方法,主要有三种。
第一种基于词袋方法,比如说用向量空间模型VSM,也可以用概率的盈余分析LSA、PLSA,或者LDA主题模型。它的基础都是基于语料构成的词袋。第二种方法是基于神经网络。主要是生成词向量,主要有这么几种word2vec,Glove,目前很热门的Bert。第三是基于搜索引擎,主要搜索引擎上有大量的Web内容,可以认为是最大的语料库。搜索引擎算法在进步,可以从搜索中找到答案。这个发展好的话,很方面用户的使用。用户想查两段文字是不是相似,可以到搜索引擎里搜一下,然后就能反馈出结果。如果这个成熟的话,那对用户来说就很方便。
那么基于词袋方法的话,看一个特点。它不考虑在文档中出现的顺序,所以它的语义稍弱一点。它只是一个袋子里装了很多词的词袋。而神经网络是通过神经网络模型生成词向量,利用上下文语义关系生成低维的实数向量。所以它的语义要强。
最后搜索引擎主要是基于它庞大的语料库,可以利用一个原理来进行文本相似的判断。就是一般搜索关键词,两个关键词x,y搜索引擎返回包含c,y的网页数量f(x),f(y)以及同时包含x和y的网页数量f(x,y)。
如果搜索引擎能很好的提供文本相似度计算的功能的话,就太方便了。写论文的话担心与别人相似,有抄袭嫌疑的话,在搜索引擎里搜一下就可以了。
词袋模型与词向量模型示例
这就是一个词袋模型,这是一个文档,分完词以后整个文档里面都是词,相当于是一个装在袋子里的词。词袋模型里的每一个词都会给它一个权重值的。这个权重值简单就可以是它的词频。或者一篇文档的话按照词的唯一性,给它排完序后每一个词体的编号。
词向量模型是在向量的一个维度里面,每一个词在向量空间里面都是一个点。有些词和词之间向量空间会比较近,那么可能是同义词,近义词。那么这个计算向量空间的话就比较科学,准确度更高。
基于知识组织的方法
基于知识组织的方法主要有两种,一种是基于本体的方法。基于本体的方法,进一步可以分为基于距离,就是概念之间的路径长度表示语义距离。基于内容是用概念词共享的信息量化它们之间的语义相似度。如果基于属性的话就是用概念词之间的公共属性数量衡量它们之间的相似度。这个就涉及到本体之间的知识以及计算。本体在十几年前非常火,现在做辅助的作用。因为本体要把一个领域里的概念体系完全建立起来,这个建立的工作量非常的巨大,而且需要专家的参与。也就是说要做一个脊椎动物的本体的话,需要等人来一起构建这个本体。
本体里面的概念体系一定要建立完全如果某一个概念断层的话,那么使用的时候可能会有错误。另外一个知识组织是基于网络知识的方法,这个网络知识不是指一般的搜索引擎,主要是网络上面已经构好的有词条,词之间的关系,这样一个网络知识的资源。主要是一些百科,比如维基百科,这个很著名。由于前面讲的本体的词语数量是有限的,要建立非常多的工作量代价是巨大的。而百科覆盖范围广泛,富含丰富的语义信息,更新速度相对较快。
而百度百科的已经有数千万级别的词条。当然还有其他的一些百科,只要满足有词条之间的层次关系,比如上下类关系。有词条的链接页面,比如这个词的详细解释,都认为是百科。那么网上的百科可以用基于知识组织的方式来判断文本的相似度,做文本相似性的计算。说明一下,本体能够准确地表示概念含义并能反映出概念之间的关系。但是建立本体需要专家参与,耗时费力,所以已有的本体存在更新速度慢、词汇量有限等问题,需要网络知识的补充。
文本相似度计算方法的汇总
这篇文献里对文本相似度的计算的综述做了研究,有空可以看看全文。那么文本相似度计算全文分为四个方法。基于字符串,基于语料库,基于知识,基于其他方法。那么字符串里有基于字符和词语,然后进一步有比较细的一些计算方法。像编辑距离,汉明距离,LCS,Jaro-Winkler,N-gram,而基于词语有余弦相似度,Dice系数,欧式距离,Jaccard,Overlap Coeffcicient。基于语料库就是词袋方法,神经网络的词向量,搜索引擎上的语料库。基于世界知识就是知识组织的方法,有本体知识,网络知识。然后其他方法里面主要是句法分析和混合方法等等。
最新的学习方法里就是神经网络的学习这里展开的很少。这里只列了神经网络,实际上这里发展很快,可能出现了一系列的方法,这也是目前研究的热点。
介绍几常用几个公式或算法
第一个叫Jaccard相似度,也叫Jaccard系数。它的计算公式就是A,B两个文档是不是相似,然后它们的交集除以它们的并集。可以简化成这个A和B的交集除以A和B的数量再减去它们的交集。然后它的特点是只考虑单词出现与否,交和并就是单词出现与否。忽略了每个单词的含义,忽略单词的顺序,没有考虑单词出现的次数。所以它是计算文本相似度的话,也只是一个简化的一个方法。
看一下示例,这里有两串文本字符串S1和S2。前面一个是8个词,后面一个是11个词。
那么这两串文本的相似度怎么计算呢?因为它们之间的交集是有两个单词,language和processing。所以整个计算交集2再除以它们每个的数量,然后再减去交集,这个算的是0.11764。这就是这两个文本的Jaccard 相似度。
详细介绍的第二个文本相似度计算的算法是SimHash 算法。这个算法的基本思想是这样子,主要是降维,将高维的特征向量映射成成一个低维的特征向量,然后通过两个向量的Hamming Distance,也有人翻译成海明距离。
来确定文章是否重复或者是高度近似。那么这个是在谷歌里面有大量来解决外语级别的网页的去重问题,就是网页是不是有重复相似。然后算法的步骤也是五个步骤,第一个步骤是分词,得到有效的特征向量,这个词它的特征向量的值一般可以用词频来表示。然后每个特征向量可以设置1~5个级别的一个权重。第二步就是Hash值的计算。通过Hash函数来给各个特征向量转换成Hash值。Hash值是一个可以用二进制01来表示的n-bit签名。第三步就是加权,所有特征向量进行加权,用这样一个公式啊,就是Hash值乘以上面设的权重,五个级别的权重,然后进行加权。第四个步骤就是合并,将上述各个特征向量的加权结果累加,变成只有一个序列串,这个合并的话,因为上面是一个特征词,然后一句话里面有很多特征词,所以这个方法最后要合并。最后是降维,就是合并后的这个累加结果,如果大于0的就是变为1,否则还是0。就可以得到该语句的simhash值,最后可以根据不同语句simhash的海明距离来判断它们的相似度。那么这个大家听起来可能稍微还有点抽象,没什么感性认识,
下面看一个示例。
这是simhash算法的示例,比如这个文本是中文,这样一串文本。美国51区固原称内部有9驾飞碟曾看见灰色外星人。那么整个simhash的算法的步骤是这样子。分词然后再做hash值,通过hash函数做hash值,是hash证明组成的串,然后进行加权。那么加权的话,是1~5的这个等级级别。
然后进行一个合并。合并以后变成这样一个值。这个合并的话就是这个合并的这个值相应的这个位置上面进行一些累加。然后合并完了再降维,如果是大于0的位置,那就是1。小于0的位置呢就是0。最后得到后面的simhash值。然后再判断不同的句子的simhash值,看看它们之间是不是相似。因为另外一串的话也是这样一串01,判断它们是不是相似,可以用那个海明距离判断。讲白了,它还是一个基于字符串的方法。在前面的讲到的四个方法里面,还是基于字符串方法的这样一个比较,可以用汉明距离来表示。
第三个公式和算法,就是经常用的一个余弦相似度的一个计算。那么这个公式是这样子,cosθ余弦相似度,因为是多维的,那每一个维度上面的这两个文本串里面的相应的元素。它分子上面分母上面,然后再做这样的一个计算。那如果用向量表示的就是两个向量的一个关系,那么这个算法的特点是这样的,夹角如果越小的话,余弦值越接近于1,它们的方向更加吻合,则越相似。夹角越小越相似。余弦相似度算法适合于短文本,而不适合于长文本。
看下面这个例子,比如这里有两句话。分词以后这只/皮鞋/号码/大了。那只/号码/合适。另外一个句子,这只/皮鞋/号码/不小,那只/更/合适。它们共同的词,就是把两句话里面共同的词让它排列出来。然后在做权重向量,它在这里也可以用词频表示。比如说句子A的话,那么这只皮鞋出现1,号码出现2次,因为这里有两次号码。也就是词频表示,句子B是一样的。然后带入到什么?带入到上面这个公式来计算一下,这个计算的话是公式上面数字尽管很多,但应该很简单。最后得到一个结果就是它们的相似度0.81,这就是一个余弦相似度的计算,也就是向量的空间相似度的计算。
基于词向量的短文本相似度计算
现在神经网络的方法非常热门,介绍一个基于词向量的一个短文本的相似度计算。它这个就是短文本,就像网上的评论,短文本的相似计算。那么这个计算的话,它的算法思想是用到一个叫wmd,就是一个词移距离。它是一种转文本的一种相似度计算的标准,可以用于短文本的相似检索,它的KNN分类,KNN分类里面也要算距离。所以真的是一个算法的一个基础。
然后这个算法的步骤是这样子,将查询中的每一个词投射到词向量的空间。词向量,比如是100维或者是200维,投到这个空间里面可以得到一团点云。就是每一个词在这个向量空间里面就是这个维度空间里面都是一个点,所以点有很多点就点云。然后让要查的文献同样也投射到空间里,也是成为点云。然后就是计算查询和参考文献之间的距离,然后作为WMD,就是短文本标准的词义距离的值,这个值就是两个词之间的语义距离。
示例是文档1和文档2,它们之间是不是相似,那么刚刚讲的参考它可以是查询要查的那篇文献,也可以查询是一篇文献,参考是一篇文献,然后判断它们的相似度。
把document1和document2放入向量空间里面,很多点就会变成点云。一个点代表一个词,所以词和词之间就有可能是相似或不相似。比如奥巴马和总统就比较相似,这就是基于词向量的短文本相似度计算这样一个简单介绍。
From word embeddings to document distance. MJ Kusner,2015. 感兴趣可以看一下这篇文献。