В 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.