Frage

Ich brauche die räumliche Distanz zwischen zwei Orten, deren Namen als Strings vorgesehen sind zu messen. Da manchmal die Namen etwas anders geschrieben werden, wurde ich für eine Bibliothek suchen, der mir den Unterschied messen helfen könnte, und dann mit einem Maß für die geografische Breite und Länge kombinieren sie die richtigen Spiele zu wählen. Bevorzugte Sprachen:. Java oder PHP

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Haben Sie einen Blick auf die Levenshtein Abstand . Dies ist eine Methode zur Messung, wie unterschiedlich zwei Strings voneinander sind.

Hoffentlich verstand ich Ihre Frage richtig; „Abstand“ im selben Satz mit als „Breitengrad und Längengrad“ verwirrend sein könnte!

Andere Tipps

Obwohl in c geschrieben (mit Python und Tcl-Bindungen), libdistance ein Werkzeug zum Anlegen von mehreren Distanzen Metriken auf Strings / Daten wäre.

Metriken enthalten:

  • Blüte
  • Damerau
  • euclid
  • Hamming
  • Jaccard
  • levenshtein
  • manhattan
  • Minkowski
  • needleman_wunsch

Sie könnten ein paar anständige Ergebnisse erhalten unter Verwendung eines Laut Algorithmus leicht misspelld Namen zu finden.

Auch wenn Sie eine mechanische Editierdistanz verwenden, werden Sie wahrscheinlich bessere Ergebnisse sehen eine gewichtete Funktion, die für die Tastatur-Geometrie (off diejenigen als weit das heißt physisch nahe Schlüssel sind „billiger“ zu ersetzen) ausmacht. Das ist eine patentierte Methode btw, so vorsichtig sein, nicht etwas zu schreiben, zu populär wird;)

habe ich mir erlaubt, ein Stück von C # -Code zu übersetzen ich geschrieben habe, die Levenshtein-Distanz in Java-Code zu berechnen. Es verwendet nur zwei Single-Dimension-Arrays, die anstelle eines großen gezackten Array wechseln:

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

Es ist nicht rigoros getestet, aber es scheint in Ordnung zu arbeiten. Es wurde auf einer Python-Implementierung basiert ich für eine Universität Übung. Hoffe, das hilft!

Ich würde empfehlen, entweder Levenshtein Entfernung oder den Jaccard Entfernung für Text verglichen wird.

Ich fand SumMetrics in Java, haben aber nicht verwendet es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top