2009-05-25 50 views
9

我需要測量兩個地方之間的物理距離,這兩個地方的名稱以字符串形式提供。由於有時名稱的寫法會略有不同,因此我正在尋找一個庫,可以幫助我衡量差異,然後將其與經緯度的度量值結合以選擇正確的匹配。首選語言:Java或PHP。兩個地方之間的物理距離

有什麼建議嗎?

+0

嘿,我是困惑和編輯的標題來強調,而錯誤的焦點 - 這個問題很可能最終還是一個字符串距離一個,作爲公認的答案建議。 – icedwater 2013-07-02 06:21:54

回答

6

看看Levenshtein distance。這是衡量兩個琴絃彼此不同的方式。

希望我正確理解你的問題;在「經度和緯度」相同的句子中使用「距離」可能會令人困惑!

+0

我的錯..使用「距離」很混亂。就緯度和長度而言,我真的是指物理距離。就字符串而言,我的意思是兩個字符串之間的「差異」。 Levenshtein距離似乎很有趣,如果有一個「準備使用」庫進行距離測量,這將是完美的... – PieroP 2009-05-25 20:52:27

+3

PHP內置了Levenshtein距離函數:http://www.php.net/manual/en/function.levenshtein.php – 2009-05-25 21:00:49

+0

感謝您的輸入 – PieroP 2009-05-25 21:39:27

4

雖然用C(Python和TCL綁定),libdistance將是對字符串/數據應用多個距離度量的工具。

度量包括:

  • 盛開
  • damerau
  • 歐幾里得
  • 海明
  • 的Jaccard
  • 的Levenshtein
  • 曼哈頓
  • 閔可夫斯基
  • needleman_wunsch
0

我冒昧地一塊我寫來計算Levenshtein距離爲Java代碼C#代碼轉換。這裏僅僅使用兩個交替的,而不是一個大的交錯數組一維數組:

public static int getDifference(String a, String b) 
{ 
    // Minimize the amount of storage needed: 
    if (a.length() > b.length()) 
    { 
     // Swap: 
     String x = a; 
     a = b; 
     b = x; 
    } 

    // Store only two rows of the matrix, instead of a big one 
    int[] mat1 = new int[a.length() + 1]; 
    int[] mat2 = new int[a.length() + 1]; 

    int i; 
    int j; 

    for (i = 1; i <= a.length(); i++) 
     mat1[i] = i; 

    mat2[0] = 1; 

    for (j = 1; j <= b.length(); j++) 
    { 
     for (i = 1; i <= a.length(); i++) 
     { 
      int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1); 

      mat2[i] = 
       Math.min(mat1[i - 1] + c, 
       Math.min(mat1[i] + 1, mat2[i - 1] + 1)); 
     } 

     // Swap: 
     int[] x = mat1; 
     mat1 = mat2; 
     mat2 = x; 

     mat2[0] = mat1[0] + 1; 
    } 

    // It's row #1 because we swap rows at the end of each outer loop, 
    // as we are to return the last number on the lowest row 
    return mat1[a.length()]; 
} 

它不是嚴格的測試,但它似乎是工作正常。它基於我爲大學演習製作的Python實現。希望這可以幫助!

1

你可能會使用phonetic algorithm找到小幅misspelld名字得到一些像樣的成績。

另外,如果你使用了更多的機械編輯距離,你可能會看到使用佔鍵盤幾何加權功能更好的結果(即物理上接近鍵是「便宜」遠比更換掉的)。這是一個專利方法順便說一句,所以要小心不要寫的東西,變得太受歡迎;)