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

Posted

技术标签:

【中文标题】如何检查两个非结构化街道地址字符串是不是相同?【英文标题】:How two check if two unstructured street adresses strings are the same?如何检查两个非结构化街道地址字符串是否相同? 【发布时间】:2016-09-24 17:32:10 【问题描述】:

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

场景

地址由最终用户以纯文本形式提供。 没有什么可以帮助用户以更易于识别的方式书写(没有自动完成功能,什么都没有。只是一个空文本框)。 “#102 Nice-Looking Street, Gotham City, NY”应与“Nice Loking St., Gotham City, New York, apt 102”匹配。 不能使用第三方服务。 搜索不是问题。我已经有了这两个字符串。我需要检查它们是否代表相同的地址,尽管其结构不同。

我发现了什么

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

有些关键字(例如,将“Street”与“St.”进行比较,或将“#102”与“apt 102”进行比较,或将“NY”与“New York”进行比较)不应受到惩罚可靠程度。 有些词可以按不同的顺序排列(如上例中的公寓)。

我不想重新发明***。这个问题似乎是不同情况下的常见问题,我认为有一种算法(可能稍作修改)可能适合这种情况。

提前致谢

【问题讨论】:

好吧,您可以将两个地址都传递给 Google 或其他映射 API,取回它认为每个地址所在位置的坐标,然后进行一些数学运算以找出它们之间的距离,但是这是使用第 3 方 API。除此之外,它们是地址的事实几乎无关紧要 - 这只是一个模糊的字符串匹配问题,通过使用您提到的常见替换稍微简化,您可以将其存储在某种数据库中(Street/St,Washington/ DC/DC、纽约/纽约等) 【参考方案1】:

我帮助构建了一些开源工具来执行此操作。

基本上,该方法是尝试将其拆分并寻址到其组成部分,然后智能地比较这些部分。

问题的两个部分都很困难。

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

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

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

【讨论】:

以上是关于如何检查两个非结构化街道地址字符串是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章

利用反射处理多个表结构相同的数据的查询和数据库表的关联

如何查看oracle 两个表结构是不是相同

你如何检查两个字符串在字符串中的任何点是不是处于相同的顺序? [关闭]

匹配地址的正则表达式:匹配具有不同结构的地址的问题

如何从 XSLT 中的地址字段中拆分街道和门牌号?

检查两个“选择”是不是相等