调试Levenshtein距离实现-如何计算最小距离?

时间:2019-06-05 01:10:37

标签: vba levenshtein-distance

一段时间以来,我一直在尝试理解此代码,但我不知道如何计算距离。我知道算法应该如何工作(它提供了两个字符串之间的字符编辑距离,我可以在纸上做到这一点),但是我不知道这行代码的方式(例如)

  

d(i,j)= d(i-1,j-1)

以整数形式返回。 min1,min2相同。我们已经定义了

  

d(i,0)

  

d(0,j)

,但是当

时如何获取值
  

d(i,j)

两个参数之一不是0吗?

代码:

Option Explicit
Public Function Levenshtein(s1 As String, s2 As String)

Dim i As Integer
Dim j As Integer
Dim l1 As Integer
Dim l2 As Integer
Dim d() As Integer
Dim min1 As Integer
Dim min2 As Integer

l1 = Len(s1)
l2 = Len(s2)
ReDim d(l1, l2)
For i = 0 To l1
    d(i, 0) = i
Next
For j = 0 To l2
    d(0, j) = j
Next
For i = 1 To l1
    For j = 1 To l2
        If Mid(s1, i, 1) = Mid(s2, j, 1) Then
            d(i, j) = d(i - 1, j - 1)   
        Else
            min1 = d(i - 1, j) + 1
            min2 = d(i, j - 1) + 1
            If min2 < min1 Then
                min1 = min2
            End If
            min2 = d(i - 1, j - 1) + 1
            If min2 < min1 Then
                min1 = min2
            End If
            d(i, j) = min1
        End If
    Next
Next
Levenshtein = d(l1, l2)
End Function

?Levenshtein("saturday","sunday")

3

1 个答案:

答案 0 :(得分:1)

我对Levenshtein不太了解,但是我可以解释该数组中发生了什么,请查看代码中的注释:

l1 = Len(s1) 'this sets a variable with the length of the first string
l2 = Len(s2) 'this sets a variable with the length of the second string

ReDim d(l1, l2) 'redimension the array to this size, though this can be seen as ReDim d(0 to l1, 0 to l2)

For i = 0 To l1 'for i = 0 to length of first string
    d(i, 0) = i 'allocate the value of i to each row in the array, at col 0
Next i

For j = 0 To l2 'for j = 0 to length of second string
    d(0, j) = j 'allocate the value of j to each column in the array, at row 0
Next j

编辑:我添加了一些调试功能(将打印到ActiveSheet)。字母匹配处为蓝色,其他字母为红色...尽管颜色无关紧要。

据我所知,在每次循环迭代中,它会建立一个差异矩阵,从比较1:1的第一个字母到最后一个字母开始。基于循环位置并进行每次迭代,它将使用先前的位置值来计算当前位置的差。

使用较短的字符串可能更容易理解。

  • 浏览第二个单词中的每个字母,然后循环浏览第一个单词中的每个字母

  • 在第一个外部循环(每行),第一个内部循环(每列)处,S满足S = 0。(d(i, j) = d(i - 1, j - 1)的计算结果为{ {1}},即:d(i, j) = d(1 - 1, 1 - 1)

  • 在第一个外部循环,第二个内部循环处,我们有0符合S = 1。

  • 等,等等。

enter image description here

除此之外,逐步检查代码,看看变量是否基于if条件发生变化...不确定我是否可以更好地解释这一点。

U