我已经在网上浏览了这个但是真的没找到。基本上我需要比较一堆地址,看看它们是否匹配。地址可以用不同的方式编写。例如:1345 135th st NE,1345 NE 135TH ST等。另外,它们也可以使用不同的语言。在我尝试自己编写一些解析匹配算法之前,有没有人知道任何库或方法我可以轻松地做到这一点?我的朋友虽然使用谷歌或bing地图web服务并传递地址并返回地理坐标并使用坐标而不是字符串匹配进行比较。但是,我必须为我所拥有的所有这些地址拨打数千次网络服务,而不是非常优雅;)任何帮助都会很好:)
答案 0 :(得分:4)
美国地址可以(通常)由称为交付点(DPBC)的12位数字唯一表示。此编号由完整的9位邮政编码和3位数的交付点编号组成。这是用于在邮件上形成条形码以加速交付的内容。使用CASS认证的服务可以为您提供12位数的交付点甚至标记重复项。
为了完全披露,我为SmartyStreets工作,这是以前的合格地址,Mowgli在另一个答案中提到过。
我们提供可以查询的API以及批处理服务(如上所述,它将标记重复项)。
请记住,即使是12位数的DPBC也不能始终唯一地标识特定地址。当特定街区或9位邮政编码有很长一段具有相似主要数字的住宅时,这种情况经常发生。在这些情况下,最好使用CASS服务来标准化和验证地址,然后对它们进行哈希处理以便于比较。 (但如上所述,一些CASS服务已经标记了重复项。)
更新:SmartyStreets现在提供international address verification。
答案 1 :(得分:3)
我不认为这是一种REGEX类型的问题。您正在考虑首先转换为类似的格式。
有多种网络服务/产品可以为您标准化地址。 Bing for" USPS地址标准化API"你会发现很多信息。一旦地址标准化,比较应该是直截了当的。
http://www.bing.com/search?q=usps+address+standardization+api&go=&form=QBRE&qs=n&sk=&sc=1-32
或者,您可以对地址进行GeoCode以获取一组坐标,然后对其进行比较。
答案 2 :(得分:3)
我找到了两个选项。
首先,也许,您可以让用户从有限数量的选项中进行选择,而不是采取任何输入,类似于facebook处理地址的方式。如果您在键入时使用自动完成API,则可能的地址将由api缩小。这是谷歌的一个:
http://code.google.com/p/geo-autocomplete/
其次,寻址&排位赛(但他们没有自由):
https://www.craftyclicks.co.uk/
https://smartystreets.com/(以前的合格地址)
https://www.alliescomputing.com/(之前提供的世界地址)
答案 3 :(得分:2)
有一个用于记录重复数据删除/实体解析的开源python库,可用于地址匹配:Dedupe。
它是免费的,可以在笔记本电脑上运行,而不是大型服务器。
答案 4 :(得分:2)
我不会认为这是一个正则表达式问题。
一个可能有用的免费工具是usaddress,一个用于解析地址的python库。它在各种地址格式上表现相当不错,b / c它使用概率方法而不是正则表达式方法(尽管它是针对美国地址而制作的,并且可能不适用于其他语言的地址) http://usaddress.readthedocs.org/en/latest/
解析地址不会100%解决您的问题,但如果将地址拆分为各自的组件,那么比较两个地址(尤其是具有不同格式的地址)会更容易(这样您就可以比较街道#街道#,城市对城市等)
然后,为了比较记录,你可以使用重复数据删除 - 另一个免费的python库。 http://dedupe.readthedocs.org/en/latest/
答案 5 :(得分:1)
这要求情报正确;电脑不聪明。
一个简单的算法可以告诉你哪些地址有共同之处,例如,“1345 135th st NE”和“1345 NE 135TH ST”的数字是“1345”。
然后您可以减少比较自己。它还会减少你的地理位置数量。
答案 6 :(得分:0)
这绝对不是REGEX问题。这是2018年,我们还有更先进的方法。 R和python都提供了针对此类问题的解决方案
在R中:https://cran.r-project.org/web/packages/RecordLinkage/index.html
在python中:https://recordlinkage.readthedocs.io/en/latest/about.html
答案 7 :(得分:0)
1.使用地址串相似度
因为地址可以用多种不同的方式书写,所以应用模糊逻辑并计算地址字符串的相似度是很有用的。我曾经用一个 fuzzywuzzy
Python 库来解决这个任务。它有一个函数可以计算 Levenshtein 距离作为字符串之间的差异。
from fuzzywuzzy import fuzz
addr1 = "USA AZ 850020 Phoenix Green Garden street, 283"
addr2 = "850020, USA AZ Phoenix Green Garden, 283, 3a"
addr3 = "Canada VC 9830 Vancouver Dark Ocean street, 283"
addr_similarity12 = fuzz.token_set_ratio(addr1, addr2)
addr_similarity13 = fuzz.token_set_ratio(addr1, addr3)
print(f"Address similarity 1 <-> 2: {addr_similarity12}")
print(f"Address similarity 1 <-> 3: {addr_similarity13}")
输出将是:
Address similarity 1 <-> 2: 96
Address similarity 1 <-> 3: 55
真的,前两个地址几乎相同,后两个地址不同。重要的任务是选择合适的阈值来表明地址相等。
2.使用 Google Map Geocoding API
地理编码是将地址(如“1600 Amphitheatre Parkway, Mountain View, CA”)转换为地理坐标(如纬度 37.423021 和经度 -122.083739)的过程。然后就可以计算出两个地址之间的数字“距离”。