Domanda

Ho bisogno di misurare la distanza fisica tra due luoghi i cui nomi sono forniti come stringhe. Dal momento che a volte i nomi sono scritti in modo leggermente diverso, ero alla ricerca di una libreria che potrebbe aiutarmi a misurare la differenza e poi combinarlo con una misura della latitudine e longitudine per selezionare gli abbinamenti corretti. lingue preferite:. Java o PHP

Qualche suggerimento?

È stato utile?

Soluzione

Date un'occhiata alla Levenshtein distanza . Questo è un modo per misurare come diversi due stringhe sono gli uni dagli altri.

Speriamo che ho capito la tua domanda correttamente; l'utilizzo di "distanza" nella stessa frase come "latitudine e longitudine" potrebbe essere fonte di confusione!

Altri suggerimenti

Anche se scritta in C (con Python e Tcl attacchi), libdistance sarebbe uno strumento per l'applicazione di varie distanze metriche sulle stringhe / dati.

Metriche incluso:

  • Bloom
  • Damerau
  • euclid
  • hamming
  • Jaccard
  • levenshtein
  • manhattan
  • Minkowski
  • needleman_wunsch

Si potrebbe ottenere qualche risultato decente utilizzando un algoritmo fonetica per trovare nomi leggermente misspelld.

Inoltre, se si utilizza una distanza di modifica più meccanico, probabilmente vedrete risultati migliori usando una funzione ponderata che rappresenta la geometria della tastiera (cioè fisicamente vicini chiavi sono "più economico" da sostituire rispetto lontani quelli). Questo è un metodo brevettato btw, quindi fate attenzione a non scrivere qualcosa che diventa troppo popolare;)

mi sono permesso di tradurre un pezzo di codice C # che ho scritto per calcolare la distanza Levenshtein in codice Java. Si utilizza solo due array monodimensionali che si alternano invece di un grande matrice irregolare:

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

Non è rigorosamente testato, ma sembra funzionare bene. Esso si basa su un'implementazione di Python che ho fatto per un esercizio di università. Spero che questo aiuta!

Vorrei raccomandare o Levenshtein Distanza o il Jaccard Distanza per il confronto di testo.

SumMetrics in Java, ma non hanno usato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top