String 字符串度量/相似性/度量:标识相同的地理位置(街道地址)

String 字符串度量/相似性/度量:标识相同的地理位置(街道地址),string,algorithm,reverse-geocoding,String,Algorithm,Reverse Geocoding,当一个人从某个web服务搜索中检索地址时,就会出现一个问题:对于同一个实际位置,您会得到多个结果。例如,文档中的示例: 美国纽约州布鲁克林贝德福德大道277号,邮编:11211 美国纽约州布鲁克林大圣贝德福德大道11211号 美国纽约州布鲁克林大圣贝德福德大道11249号 美国纽约州布鲁克林大大街贝德福德大道11211号 美国纽约州布鲁克林11211 美国纽约布鲁克林威廉斯堡 假设我只需要选择1和最详细的一个,那么简单的解决方案是返回最大字符数的一个 但就在它之前,我想验证所有选项实际上都在描述

当一个人从某个web服务搜索中检索地址时,就会出现一个问题:对于同一个实际位置,您会得到多个结果。例如,文档中的示例:

美国纽约州布鲁克林贝德福德大道277号,邮编:11211

美国纽约州布鲁克林大圣贝德福德大道11211号

美国纽约州布鲁克林大圣贝德福德大道11249号

美国纽约州布鲁克林大大街贝德福德大道11211号

美国纽约州布鲁克林11211

美国纽约布鲁克林威廉斯堡

假设我只需要选择1和最详细的一个,那么简单的解决方案是返回最大字符数的一个

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

  • 单词的顺序不一样

  • 并非所有必要的单词都应该出现,例如描述符“St”等


  • 谢谢,

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

    美国纽约州布鲁克林贝德福德大道277号,邮编:11211

    你可以看到:

    • 用逗号分隔的项目代表不同的实体,尽管未分隔的项目也可能是不同的概念
    • 较早的项目代表较小的区域,较晚的项目代表较大的区域。你在街道、街道、城市、州、国家都有一个特定的位置。最后一个项目并不总是国家,但你可以检查它的国家名单,只有当它失败,考虑其他选择。类似地,州代码列表允许您识别纽约州
    • 靠近末尾的一长串数字可能是邮政编码
    • 开头的一个短(ish)数字(总是注意像'th'和'st'这样的后缀)可能是一个街道号码
    等等。然后你有一个语义表示。可以肯定地说,大多数地址都是这样写的。要求您提供地址的表单通常具有相同的字段

    (事实上,在谷歌的例子中,你甚至不必自己去弄清楚,他们会告诉你组件是什么。他们还会告诉你最具体的东西是什么。)

    对于下一个例子,类似的情况也适用,但更复杂:

    美国纽约州布鲁克林大圣贝德福德大道11211号

    “Av”和“St”需要转化为“Avenue”和“Street”。斜杠的意思不清楚。我们可以把它当作逗号,把“大圣”和“贝德福德”视为两种不同的信息。但从它们的位置以及“街道”和“大道”这两个词来看,我们知道它们代表的是同一种事物。让我们假设这个地方有两条街道,让它的确切含义保持开放。也许是一个角落,也许同一条街有两个名字

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

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

    第五个地址同样只是较小区域的较少信息,因此它包含以前的地址。请注意,如果只比较第三个和第五个地址,则它们不匹配。这表明,当您匹配前两个地址时,您应该“合并”它们,并注意这两个邮政编码可能被认为是等效的。后来甚至可以说“布鲁克林,纽约11211,美国”和“布鲁克林,纽约11249,美国”匹配

    最后一个地址与其他地址都不匹配。但是,这仅考虑纯字符串形式。谷歌确实在第一个地址中提到了威廉斯堡