代码之家  ›  专栏  ›  技术社区  ›  Minduca

如何检查两个非结构化街道地址字符串是否相同?

  •  4
  • Minduca  · 技术社区  · 8 年前

    我需要比较两个非结构化地址,并能够确定它们是否相同(或足够相似)。

    脚本

    • 地址由最终用户以纯文本形式提供。
    • 没有什么可以帮助用户以更容易识别的方式书写(没有自动完成,没有任何内容。只有一个空文本框)。
    • " #纽约州高谭市好看街102号 “应与匹配” 纽约高谭市尼斯洛金街102号 ".
    • 使用第三方服务不是一个选项。
    • 搜索不是问题。我已经有两条线了。我需要的是检查它们是否代表相同的地址,尽管在结构上存在差异。

    我发现了什么

    我知道我们可以用模糊逻辑进行这种比较,对拼写错误有一定的容忍度,但是。。。

    • 有些关键字(例如,将“Street”与“St.”比较,或将“#102”与“apt 102”比较,或者将“NY”与“New York”比较)不应该影响可靠性的程度。
    • 有些单词可以按不同的顺序排列(如上例中的设备)。

    我不想重新发明轮子。这个问题在不同的环境中似乎是一个常见的问题,我认为有一种算法(可能稍作修改)可能适合这个场景。

    提前谢谢

    1 回复  |  直到 8 年前
        1
  •  5
  •   fgregg    8 年前

    我已经帮助构建了一些开源工具来实现这一点。

    基本上,方法是尝试将其分解并定位到其组成部分,然后智能地比较这些部分。

    这两部分问题都很难解决。

    第一部分通常称为地址解析。我们使用的是: https://github.com/datamade/usaddress

    第二部分有很多名字,但我们称之为模糊匹配。这是我们为此制作的库: https://github.com/datamade/dedupe

    我们还提供了一些将它们一起使用的设施: http://dedupe.readthedocs.io/en/latest/Variable-definition.html#address-type