2009-05-25 37 views
9

ho bisogno di misurare la distanza fisica tra due luoghi i cui nomi sono forniti come stringhe. Poiché a volte i nomi sono scritti in modo leggermente diverso, stavo cercando una libreria che potesse aiutarmi a misurare la differenza e quindi combinarla con una misura della latitudine e della longitudine per selezionare le corrispondenze corrette. Lingue preferite: Java o PHP.distanza fisica tra due luoghi

Qualche suggerimento?

+0

Eh, ero confuso e modificato il titolo per sottolineare invece la messa a fuoco sbagliata - la questione è probabilmente in ultima analisi, ancora una distanza stringa di uno, come suggerisce la risposta accettata. – icedwater

risposta

6

Date un'occhiata al Levenshtein distance. Questo è un modo per misurare la differenza tra due stringhe l'una dall'altra.

Speriamo che ho capito la tua domanda correttamente; usare "distanza" nella stessa frase di "latitudine e longitudine" potrebbe confondere!

+0

La mia colpa .. utilizzando "distanza" è confusa. Per quanto riguarda lat e long intendevo davvero la distanza fisica. Per quanto riguarda le stringhe intendevo le "differenze" tra le due corde. La distanza di Levenshtein sembra interessante, sarebbe perfetto se esistesse una libreria "pronta all'uso" per la misurazione della distanza ... – PieroP

+3

PHP ha una funzione di distanza Levenshtein integrata in: http://www.php.net/manual/en/function.levenshtein.php –

+0

Grazie per l'input – PieroP

4

Sebbene scritto in c (con collegamenti python e tcl), libdistance sarebbe uno strumento per applicare metriche su distanze diverse su stringhe/dati.

Metrics incluso:

  • fioritura
  • Damerau
  • Euclide
  • hamming
  • Jaccard
  • levenshtein
  • Manhattan
  • Minkowski
  • needleman_wunsch
0

ho trovato SumMetrics in Java, ma non l'ho usato.

+0

ho controllato la loro implementazione di Levenshtein, e oserei dire che quella fornito nel mio post utilizza meno memoria (anche se questo è meno di un problema con le stringhe brevi). –

0

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. Era basato su un'implementazione Python che ho realizzato per un esercizio universitario. Spero che questo ti aiuti!

1

Si potrebbe ottenere qualche risultato decente utilizzando un phonetic algorithm 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, quindi state attenti a non scrivere qualcosa che diventi troppo popolare;)

+0

Come può essere brevettata un'idea così semplice (ma brillante)? : P O era la tecnica esatta per onorare la mappatura della tastiera? –

+0

Perché gli algoritmi software possono essere brevettati in alcune giurisdizioni giuridicamente arretrate :) Sono solo un ingegnere quindi non mi sono mai preso la briga di cercare i dettagli lì, semplicemente fidandomi dei consulenti legali della compagnia. – Christoffer

+0

L'idea dell'algoritmo fonetico è molto bella. Esiste una libreria per implementare questa funzione? – PieroP

Problemi correlati