Мне нужно измерить физическое расстояние между двумя местами, имена которых указаны как строки. Поскольку иногда имена написаны несколько иначе, я искал библиотеку, которая могла бы помочь мне измерить разницу, а затем объединить ее с мерой широты и долготы, чтобы выбрать правильные совпадения. Предпочтительные языки: Java или PHP.
Какие-либо предложения?
Посмотрите на расстояние Левенштейна . Это способ измерения того, как разные две строки друг от друга.
Надеюсь, я правильно понял ваш вопрос; использование «расстояния» в том же предложении, что и «широта и долгота», может сбить с толку!
Хотя это было написано в c (с привязками python и tcl), libdistance будет инструментом для применения нескольких показателей расстояний для строк / данных.
Показатели:
Вы можете получить неплохие результаты, используя фонетический алгоритм, чтобы найти несколько ошибочных имен.
Кроме того, если вы используете более механическое расстояние редактирования, вы, вероятно, увидите лучшие результаты, используя взвешенную функцию, которая учитывает геометрию клавиатуры (т.е. физически закрытые клавиши «дешевле» заменить, чем отдаленные). Это запатентованный метод btw, поэтому будьте осторожны, чтобы не писать что-то, что становится слишком популярным;)
Я взял на себя смелость перевести кусочек кода 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, которую я сделал для обучения в университете. Надеюсь это поможет!
Я бы рекомендовал либо Levenshtein Distance, либо Jaccard Distance для сравнения текста.
Я нашел SumMetrics в Java, но не использовал его.