The Jaro–Winkler distance (Winkler, 1990)是计算2个字符串之间相似度的一种算法。它是Jaro distance算法的变种。主要用于record linkage/数据连接(duplicate detection/重复记录)方面的领域,Jaro–Winkler distance最后得分越高说明相似度越大。Jaro–Winkler distance 是适合于串比如名字这样较短的字符之间计算相似度。0分表示没有任何相似度,1分则代表完全匹配。
给出两个字符串 s1 MARTHA 和 s2 MARHTA、我们可以得出:
similar_text('my name is php', 'my name is java', $result);
var_dump($result);
参考链接:网页链接
方法/步骤
一、数据准备。如图所示,这里有两个字符串1和2,现在需要判断两个字符串是否完全相同。
二、插入公式。如图所示,选择excel菜单栏中的“公式”,在其页面下选择“文本”类公式。
三、选择EXACT函数。如图所示,在“文本”公式下拉菜单中选择EXACT函数。
四、输入字符串。如图所示,在EXACT函数的对话框中,输入需要对比的两组字符串。
五、结果浏览。如图所示,在“是否相同”菜单栏中显示有TRUE和FALSE,前者表示两个字符串相同,后者表示两个字符串不同。
先计算a的长度,然后进行长度-1循环,在循环里,每次先取出2个字符,然后和B,indexof比较。如果值不等与-1,也就是说没有,那么继续循环,如果不等于-1,那么取连着3个字符,以次类推(这可以用第归做,比较省代码).看是去出几个字符才有的,和整个A的长度除,得出相似度
linux环境下,没有首先安装python_Levenshtein,用法如下:
重点介绍几个该包中的几个计算字串相似度的几个函数实现。
1. Levenshtein.hamming(str1, str2)
计算汉明距离。要求str1和str2必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数。如
2. Levenshtein.distance(str1, str2)
计算编辑距离(也成Levenshtein距离)。是描述由一个字串转化成另一个字串最少的操作次数,在其中的操作包括插入、删除、替换。如
算法实现 参考动态规划整理:。
3. Levenshtein.ratio(str1, str2)
计算莱文斯坦比。计算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是类编辑距离
注意:这里的类编辑距离不是2中所说的编辑距离,2中三种操作中每个操作+1,而在此处,删除、插入依然+1,但是替换+2
这样设计的目的:ratio('a', 'c'),sum=2,按2中计算为(2-1)/2 = 0.5,’a','c'没有重合,显然不合算,但是替换操作+2,就可以解决这个问题。
4. Levenshtein.jaro(s1, s2)
计算jaro距离,
其中的m为s1, s2的匹配长度,当某位置的认为匹配 当该位置字符相同,或者在不超过
t是调换次数的一半
5. Levenshtein.jaro_winkler(s1, s2)
计算Jaro–Winkler距离
Function xsd(s1 As String, s2 As String) As Double
Dim d() As Integer, l1 As Integer, l2 As Integer
Dim i As Integer, j As Integer, t As Integer
l1 = Len(s1)
l2 = Len(s2)
ReDim d(l1, l2)
For i = 0 To l1
d(i, 0) = i
Next
For i = 0 To l2
d(0, i) = i
Next
For i = 1 To l1
For j = 1 To l2
If Mid(s1, i, 1) = Mid(s2, j, 1) Then
t = 0
Else
t = 1
End If
d(i, j) = min3(d(i - 1, j - 1) + t, d(i, j - 1) + 1, d(i - 1, j) + 1)
Next
Next
If l1 l2 Then
xsd = l1
Else
xsd = l2
End If
xsd = 1 - d(l1, l2) / xsd
End Function
Function min3(x1, x2, x3)
If x1 x2 And x1 x3 Then
min3 = x1
ElseIf x2 x3 And x2 x1 Then
min3 = x2
Else
min3 = x3
End If
End Function
Private Sub Command1_Click()
MsgBox "相似度:" FormatPercent(xsd(Text1.Text, Text2.Text), 2, vbTrue)
End Sub
在Text1和Text2分别输入一段文字,再点Command1就会告诉你两段文字的相似度了。