2014-02-14 69 views
1

我正在尋找比較字符串相似性的方法。具體來說,給定兩個地址,我希望衡量它們的相似性。統計字符串比較

E.G.

鑑於8219石灰森林大道 和8219石灰福斯特大道

比較器的輸出應該給我的琴絃有多相似的想法。

+2

您需要更多精確的「類似」定義才能真正獲得任何有用的東西,我認爲...一旦你確切地知道你在找什麼,雖然,有很多有據可查的算法,這種事情... – twalberg

回答

4

Levenshtein距離是要走的路。剛開箱時的想法 - 兩個地址可能會有很大的不同(一個可以是郵政編碼,另一個是帶數字的街道),並且花費大量資金創建出色的地理編碼服務(如https://developers.google.com/maps/documentation/geocoding/?hl=cs)。因此,另一種方法是通過地理編碼服務計算兩個地址的經度/緯度,然後查看緯度/經度是否匹配:)

+0

谷歌使我們的生活更輕鬆日常;-) – Leo

+0

@Ondrej Svedjar - 我喜歡地理編碼的想法。我們目前正在使用地址驗證服務來獲取我們可以比較的「規範化」地址,但是我們遇到了服務無法驗證有效地址的問題。在這些情況下,映射API的hae仍然能夠找到地址。 – jparram

2

,你可以使用類似這樣

import org.apache.commons.lang.StringUtils; 


public class StringComparison { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String s1 = "8219 Lime Forest Blvd"; 
     String s2 = "8219 Lime Forst Boulevard"; 

     //number of chars that differ 
     int distance = StringUtils.getLevenshteinDistance(s1, s2); 

     //"relative" difference 
     float d = (float)distance/(float)s1.length(); 

     System.out.println(d); 

    } 

} 

getLevenshteinDistance會給你一個數字,不同於S1和S2字符的。

我認爲這是更有用的,如果你將這個數字除以字符串長度(小心除以零),並嘗試手動找到一個甜蜜的地方,其差異足夠小,以檢測相同的地址(對我而言,這是通常大約20〜30%)

這個例子是在Java中,使用的lib是http://commons.apache.org/proper/commons-lang/index.html

此外,您可以改善這只是更換已知的縮寫和也一道努力。