相似性度量(距离度量)方法(二):字符串(文本)相似性度量

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

在本篇文章中,兔兔讲述字符串的相似性(距离)度量方法与算法实现。

(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系数如下:

QS=\frac{2|X\cap Y|}{|X|+|Y|}

我们还是以string1='rabbit'和string2=’lovey'为例子。string1的长度是6,string2为5,两个集合交集长度为0,所以就是2x0/(6+5)=0,也就是相似度为0。这里的集合与数学

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信小兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值