【问题标题】:Physical distance between two places两地之间的物理距离
【发布时间】:2009-05-25 20:43:17
【问题描述】:

我需要测量名称以字符串形式提供的两个地点之间的物理距离。由于有时名称的写法略有不同,我一直在寻找一个可以帮助我测量差异的库,然后将其与纬度和经度的测量相结合以选择正确的匹配项。首选语言:Java 或 PHP。

有什么建议吗?

【问题讨论】:

  • 嘿,我很困惑并编辑了标题以强调错误的焦点 - 正如公认的答案所暗示的那样,问题最终可能仍然是字符串距离问题。

标签: java php string distance


【解决方案1】:

看看Levenshtein distance。这是一种衡量两个字符串彼此之间差异程度的方法。

希望我正确理解了您的问题;在与“纬度和经度”相同的句子中使用“距离”可能会造成混淆!

【讨论】:

  • 我的错.. 使用“距离”令人困惑。就经纬度而言,我真正的意思是物理距离。就字符串而言,我的意思是两个字符串之间的“差异”。 Levenshtein 距离似乎很有趣,如果有一个用于距离测量的“即用型”库就完美了……
  • PHP 内置了 Levenshtein 距离函数:php.net/manual/en/function.levenshtein.php
【解决方案2】:

尽管是用 c 语言编写的(使用 python 和 tcl 绑定),libdistance 将是一个在字符串/数据上应用多个距离度量的工具。

包括的指标:

  • 绽放
  • damerau
  • 欧几里得
  • 汉明
  • 杰卡
  • levenshtein
  • 曼哈顿
  • 明可夫斯基
  • needleman_wunsch

【讨论】:

    【解决方案3】:

    我冒昧地将我为计算 Levenshtein 距离而编写的一段 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 实现。希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      使用phonetic algorithm 查找拼写错误的名称可能会得到一些不错的结果。

      此外,如果您使用更机械的编辑距离,您可能会看到使用考虑键盘几何形状的加权函数获得更好的结果(即物理上靠近的键比远离的键“更便宜”替换)。顺便说一句,这是一种专利方法,所以要小心不要写太流行的东西;)

      【讨论】:

      • 如此简单(但绝妙)的想法如何获得专利? :P 或者它是尊重键盘映射的确切技术?
      • 因为软件算法可以在一些法律落后的司法管辖区获得专利 :) 我只是一名工程师,所以我从不费心去那里查找细节,只是相信公司的法律顾问。
      • 语音算法的思路很不错。有没有实现这个功能的库?
      • 您发现的 SimMetrics 库似乎在 sourceforge.net/project/showfiles.php?group_id=123463 上有一些 .NET 的语音学
      【解决方案5】:

      我建议使用Levenshtein DistanceJaccard Distance 来比较文本。

      【讨论】:

        【解决方案6】:

        我在 Java 中找到了SumMetrics,但没有使用过。

        【讨论】:

        • 我检查了他们的 Levenshtein 实现,我敢说我在帖子中提供的那个使用更少的内存(尽管对于短字符串来说这不是问题)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多