Python Excel Levenshtein算法在柱上的应用

Python Excel Levenshtein算法在柱上的应用,python,r,excel,algorithm,Python,R,Excel,Algorithm,我试图使用Levenshtein算法来发现记录之间的相似性。 我拥有的是项目#列、描述、查找、相似性(%)、返回相似项。在列描述中,我有几个不同的描述,在查找项中,我将有与描述列中的值相似的值。使用Levenshtein函数,我想识别相似性,如果超过90%,我想从附加到相似项的项#列返回值。有关更好的描述,请参见图片。 这是我正在使用的Levenshtein的代码: Function Levenshtein3(ByVal string1 As String, ByVal string2 As S

我试图使用Levenshtein算法来发现记录之间的相似性。 我拥有的是项目#列、描述、查找、相似性(%)、返回相似项。在列描述中,我有几个不同的描述,在查找项中,我将有与描述列中的值相似的值。使用Levenshtein函数,我想识别相似性,如果超过90%,我想从附加到相似项的项#列返回值。有关更好的描述,请参见图片。 这是我正在使用的Levenshtein的代码:

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

Dim i As Long, j As Long, string1_length As Long, string2_length As Long
Dim distance(0 To 60, 0 To 50) As Long, smStr1(1 To 60) As Long, smStr2(1 To 
50) As Long
Dim min1 As Long, min2 As Long, min3 As Long, minmin As Long, MaxL As Long

string1_length = Len(string1):  string2_length = Len(string2)

distance(0, 0) = 0
For i = 1 To string1_length:    distance(i, 0) = i: smStr1(i) = 
Asc(LCase(Mid$(string1, i, 1))): Next
For j = 1 To string2_length:    distance(0, j) = j: smStr2(j) = 
Asc(LCase(Mid$(string2, j, 1))): Next
For i = 1 To string1_length
    For j = 1 To string2_length
        If smStr1(i) = smStr2(j) Then
        distance(i, j) = distance(i - 1, j - 1)
        Else
        min1 = distance(i - 1, j) + 1
        min2 = distance(i, j - 1) + 1
        min3 = distance(i - 1, j - 1) + 1
        If min2 < min1 Then
            If min2 < min3 Then minmin = min2 Else minmin = min3
        Else
            If min1 < min3 Then minmin = min1 Else minmin = min3
        End If
        distance(i, j) = minmin
        End If
    Next
Next

' Levenshtein3 will properly return a percent match (100%=exact) based on 
 similarities and Lengths etc...
 MaxL = string1_length: If string2_length > MaxL Then MaxL = string2_length
 Levenshtein3 = 100 - CLng((distance(string1_length, string2_length) * 100)    
/ MaxL)

End Function
函数Levenshtein3(ByVal string1作为字符串,ByVal string2作为字符串)的长度
尺寸i为长,j为长,string1_长度为长,string2_长度为长
变暗距离(0至60,0至50)为1倍长,smStr1(1至60)为1倍长,smStr2(1至50)为1倍长
50)只要
将最小值1变长,最小值2变长,最小值3变长,最小值变长,最大值变长
string1_长度=Len(string1):string2_长度=Len(string2)
距离(0,0)=0
对于i=1到string1u长度:距离(i,0)=i:smStr1(i)=
Asc(LCase(Mid$(string1,i,1)):下一个
对于j=1到string2_长度:距离(0,j)=j:smStr2(j)=
Asc(LCase(中期美元)(string2,j,1)):下一个
对于i=1到1的长度
对于j=1至2_长度
如果smStr1(i)=smStr2(j),则
距离(i,j)=距离(i-1,j-1)
其他的
min1=距离(i-1,j)+1
min2=距离(i,j-1)+1
min3=距离(i-1,j-1)+1
如果min2MaxL,则MaxL=string2_长度
Levenshtein3=100-CLng(距离(string1\u长度、string2\u长度)*100)
/最大值)
端函数
我如何使用C3中的查找值并查看整个B列,一旦找到90%以上相似的项目,返回该描述所附的项目


在R上的Python中这样做容易吗?

如果这是针对excel工作表中的代码,那么它根本不是VB.NET。在R中,几乎可以肯定CRAN上至少有一个用于此的包。另一方面,没有理由不能在VBA中正确实现它。如果数据在Excel中,并且您希望在Excel中使用它,那么使用VBA是很自然的。您可以循环浏览B列中的每个条目,并在满足条件时返回相邻的A列。考虑您可能希望排除相同的条目;以及您希望如何处理符合条件的多个项目。我将为您的所有
说明
复制
查找
。通过这种方式,您可以查看每个
描述的分数,并手动检查超过某个阈值的分数。R中的
stringdist
包就是这样做的。如果您已经在Excel中,并且您的数据大小可以管理,那么我认为没有必要切换。如果数据足够小,可视检查是可行的,那么在Excel中对您的匹配项进行视觉检查会更容易。stringdist包是用C编写的,这将产生1M行所需的速度: