String metric/similarity/measure: 标识相同的地理位置(街道地址)

String metric/similarity/measure: Identify same geographical locations (street addresses)

当从某些网络服务搜索中检索地址时,会出现同一个实际地点的多个结果的问题。例如 "Reverse Geocoding API" by Google,文档中的示例:

"277 Bedford Avenue, Brooklyn, NY 11211, USA"

"Grand St/Bedford Av, Brooklyn, NY 11211, USA"

"Grand St/Bedford Av, Brooklyn, NY 11249, USA"

"Bedford Av/Grand St, Brooklyn, NY 11211, USA"

"Brooklyn, NY 11211, USA"

"Williamsburg, Brooklyn, NY, USA"

假设我只需要选择 1 和最详细的一个,那么天真的解决方案是 return 字符数最多的那个。

但就在它之前,我想验证所有选项实际上都在描述同一个地方。合适的 CS 主题是 String metric。我如何将这些算法应用于此任务?为什么大多数指标不适用于这种情况的一些问题:

  1. 单词顺序不一样

  2. 并非所有必要的词都应出现,例如描述符“St.”。等等

谢谢,

我不会在这里简单地比较字符串。尝试分析地址并识别组件。例如,在

277 Bedford Avenue, Brooklyn, NY 11211, USA

你可以看到:

  • 以逗号分隔的项目代表不同的实体,尽管未分隔的项目也可能是不同的概念。
  • 前面的项目代表较小的区域,后面的项目代表较大的区域。您在街道、街道、城市、州、国家/地区拥有特定位置。最后一项并不总是国家,但您可以对照国家列表进行检查,只有在失败时才考虑其他选项。同样,州代码列表可让您识别纽约州。
  • 靠近末尾的一长串数字可能是邮政编码。
  • 开头的一个短(大概)号码(始终注意 'th' 和 'st' 等后缀)可能是街道号码。

等等。然后你有一个语义表示。可以肯定地说,大多数地址都是这样写的。要求您提供地址的表格通常具有相同的字段。

(实际上在 Google 的情况下,你甚至不必自己弄清楚,他们会告诉你组件是什么。他们还会告诉你最具体的东西是什么。)

对于下一个,类似的事情适用,但更复杂:

Grand St/Bedford Av, Brooklyn, NY 11211, USA

'Av'和'St'需要转化为'Avenue'和'Street'。斜杠的含义不明确。我们可以把它当作一个逗号,将 "Grand St" 和 "Bedford Av" 视为两条不同的信息。但是从它们的位置和"Street"和"Avenue"这两个词,我们知道两者代表的是同一种东西。所以我们就说这个地方有两条街道,并保留开放的确切含义。也许是一个街角,也许同一条街有两个名字。

现在当您比较前两个实体时,您知道它们具有相同的国家/地区、邮政编码、州和城市,所以这是一个好的开始,但不是很具体。第一个的街道在第二个中提到了,所以很好。第二个提到额外街道的事实并不是真正的问题。问题是街道 (A, B)(B, C) 的两个地方。街道号码不存在,但这只是意味着第二个位置不那么具体,所以就像第一个包含在第二个中一样。

你可以放心地断定第二个、第三个和第四个地址都是一样的。只有邮政编码不同而且有时会发生这种情况(邮政编码很奇怪),其他地方有太多相同的地方无法匹配。邮政编码在数字上也很接近。如果国家或州不同,则它们不应该匹配,但可以创建警报,以便通知人员并查看是否有问题。还要确保你有一个合适的字典来规范同一个地方的不同名称,例如纽约 == 纽约。对于第四个地址,我们知道如何识别它有两条街道,我们可以忽略顺序(将街道视为一个集合)。

第五个地址同样是较小区域的较少信息,因此它包含以前的地址。请注意,如果您只比较第三个和第五个地址,它们将不匹配。这表明当您匹配前两个地址时,您应该 'merge' 它们并注意这两个邮政编码可能被认为是等同的。那么以后甚至可以说 "Brooklyn, NY 11211, USA" 和 "Brooklyn, NY 11249, USA" 匹配。

最后一个地址与其他任何地址都不匹配。但是,这仅考虑纯字符串形式。 Google 实际上提到威廉斯堡作为第一个地址。