2009-05-25 8 views
9

Tôi cần đo khoảng cách vật lý giữa hai địa điểm có tên được cung cấp dưới dạng chuỗi. Vì đôi khi các tên được viết hơi khác nhau, tôi đang tìm một thư viện có thể giúp tôi đo sự khác biệt và sau đó kết hợp nó với thước đo vĩ độ và kinh độ để chọn các kết quả phù hợp. Ngôn ngữ ưa thích: Java hoặc PHP.Khoảng cách vật lý giữa hai địa điểm

Mọi đề xuất?

+0

Heh, tôi đã nhầm lẫn và chỉnh sửa tiêu đề để nhấn mạnh thay vì tập trung sai - câu hỏi có lẽ cuối cùng vẫn là một khoảng cách chuỗi một, như câu trả lời được chấp nhận cho thấy. – icedwater

Trả lời

6

Hãy xem Levenshtein distance. Đây là một cách để đo lường hai chuỗi khác nhau như thế nào với nhau.

Hy vọng tôi đã hiểu chính xác câu hỏi của bạn; sử dụng "khoảng cách" trong cùng một câu như "vĩ độ và kinh độ" có thể gây nhầm lẫn!

+0

Lỗi của tôi .. sử dụng "khoảng cách" IS gây nhầm lẫn. Theo như lat và dài có liên quan tôi thực sự có nghĩa là khoảng cách phisical. Theo như các chuỗi có liên quan tôi có nghĩa là "sự khác biệt" giữa hai dây. Khoảng cách Levenshtein có vẻ như đang cố ý, nó sẽ là hoàn hảo nếu có thư viện "sẵn sàng để sử dụng" để đo khoảng cách ... – PieroP

+3

PHP có chức năng khoảng cách Levenshtein được xây dựng trong: http://www.php.net/manual/en/function.levenshtein.php –

+0

Cảm ơn bạn đã nhập – PieroP

4

Mặc dù được viết bằng c (với các ràng buộc python và tcl), libdistance sẽ là công cụ để áp dụng một số chỉ số khoảng cách trên chuỗi/dữ liệu.

Metrics bao gồm:

  • nở
  • damerau
  • euclid
  • Hamming
  • Jaccard
  • Levenshtein
  • manhattan
  • Minkowski
  • needleman_wunsch
0

tôi thấy SumMetrics trong Java, nhưng đã không sử dụng nó.

+0

Tôi đã kiểm tra việc triển khai Levenshtein của họ và tôi dám nói rằng được cung cấp trong bài đăng của tôi sử dụng ít bộ nhớ hơn (mặc dù ít vấn đề hơn với chuỗi ngắn). –

0

Tôi đã tự do dịch một đoạn mã C# mà tôi đã viết để tính khoảng cách Levenshtein vào mã Java. Nó chỉ sử dụng hai mảng kích thước đơn thay thế cho một mảng có răng cưa lớn:

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()]; 
} 

Nó không được kiểm tra nghiêm ngặt, nhưng có vẻ như không hoạt động. Nó được dựa trên một thực hiện Python tôi đã thực hiện cho một bài tập đại học. Hi vọng điêu nay co ich!

1

Bạn có thể nhận được một số kết quả tốt bằng cách sử dụng phonetic algorithm để tìm tên hơi sai chính tả.

Ngoài ra, nếu bạn sử dụng khoảng cách chỉnh sửa cơ học hơn, có thể bạn sẽ thấy kết quả tốt hơn bằng cách sử dụng chức năng có trọng số cho hình học bàn phím (tức là các khóa đóng thực tế là "rẻ hơn" để thay thế. Đó là một phương pháp được cấp bằng sáng chế btw, vì vậy hãy cẩn thận không viết điều gì đó trở nên quá phổ biến;)

+0

Làm thế nào một ý tưởng đơn giản (nhưng rực rỡ) được cấp bằng sáng chế? : P Hay đó là kỹ thuật chính xác để tôn vinh ánh xạ bàn phím? –

+0

Vì thuật toán phần mềm có thể được cấp bằng sáng chế ở một số khu vực pháp lý về phía sau: Tôi chỉ là kỹ sư nên tôi chưa bao giờ bận tâm tìm kiếm chi tiết ở đó, chỉ tin tưởng các cố vấn pháp lý của công ty. – Christoffer

+0

Ý tưởng về thuật toán ngữ âm rất hay. Có thư viện nào để triển khai tính năng này không? – PieroP