Вопрос

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

Есть какие-нибудь предложения?

Это было полезно?

Решение

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

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

Другие советы

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

Включенные показатели:

  • цветение
  • дамерау
  • евклид
  • хэмминг
  • жаккард
  • левенштейн
  • манхэттен
  • минковский
  • needleman_wunsch

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

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

Я взял на себя смелость перевести фрагмент кода 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, которую я сделал для университетского занятия.Надеюсь, это поможет!

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

Я нашел Итоговые данные на Java, но еще не использовал его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top