我有U和V的地址。我想看看他們是否有點類似,如果他們說「更新」如果不是說「省略」。比較兩個地址列
例如U中的246 N High street
和V中的246 North High St
將返回值Update
。 U中的 246 N High Street
和V中的458 Auburn Drive
將返回值Omit
。
任何想法?
我有U和V的地址。我想看看他們是否有點類似,如果他們說「更新」如果不是說「省略」。比較兩個地址列
例如U中的246 N High street
和V中的246 North High St
將返回值Update
。 U中的 246 N High Street
和V中的458 Auburn Drive
將返回值Omit
。
任何想法?
有很多做模糊匹配的算法。在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克爲3克。
把它更進了一步,因此會說「更新」或「忽略」你可以這樣做:
=If(NGramCompare(A1, B1, 2)>.30, "Update", "Omit")
我只是設置,以便它會考慮匹配任何東西30%以上,但你可根據需要進行調整。不管你在哪裏設置它,你最終可能會得到一些比較結果是誤報或誤報,但這就是模糊匹配的方式。
一些幼稚的方法可以是前幾個字符
=LEFT(A1,5)=LEFT(B1,5)
比較或直到它們匹配
=(SUBSTITUTE(SUBSTITUTE(LOWER(A2)," street"," ST")," north "," N ")
=SUBSTITUTE(SUBSTITUTE(LOWER(B2)," street"," ST")," north "," N "))
都可能會變成一個大的難看的公式調整後,更換零件大多數情況下
這是一般的難題。你需要使用某種模糊匹配。查看答案[這裏](http://stackoverflow.com/questions/14821345/excel-approximate-text-match)瞭解如何去做。 –