在本篇文章中,兔兔讲述字符串的相似性(距离)度量方法与算法实现。
(1)海明距离。
根据(一)篇当中的内容,我们已经知道了海明距离的度量方法。即判断字符串对应位置是否相等。
def Hamming_distance(list1,list2):
n=len(list1) #n为列表长度,且list1与list2长度相等
s=0
for i in range(n):
if list1[i]==list2[i]:
s+=1
else:
continue
return s
a=[1,2,3,4]
b=[1,3,2,4]
print(Hamming_distance(a,b))
如果距离越大,说明相似度越小。并且海明距离只适用于两个字符串长度相同的情况
(2)余弦相似性。
余弦相似性通常用于两组数据之间的距离或相似性。用它来计算字符串之间的相似性,通常可以用词袋模型(BOW)来向量化。例如,字符串string1='rabbit',string2=' lovely'。这两个字符串一共有的字母集合为{a,b,e,i,l,o,r,t,v,y},集合有10个元素,就可以把这两个字符串用长度为12的列表表示。如果字符串有字母集合中的元素,对应元素位置就是1,否则是0。
| a | b | e | i | l | o | r | t | v | y | |||
| string1 rabbit |
1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | ||
| string2 lovely |
0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
这样,根据余弦相似性的定义式,把两个向量化后的数组代入公式进行计算。例如[1,0]和[1,1]的相似性就是(1x1+0x1)/(sqrt(1^2+0^2)sqrt(1^2+1^2))。
import numpy as np
def cosine_similarity(string1,string2):
s1=list(string1)
s2=list(string2)
set_s1s2=list(set(s1)|set(s2)) #两个字符串元素并集
list1=[];list2=[]
n=len(set_s1s2)
for i in range(n):
if set_s1s2[i] in s1:
list1.append(1)
else:
list1.append(0)
if set_s1s2[i] in s2:
list2.append(1)
else:
list2.append(0)
list1=np.array(list1) #转换成numpy数组形式便于向量乘法、模长运算
list2=np.array(list2)
similarity=np.dot(list1,list2)/(np.linalg.norm(list1)*np.linalg.norm(list2))
return similarity
a='rabbit'
b='lovely'
print(cosine_similarity(a,b))
我们发现,两个字符串相似性为0,事实上,根据上面表格我们也可以发现,两个字符串对应元素始终是一个是1,另一个就是0,说明没有相同的元素,计算过程分子一项始终是0x1然后相加,所以分子那一项就是0,所以相似性自然就是0了。
(3)Dice距离。
事实上,在(一)篇中,凡是可以度量两个集合之间距离的,理论上都是可以用于计算两个字符串之间的距离,如杰卡德系数等。兔兔在这里就以Dice距离为例。
Dice距离实际上就是度量两个集合距离的一种方法。Dice系数如下:
我们还是以string1='rabbit'和string2=’lovey'为例子。string1的长度是6,string2为5,两个集合交集长度为0,所以就是2x0/(6+5)=0,也就是相似度为0。这里的集合与数学

本文介绍了如何使用海明距离、余弦相似性、Dice距离、Jaro-Winkler距离和Levenshtein距离来衡量字符串间的相似性,包括各自的计算方法和应用场景,重点讲解了动态规划在Levenshtein距离中的应用。
最低0.47元/天 解锁文章
7109

被折叠的 条评论
为什么被折叠?



