RNJarvis
8/31/2016 - 1:09 PM

LevenshteinDistance Test

LevenshteinDistance Test

Public Function String_FuzzyMatch(ByVal a As String, ByVal b As String, removeSpaces As Boolean) As Double

   If removeSpaces Then
      a=Replace(a," ","")
      b=Replace(b," ","")
   End If

   Dim length As Integer
   length=Long_Max(Len(a),Len(b))

   If length = 0 Then Return 0

   Dim distance As Integer
   distance=String_LevenshteinDistance(a, b)
   Return CDbl(1.0 - (distance / length)^2)
End Function

Public Function String_LevenshteinDistance(a As String ,b As String) As Integer
   'http://en.wikipedia.org/wiki/Levenshtein_distance
   'Levenshtein distance between two strings, used for fuzzy matching
   Dim i,j,cost,d,ins,del,subs As Integer

   If Len(a) = 0 Then Return Len(b)
   If Len(b) = 0 Then Return Len(a)

   ReDim d(Len(a), Len(b))
   For i = 0 To Len(a)
      d(i, 0) = i
   Next
   For j = 0 To Len(b)
      d(0, j) = j
   Next
   For i = 1 To Len(a)
     For j = 1 To Len(b)
         If Mid(a, i, 1) = Mid(b, j, 1) Then cost = 0 Else cost = 1   ' cost of substitution

         del = ( d( i - 1, j ) + 1 ) ' cost of deletion
         ins = ( d( i, j - 1 ) + 1 ) ' cost of insertion
         subs = ( d( i - 1, j - 1 ) + cost ) 'cost of substition or match
         d(i,j)=Long_Min(ins,Long_Min(del,subs))
      Next
   Next
   Return d(Len(a), Len(b))
End Function

Public Function Long_Max(v1 As Long, v2 As Long) As Long
   If v1 > v2 Then Return v1 Else Return v2
End Function

Public Function Long_Min(v1 As Long, v2 As Long) As Long
   If v1 < v2 Then Return v1 Else Return v2
End Function


      Case "btnFuzzyMatch"

         Dim a, b As String
         a = InputBox("Value 1")
         b = InputBox("Value 2")
         MsgBox CStr(String_FuzzyMatch(a, b, True))