Физическое расстояние между двумя местами - PullRequest
9 голосов
/ 26 мая 2009

Мне нужно измерить физическое расстояние между двумя местами, имена которых представлены в виде строк. Поскольку иногда имена пишутся немного по-разному, я искал библиотеку, которая могла бы помочь мне измерить разницу, а затем объединить ее с мерой широты и долготы, чтобы выбрать правильные соответствия. Предпочитаемые языки: Java или PHP.

Есть предложения?

Ответы [ 6 ]

6 голосов
/ 26 мая 2009

Посмотрите на расстояние Левенштейна . Это способ измерения того, насколько две строки отличаются друг от друга.

Надеюсь, я правильно понял ваш вопрос; использование «расстояния» в том же предложении, что и «широта и долгота» может привести к путанице!

4 голосов
/ 26 мая 2009

Хотя написано в c (с привязками python и tcl), libdistance будет инструментом для применения нескольких метрик расстояний к строкам / данным.

Метрики включены:

  • цветение
  • damerau
  • Евклида
  • Хэмминг
  • Jaccard
  • Левенштейн
  • манхэттена
  • Минковский
  • needleman_wunsch
1 голос
/ 26 мая 2009

Вы можете получить приличные результаты, используя фонетический алгоритм для поиска имен с ошибками.

Кроме того, если вы используете более механическое расстояние редактирования, вы, вероятно, увидите лучшие результаты, используя взвешенную функцию, которая учитывает геометрию клавиатуры (т. Е. Физически закрытые клавиши «дешевле» заменить, чем удаленные). Это запатентованный метод, поэтому будьте осторожны, чтобы не написать что-то, что становится слишком популярным;)

0 голосов
/ 26 мая 2009

Я бы порекомендовал либо Расстояние Левенштейна , либо Расстояние Джакарта для сравнения текста.

0 голосов
/ 26 мая 2009

Я взял на себя смелость перевести кусок кода C #, который я написал, чтобы вычислить расстояние Левенштейна, в код Java. Он использует только два одномерных массива, которые чередуются вместо большого зубчатого массива:

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

Это не строго проверено, но, похоже, работает нормально. Это было основано на реализации Python, которую я сделал для университетского упражнения. Надеюсь, это поможет!

0 голосов
/ 26 мая 2009

Я нашел SumMetrics в Java, но не использовал его.

...