Изучение различных методов расчета процента сходства между двумя словами в VBA

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

Метод 1: расстояние Левенштейна
Расстояние Левенштейна — популярный алгоритм измерения разницы между двумя строками. Он вычисляет минимальное количество операций (вставки, удаления или замены), необходимых для преобразования одной строки в другую. Процент сходства можно получить, вычитая расстояние Левенштейна из максимальной длины двух строк и разделив результат на максимальную длину.

Function LevenshteinDistance(s1 As String, s2 As String) As Double
    Dim i As Integer, j As Integer
    Dim l1 As Integer, l2 As Integer
    Dim d() As Integer

    l1 = Len(s1)
    l2 = Len(s2)

    ReDim d(0 To l1, 0 To 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
                d(i, j) = WorksheetFunction.Min(d(i - 1, j) + 1, _
                                                d(i, j - 1) + 1, _
                                                d(i - 1, j - 1) + 1)
            End If
        Next
    Next

    LevenshteinDistance = 1 - d(l1, l2) / Application.WorksheetFunction.Max(l1, l2)
End Function

Метод 2: косинусное подобие
Косинусное подобие измеряет угол между двумя векторами в многомерном пространстве. В контексте сходства слов мы можем представить каждое слово в виде вектора, где каждое измерение представляет частоту употребления определенной буквы или символа. Вычислив косинусное сходство между двумя векторами слов, мы можем определить процент их сходства.

Function CosineSimilarity(s1 As String, s2 As String) As Double
    Dim vec1() As Double, vec2() As Double
    Dim i As Integer, j As Integer
    Dim dotProduct As Double, magnitude1 As Double, magnitude2 As Double

    ReDim vec1(1 To 26) As Double
    ReDim vec2(1 To 26) As Double

    For i = 1 To Len(s1)
        vec1(Asc(UCase(Mid(s1, i, 1))) - 64) = vec1(Asc(UCase(Mid(s1, i, 1))) - 64) + 1
    Next

    For j = 1 To Len(s2)
        vec2(Asc(UCase(Mid(s2, j, 1))) - 64) = vec2(Asc(UCase(Mid(s2, j, 1))) - 64) + 1
    Next

    dotProduct = 0
    magnitude1 = 0
    magnitude2 = 0

    For i = 1 To 26
        dotProduct = dotProduct + vec1(i) * vec2(i)
        magnitude1 = magnitude1 + vec1(i) ^ 2
        magnitude2 = magnitude2 + vec2(i) ^ 2
    Next

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

    CosineSimilarity = dotProduct / (magnitude1 * magnitude2)
End Function

Метод 3: сходство Жаккара
Сходство Жаккара — это мера сходства между двумя наборами. В контексте сходства слов мы можем рассматривать каждое слово как набор символов. Сходство Жаккара рассчитывается путем деления размера пересечения двух множеств на размер их объединения.

Function JaccardSimilarity(s1 As String, s2 As String) As Double
    Dim set1 As Object, set2 As Object
    Dim i As Integer

    Set set1 = CreateObject("Scripting.Dictionary")
    Set set2 =CreateObject("Scripting.Dictionary")

    For i = 1 To Len(s1)
        set1(UCase(Mid(s1, i, 1))) = True
    Next

    For i = 1 To Len(s2)
        set2(UCase(Mid(s2, i, 1))) = True
    Next

    Dim intersectionCount As Integer
    Dim unionCount As Integer

    intersectionCount = 0
    unionCount = set1.Count + set2.Count

    For Each key In set1.Keys
        If set2.exists(key) Then
            intersectionCount = intersectionCount + 1
            unionCount = unionCount - 1
        End If
    Next

    JaccardSimilarity = intersectionCount / unionCount
End Function

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