题
我需要测量的物理之间的距离两个地方他们的名字被提供作为串。因为有时候的名字都写方式略有不同,我是在寻找一个图书馆,可以帮助我测量的差异,然后结合的措施的纬度和经度,以选择正确的匹配。优选的语言:Java或PHP.
任何建议?
解决方案
有一个在所述 Levenshtein距离。这是测量两个串如何不同彼此的方式。
希望我正确理解您的问题;在同一个句子为“纬度和经度”使用“距离”可以是混乱!
其他提示
虽然是用 c 编写的(带有 python 和 tcl 绑定), 自由距离 将是一个在字符串/数据上应用多个距离度量的工具。
指标包括:
- 盛开
- 达默劳
- 欧几里得
- 汉明
- 杰卡德
- 编辑
- 曼哈顿
- 明科夫斯基
- 针曼文施
您可以使用语音算法以找到稍misspelld名字得到一些像样的成绩。
此外,如果你使用了更多的机械编辑距离,你可能会看到使用占键盘几何加权功能更好的结果(即物理上接近键是“便宜”远比更换掉的)。这是一个专利方法顺便说一句,所以要小心,不要写的东西变得太受欢迎;)
我冒昧一块我写计算Levenshtein距离成Java代码C#代码转换。这里仅仅使用两个交替的,而不是一个大的交错数组一维数组:
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距离 用于比较的文本。
我发现 SumMetrics 在Java中,但还没有用它。
不隶属于 StackOverflow