在上一篇中,讲到相似度的算法,系统实现了:LevenshteinDistance,SpacySimilarity,JaccardSimilarity。这里详细讲解具体的算法。
水中的鱼:ChatterBot代码解读-获取对话zhuanlan.zhihu.com一.LevenshteinDistance算法
Levenshtein distance是表征或度量两段字符串的差异度的概念,以单词kitten和sitting为例,定义:替换(substitution)、插入(insert)和删除(delete)三种标准编辑手段来消除这两个词之间的差异,每经过1次标准编辑手段,Levenshtein distance增计一次,则kitten需经过2次替换、1次插入新字符,来得到sitting这个单词,因此所谓的Levenshtein distance应为3。按照其定义,该距离和字符串差异度呈正比关系。
代码是对比的两个statement对象的文本,用python的标准库函数SequenceMatcher,然后用编辑距离做分子,字符串A的长度做分母,算出一个0到1之间的相似度。
算法的详细过程参考:
https://blog.csdn.net/weixin_42694380/article/details/81044544blog.csdn.net编辑距离是NLP基本的度量文本相似度的算法,可以作为文本相似任务的重要特征之一,其可应用于诸如拼写检查、论文查重、基因序列分析等多个方面。但是其缺点也很明显,算法基于文本自身的结构去计算,并没有办法获取到语义层面的信息。
二.SpacySimilarity算法
代码实现比较简单
SpacySimilarity属于语义相似度的计算方法。那么spacy计算句子的相似度是采用什么方式呢?
参考:
Doc · spaCy API Documentationspacy.io先将句子的词向量求平均,获取句子的语义表示,然后计算两个句子的语义表示的余弦相似度。
三.JaccardSimilarity算法
给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值,定义如下:
当集合A,B都为空时,J(A,B)定义为1。
与Jaccard 系数相关的指标叫做Jaccard 距离,用于描述集合之间的不相似度。Jaccard 距离越大,样本相似度越低。公式定义如下:
具体实现:
先对两个句子的文本进行分词,去掉停用词,然后按照定义的算法进行计算。算法比较简单。
上述几种方法中,语义相似度问题,是自然语言处理的热点和难点。有百花齐放的研究和处理方式,常见的如下:
基于词向量的几种计算文本相似度方法 :
1)使用词向量求平均计算相似度
2)词向量tfidf加权求平均计算相似度
3)词向量加权-PCA计算相似度
还有基于深度学习的方式,计算句子的语义相似度。