我需要测量名称以字符串形式提供的两个地方之间的物理距离。由于有时名称的写法略有不同,我正在寻找一个可以帮助我衡量差异的库,然后将其与纬度和经度的度量相结合,以选择正确的匹配。首选语言:Java或PHP。
有什么建议吗?
答案 0 :(得分:6)
查看Levenshtein distance。这是一种测量两个弦彼此不同的方式。
希望我能正确理解你的问题;在“纬度和经度”这个句子中使用“距离”可能会令人困惑!
答案 1 :(得分:4)
虽然用c语言编写(使用python和tcl绑定),libdistance将是一个在字符串/数据上应用多个距离度量的工具。
指标包括:
答案 2 :(得分:1)
您可以使用phonetic algorithm获得一些不错的结果,以找到略微错误的名称。
此外,如果您使用更加机械的编辑距离,您可能会看到使用考虑键盘几何形状的加权函数的更好结果(即物理上关闭的键比更远的键更“便宜”)。这是一个获得专利的方法,所以要小心不要写一些太受欢迎的东西;)
答案 3 :(得分:0)
我在Java中找到了SumMetrics,但没有使用它。
答案 4 :(得分:0)
我冒昧地翻译了我编写的一段C#代码来计算Levenshtein到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实现。希望这有帮助!
答案 5 :(得分:0)
我建议使用Levenshtein Distance或Jaccard Distance来比较文字。