excel - 找出哪些细胞具有最小的 levenshtein 距离

标签 excel vba

所以,我有这个函数可以快速返回两个字符串之间的 Levenshtein 距离:

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

我想在“A”列中的所有单元格之间进行快速比较,并返回哪些单元格具有“小”Levenshtein 距离。我将如何进行所有这些比较?

最佳答案

您是否想找出哪些字符串组合具有较小的 levenshtein 距离,或者只是总体上每个字符串与所有其他字符串的相似/不同程度如何?

如果是前者,这应该可以正常工作:

Example2

您只需复制并粘贴转置的值即可创建所有这些标题(正如 Dale 评论的那样)。您可以使用条件格式来突出显示最低的结果。

或者,如果您希望返回实际的字符串,您应该可以使用它:

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

Example3

如果您希望在单个列中返回组合,只需复制并粘贴唯一值。

祝你好运。

关于excel - 找出哪些细胞具有最小的 levenshtein 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346451/

相关文章:

vba - 创建作为参数传递的类的副本

excel - 打开工作表时如何以编程方式更改 Excel 2007 功能区上的标签值

excel - CommandBars.ExecuteMso 的使用问题

vba - 一次性将整个集合转入一个范围

字典中的 Excel VBA 类

vba - 根据名称的结尾部分隐藏工作表 - VBA

vba - 将单元格值存储在变量中

regex - Excel VBA : search a string to find the first non-text character

excel - VBA 函数无返回值

java - Excel 到字符串 xls/xlsx 不同的结果