Расстояние Левенштейна между двумя строками
См. пример синтаксиса, вызывающего этот скрипт, чтобы понять, как должны быть организованы данные перед вызовом, и т.д.: Levenshtein distance between 2 strings (syntax)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | ' Вычисление расстояния Левенштейна между 2 строками. ' (см. http://www.merriampark.com/ld.htm#ALGORITHM) ' Итосчник использованных здесь двух функций - url, приведённый выше. ' Процедура Main написана Рейналем Левек, 04.02.2004. 'См. также информацию на русском языке: http://ru.wikipedia.org/w/index.php?title=Расстояние_Левенштейна ' Для использования этого скрипта редактор данных SPSS должен содержать 2 строковых переменных s1 и s2 '(расположенных по соседству). ' Для каждого наблюдения скрипт вычисляет расстояние между двумя строками s1 и s2 и записывает результат 'в текстовый файл. ' Пример контекста использования этого скрипта вы найдёте в файле синтаксиса "LevinshteinDistanceBetween2strings.SPS". Sub Main Dim objDocuments As ISpssDocuments Dim objDataDoc As ISpssDataDoc Dim strCmd As String Dim lngNbCases As Long Set objDocuments=objSpssApp.Documents Set objDataDoc = objDocuments.GetDataDoc(0) 'В этот файл мы запишем расстояния Open "C:\\temp\\distances.txt" For Output As #1 ' Получим данные из переменных s1 и s2 Dim SpssTextData As Variant lngNbCases = objDataDoc.GetNumberOfCases SpssTextData = objDataDoc.GetTextData ("s1", "s2", 1, lngNbCases) Dim d As Integer Dim intCnt As Long For intCnt = 0 To lngNbCases - 1 d=LD(SpssTextData(0,intCnt),SpssTextData(1,intCnt)) 'MsgBox("Расстояние равно " & d ) Print #1, d Next Close #1 Set objDataDoc = Nothing Set objDocuments = Nothing End Sub '******************************** '*** Вычисление расстояния Левенштейна '(источник: http://www.merriampark.com/ld.htm#ALGORITHM) '******************************** Public Function LD(ByVal s As String, ByVal t As String) As Integer Dim d() As Integer ' матрица Dim m As Integer ' длина строки целевой строки t Dim n As Integer ' длина строки-источника s Dim i As Integer ' счётчик цикла для пробегания по s Dim j As Integer ' счётчик цикла для пробегания по t Dim s_i As String ' i-й символ s Dim t_j As String ' j-й символ t Dim cost As Integer ' штраф (cost) ' Шаг 1 n = Len(s) m = Len(t) If n = 0 Then LD = m Exit Function End If If m = 0 Then LD = n Exit Function End If ReDim d(0 To n, 0 To m) As Integer ' Шаг 2 For i = 0 To n d(i, 0) = i Next i For j = 0 To m d(0, j) = j Next j ' Шаг 3 For i = 1 To n s_i = Mid$(s, i, 1) ' Шаг 4 For j = 1 To m t_j = Mid$(t, j, 1) ' Шаг 5 If s_i = t_j Then cost = 0 Else cost = 1 End If ' Шаг 6 d(i, j) = Minimum(d(i - 1, j) + 1, d(i, j - 1) + 1, d(i - 1, j - 1) + cost) Next j Next i ' Шаг 7 LD = d(n, m) Erase d End Function '******************************* '*** Поиск минимума из 3 значений '(источник: http://www.merriampark.com/ld.htm#ALGORITHM) '******************************* Private Function Minimum(ByVal a As Integer, _ ByVal b As Integer, _ ByVal c As Integer) As Integer Dim mi As Integer mi = a If b < mi Then mi = b End If If c < mi Then mi = c End If Minimum = mi End Function |