2013-05-02 2 views
0

Итак, у меня есть эта функция, которая будет быстро возвращать расстояние Левенштейна между двумя строками:Найти, какие клетки имеют наименьшее расстояние Левенштейна

Function Levenshtein(ByVal string1 As String, ByVal string2 As String) As Long 

Dim i As Long, j As Long 
Dim string1_length As Long 
Dim string2_length As Long 
Dim distance() As Long 

string1_length = Len(string1) 
string2_length = Len(string2) 
ReDim distance(string1_length, string2_length) 

For i = 0 To string1_length 
    distance(i, 0) = i 
Next 

For j = 0 To string2_length 
    distance(0, j) = j 
Next 

For i = 1 To string1_length 
    For j = 1 To string2_length 
     If Asc(Mid$(string1, i, 1)) = Asc(Mid$(string2, j, 1)) Then 
      distance(i, j) = distance(i - 1, j - 1) 
     Else 
      distance(i, j) = Application.WorksheetFunction.Min _ 
      (distance(i - 1, j) + 1, _ 
      distance(i, j - 1) + 1, _ 
      distance(i - 1, j - 1) + 1) 
     End If 
    Next 
Next 

Levenshtein = distance(string1_length, string2_length) 

End Function 

Я хочу, чтобы выполнить быстрое сравнение между всеми клетками в «А» колонке и возврате, у которых есть «небольшое» расстояние Левенштейна. Как бы я сделал все эти сравнения?

+0

Используйте таблицу. Переместите столбец A в строку 1 и используйте таблицу для сравнения. Условный формат для определения «малого». –

ответ

2

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

Если это первое это должно работать нормально:

Example2

Вы просто скопировать и вставить транспонированные значения, чтобы создать все эти заголовки (как заметил Dale). Вы можете использовать условное форматирование, чтобы выделить самые низкие результаты.

Или, если вы хотите фактические строки, чтобы вернуться, вы должны быть в состоянии использовать это:

=IF(AND(Levenshtein($A28,B$27)>0,Levenshtein($A28,B$27)<=3),$A28&"/"&B$27,"") 

Example3

Просто скопировать и вставить уникальные значения, если вы хотите, возвращаемые комбинации в одном столбце.

Удачи.

+0

Блестящий. Я не знаю, почему я не думал о транспонированных таблицах. Такая простая идея. Код «фактической строки» является удивительным. – Parseltongue

Смежные вопросы