我正在尝试将商家地名和地址与另一个可能重复的商家地名和地址进行比较。问题是,名称和地址通常由人手动输入,因此显然存在各种差异。
以下是一些例子:
ST。 vs. St vs. Street
步骤。 14 vs. Ste 14 vs. Suite 14 vs.#14
NE 39th Ave.与第39大道与第39大道对NE 39th Avenue
还有更多可能......
我想在我的程序中编写一个正则表达式(使用python)来比较将捕获这些细微差别的名称和地址。我经常看到地址看起来完全一样,但对于少数没有的地址,我不希望正则表达式完全拒绝它并说它们不一样。
有时可以选择地名。 (真实)例子:
“El Dorado”与“Eldorado Mexican Restaurant”
“东亚特兰大咖啡店”与“乔的东亚特兰大咖啡店”
“Village Restaurant”与“Baba's Village”< ----当我检查时,这些都有完全相同的地址和电话号码,所以从技术上来说它们是重复的
如果您对如何执行此操作或代码创意有任何建议,我将不胜感激,因为我现在只知道如何做简单的正则表达式。我以前从未遇到过这么大的问题......
感谢。
答案 0 :(得分:2)
正如评论中的每个人都提到的,这个问题并不适合单个正则表达式。我最近在同一地区完成了一大堆工作,我首先要说的是你永远不会100%完美。这是让它“尽可能好”的问题。
关注地址比较组件,我找到的最佳策略如下:
将地址标记为单个单词(因此忽略奇怪的标点符号等)并重新加入字符串。
从最后搜索国家或州(来自预定义列表) - 删除并存储(如果找到)。我们从最后搜索,因为地址的结尾似乎比开始更可预测!
从最后,使用(\d{4})
搜索邮政编码或邮政编码,其中4是数字位数 - 如果找到则删除并存储。将4替换为目标国家/地区的数字或数字。
从最后搜索郊区 - 删除并存储(如果找到)。我们有一个预定义的hashmap / dictionary或郊区,它们帮了很大忙。最好存储每个匹配以便稍后帮助选择最佳匹配(例如,检查邮政/邮政编码匹配)。如果你有这些数据,也许你也可以从邮政编码中查找一个郊区。
最后是找一个街道地址!非常困难,因为格式太多了:
我用它来提取单位/商店/套房/网站/工厂/批次组件:
(unit|unt|un|u|shop|shp|suite|ste|se|site|factory|fy|lot|lt)s?(\s|\.)?(\w?\d+\w?)
我生成了一个序数数字正则表达式来提取级别/楼层:
((\w??\d+\w??|g|grnd|ground|lower|first|second|third|fourth|fifth|sixth|seventh|eighth|nineth|tenth|eleventh|twelth|1st|2st|3rd|4th|5th|6th|7th)(?:\s*|\.*|\s*)*(level|lvl|l|floor|flr|fl|f)
一旦删除了其他组件,您通常会留下类似街道地址的东西。我用它来提取它:
\d+(\s*-\s?\d*|\s*)?\D+(highway|freeway|alley|arcade|avenue|boulevard|bypass|chase|circle|circlet|circuit|circus|close|court|cove|crescent|drive|esplanade|fairway|garden|gardens|grove|lane|mall|mews|parade|parkway|place|plaza|promenade|quay|ridge|ridgeway|road|row|square|street|terrace|walk|way|Al|ar|ave|blvd|by|cc|ch|ci|cs|cct|cres|cr|cst|dip|dr|ed|ent|es|fry|fo|fmn|fwy|hwy|int|la|lp|mi|mr|pde|pwy|ps|pt|pro|qs|ra|rge|rd|rty|rw|sp|st|tce|tk|trl|tn|vs|wk|wy|cl|ct|cy|ce|cro|dl|el|gp|gns|gl|gm|gr|hts|lkt|me|pl|pa|rt|ri|sh|sq|tp|tr|vl|vw|dv|bvd)\b
就像说的那样,这不是一个简单的过程。通过上述算法,我们得到了相当不错的结果。一旦以这种方式解析了两个地址,就可以比较组件以确定它们是否相同。
另外值得注意的是,不同国家/地区使用不同的地址格式。由于我们正在查看澳大利亚地址,您可能需要稍微修改一下。我想,原则是一样的。
希望这有帮助。