我在U和V中有地址。我想看看它们是否有点类似,如果他们说“更新”如果不说“忽略”。
例如,U中的246 N High street
和V中的246 North High St
将返回值Update
。
U中的246 N High Street
和V中的458 Auburn Drive
将返回Omit
的值。
有什么想法吗?
答案 0 :(得分:1)
有很多算法可以进行模糊匹配。在excel中实现的更容易的是N-Gram。
要执行n-gram匹配,我们必须将每个地址分解为一组较小字符长度的列表。地址246 N High street
的2克列表看起来像24,46,6 , N,N , H,Hi,ig,gh,h , s,st,tr,re,ee,et
。我们可以使用3-gram进行相同的操作:246,46 ,6 N, N ,N H, Hi,Hig,igh,gh ,h s, st,str,tre,ree,eet
我们对这两个地址执行此操作,然后我们可以检查第一个地址列表中的每个项目,看它是否出现在第二个地址的列表中;计算匹配并将其除以第一个列表中的项目数。这将给你一个百分比的接近程度。
您可以使用单元格公式mid()
和countif()
来表示使用表单公式,但我认为在VBA中将其写出来并使其成为UDF更容易。
Function NGramCompare(string1 As String, string2 As String, intGram As Integer) As Double
'Take in two strings and the N-gram
Dim intChar As Integer, intGramMatch As Integer
Dim ngramList1 As String, ngramList2 As String, nGram As Variant
Dim nGramArr1 As Variant
'split the first string into a list of ngrams
For intChar = 1 To Len(string1) - (intGram-1)
If ngramList1 <> "" Then ngramList1 = ngramList1 & ","
ngramList1 = ngramList1 & Mid(string1, intChar, intGram)
Next intChar
'split the secong string into a list of ngrams
For intChar = 1 To Len(string2) - (intGram-1)
If ngramList2 <> "" Then ngramList2 = ngramList2 & ","
ngramList2 = ngramList2 & Mid(string2, intChar, intGram)
Next intChar
'Split the ngramlist1 into an array through which we can iterate
nGramArr1 = Split(ngramList1, ",")
'Iterate through array and compare values to ngramlist2
For Each nGram In nGramArr1
If InStr(1, ngramList2, nGram) Then
'we found a match, add to the counter
intGramMatch = intGramMatch + 1
End If
Next nGram
'output the percentage of grams matching.
NGramCompare = intGramMatch / (UBound(nGramArr1) + 1)
End Function
如果您从未使用过UDF:
然后,假设地址1位于A1
且地址2位于B1
,您可以将其放入C1
:
=NGramCompare(A1, B1, 2)
对于您的第一个地址,将吐出56%。这似乎是一个相当不错的匹配。如果您发现正在获得太多正面命中,则可以通过更改最后一个参数将2-gram更改为3-gram。
更进一步,它会说&#34;更新&#34;或者&#34; Omit&#34;你可以这样做:
=If(NGramCompare(A1, B1, 2)>.30, "Update", "Omit")
我只是设置它以便它会考虑超过30%的匹配,但您可以根据需要进行调整。无论你在哪里设置它,你可能会得到一定比例的误报或漏报,但这就是模糊匹配的方式。
答案 1 :(得分:0)
一些天真的方法可以比较前几个字符
=LEFT(A1,5)=LEFT(B1,5)
或更换零件直至匹配
=(SUBSTITUTE(SUBSTITUTE(LOWER(A2)," street"," ST")," north "," N ")
=SUBSTITUTE(SUBSTITUTE(LOWER(B2)," street"," ST")," north "," N "))
在调整大多数情况后,两者都可能变成一个丑陋的公式