Iki yer arasındaki fiziksel mesafe

6 Cevap java

Ben isimleri dizeleri olarak sunulmaktadır iki yer arasındaki fiziki mesafeyi ölçmek gerekir. Bazen isimleri biraz daha farklı yazılır beri, bana farkını ölçmek ve daha sonra doğru eşleşmeleri seçmek için enlem ve boylam bir ölçü ile birleştirmek yardımcı olabilecek bir kütüphane arıyordu. Tercih edilen dil: Java veya PHP.

Herhangi bir öneriniz?

6 Cevap

Levenshtein distance bakabilirsiniz. Bu iki dize birbirinden ne kadar farklı ölçmenin bir yoludur.

Umarım sorunuzu doğru anladım; "enlem ve boylam" gibi aynı cümlede "mesafe" kullanarak kafa karıştırıcı olabilir!

(Python ve tcl bağlamaları ile) c yazılmış olmasına rağmen, libdistance dizeleri / veri üzerinde çeşitli mesafeleri ölçümleri uygulamak için bir araç olacaktır.

Ölçümleri dahil:

  • çiçeklenme
  • Damerau
  • Öklit
  • hamming
  • Jaccard
  • levenshtein
  • Manhattan
  • Minkowski
  • needleman_wunsch

Sen biraz misspelld adlarını bulmak için phonetic algorithm kullanarak bazı iyi sonuçlar alabilirsiniz.

Eğer daha mekanik bir düzenleme mesafe kullanıyorsanız Ayrıca, muhtemelen (yani fiziksel olarak yakın tuşları uzak olanlar kapalı daha yerine "ucuz" olan) klavye geometri hesapları ağırlıklı işlevini kullanarak daha iyi sonuçlar göreceksiniz. Bu patentli bir yöntem btw, yani ;) çok popüler hale şey yazmak için dikkatli olmalı

Ben Java koduna Levenshtein mesafe hesaplamak için yazdım C # kodu bir parça çevirmek için özgürlük aldı. Bunun yerine büyük bir tırtıklı dizinin alternatif sadece iki tek boyutlu diziler kullanır:

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

Bu titizlikle test edilmiş, ancak tamam çalışıyor gibi görünüyor değil. Ben bir üniversite egzersiz için yapılmış bir Python uygulaması dayanmaktadır. Bu yardımcı olur umarım!

Ben metni karşılaştırmak için ya Levenshtein Distance veya Jaccard Distance öneriyoruz.

I SumMetrics Java bulundu, ama kullanmadım.