Вычисление процентного сходства между двумя словами с использованием VBA: методы расстояния Левенштейна, сходства Жаккара и косинусного сходства

Чтобы рассчитать процентное сходство между двумя словами с помощью VBA (Visual Basic для приложений), вы можете использовать различные методы. Вот несколько примеров:

  1. Расстояние Левенштейна:
    Расстояние Левенштейна измеряет минимальное количество операций (вставок, удалений или замен), необходимых для преобразования одного слова в другое. Вычислить процентное сходство можно, разделив расстояние Левенштейна на длину более длинного слова.
Function LevenshteinSimilarity(word1 As String, word2 As String) As Double
    Dim len1 As Integer, len2 As Integer
    len1 = Len(word1)
    len2 = Len(word2)

    Dim matrix() As Integer
    ReDim matrix(0 To len1, 0 To len2)

    Dim i As Integer, j As Integer
    For i = 0 To len1
        matrix(i, 0) = i
    Next i

    For j = 0 To len2
        matrix(0, j) = j
    Next j

    For i = 1 To len1
        For j = 1 To len2
            If Mid(word1, i, 1) = Mid(word2, j, 1) Then
                matrix(i, j) = matrix(i - 1, j - 1)
            Else
                matrix(i, j) = WorksheetFunction.Min(matrix(i - 1, j - 1), matrix(i, j - 1), matrix(i - 1, j)) + 1
            End If
        Next j
    Next i

    Dim distance As Integer
    distance = matrix(len1, len2)

    LevenshteinSimilarity = (1 - distance / WorksheetFunction.Max(len1, len2)) * 100
End Function
  1. Сходство по Жаккару.
    Сходство по Жаккару измеряет сходство между двумя множествами путем вычисления размера их пересечения, деленного на размер их объединения. В контексте слов каждое слово можно рассматривать как набор символов.
Function JaccardSimilarity(word1 As String, word2 As String) As Double
    Dim set1 As Object, set2 As Object
    Set set1 = CreateObject("Scripting.Dictionary")
    Set set2 = CreateObject("Scripting.Dictionary")

    Dim i As Integer
    For i = 1 To Len(word1)
        set1(Mid(word1, i, 1)) = 1
    Next i

    For i = 1 To Len(word2)
        set2(Mid(word2, i, 1)) = 1
    Next i

    Dim intersection As Integer, union As Integer
    intersection = 0
    union = set1.Count + set2.Count

    For Each item In set1
        If set2.Exists(item) Then
            intersection = intersection + 1
            union = union - 1
        End If
    Next item

    JaccardSimilarity = (intersection / union) * 100
End Function
  1. Косинусное сходство.
    Косинусное сходство позволяет вычислить косинус угла между двумя векторами. В контексте слов вы можете представить каждое слово как вектор частот символов.
Function CosineSimilarity(word1 As String, word2 As String) As Double
    Dim vector1 As Object, vector2 As Object
    Set vector1 = CreateObject("Scripting.Dictionary")
    Set vector2 = CreateObject("Scripting.Dictionary")

    Dim i As Integer
    For i = 1 To Len(word1)
        Dim char1 As String
        char1 = Mid(word1, i, 1)
        If vector1.Exists(char1) Then
            vector1(char1) = vector1(char1) + 1
        Else
            vector1(char1) = 1
        End If
    Next i

    For i = 1 To Len(word2)
        Dim char2 As String
        char2 = Mid(word2, i, 1)
        If vector2.Exists(char2) Then
            vector2(char2) = vector2(char2) + 1
        Else
            vector2(char2) = 1
        End If
    Next i

    Dim dotProduct As Double, magnitude1 As Double, magnitude2 As Double
    dotProduct = 0
    magnitude1 = 0
    magnitude2 = 0

    For Each item In vector1
        If vector2.Exists(item) Then
            dotProduct = dotProduct + (vector1(item) * vector2(item))
        End If
        magnitude1 = magnitude1 + (vector1(item) ^ 2)
    Next item

    For Each item In vector2
        magnitude2= magnitude2 + (vector2(item) ^ 2)
    Next item

    magnitude1 = Sqr(magnitude1)
    magnitude2 = Sqr(magnitude2)

    CosineSimilarity = (dotProduct / (magnitude1 * magnitude2)) * 100
End Function

Это всего лишь несколько примеров методов расчета процентного сходства между двумя словами с помощью VBA. Вы можете выбрать метод, который лучше всего соответствует вашим потребностям, исходя из ваших конкретных требований.