VBScript : Levenshtein Distance

Levenshtein Distance은 두 문자열의 유사도를 구할 때 사용할 수 있는 알고리듬이다. 이 알고리듬은 첫번째 문자열을 두번째 문자열로 변환하기 위해서 필요한 작업수를 구한다.

예로 GeorgeGeordie 두 문자열을 생각해 보자. George를 Geordie로 바꾸기 위해서는 다음과 같이 2개의 문자 변환 작업이 필요하다.

  1. George -> Geordie (‘g’를 ‘d’로 치환)
  2. Georde -> Geordie (‘d’와 ‘e’ 사이에 ‘i’ 추가)

이미지 출처 : http://www.codeproject.com/Articles/162790/Fuzzy-String-Matching-with-Edit-Distance

다음은 VBScript로 이를 구현한 소스이다.

Function LevenshteinDistance(string1, string2)
    Dim i, j, len1, len2, distance(), result

    len1 = Len(string1) : len2 = Len(string2)
    ReDim distance(len1, len2)
    For i = 0 To len1 : distance(i, 0) = i : Next
    For j = 0 To len2 : distance(0, j) = j : Next

    For i = 1 To len1
        For j = 1 To len2
            If Asc(Mid(string1, i, 1)) = Asc(Mid(string2, j, 1)) Then
                distance(i, j) = distance(i - 1, j - 1)
            Else
                distance(i, j) = Min3(distance(i - 1, j) + 1, distance(i, j - 1) + 1, distance(i - 1, j - 1) + 1)
            End If
        Next
    Next

    LevenshteinDistance = distance(len1, len2)
End Function

Function Min3(a, b, c)
    Dim result

    result = a
    if (b < result) then result = b
    if (c < result) then result = c

    Min3 = result
End Function