查找重复邮寄地址的策略
-
21-09-2019 - |
题
我正在尝试想出一种根据相似度分数查找重复地址的方法。考虑这些重复的地址:
addr_1 = '# 3 FAIRMONT LINK SOUTH'
addr_2 = '3 FAIRMONT LINK S'
addr_3 = '5703 - 48TH AVE'
adrr_4 = '5703- 48 AVENUE'
我计划应用一些字符串转换来缩写长单词,例如 NORTH -> N,删除所有空格、逗号、破折号和井号。现在,有了这个输出,我如何将 addr_3 与其余地址进行比较并检测相似?多少百分比的相似度是安全的?你能为此提供一个简单的Python代码吗?
addr_1 = '3FAIRMONTLINKS'
addr_2 = '3FAIRMONTLINKS'
addr_3 = '570348THAV'
adrr_4 = '570348AV'
感恩,
爱德华多
解决方案
首先,通过将所有空格折叠为每个单词之间的单个空格来简化地址字符串,并强制所有内容都小写(如果您愿意,也可以大写):
adr = " ".join(adr.tolower().split())
然后,我会删除“41街”中的“st”或“42街”中的“nd”之类的内容:
adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)
请注意,第二个 sub() 将使用“2”和“nd”之间的空格,但我没有设置第一个来执行此操作;因为我不确定你如何区分“41 St Ave”和“41 St”(第二个是“41 Street”的缩写)。
请务必阅读 re 模块的所有帮助;它很强大但很神秘。
然后,我会将您剩下的内容拆分为单词列表,并应用 Soundex 算法来列出看起来不像数字的项目:
http://en.wikipedia.org/wiki/Soundex
http://wwwhomes.uni-bielefeld.de/gibbon/Forms/Python/SEARCH/soundex.html
adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]
然后,您可以使用该列表或按照您认为最好的方式将其连接回字符串。
Soundex 的整个想法是处理拼写错误的地址。这可能不是您想要的,在这种情况下,请忽略此 Soundex 想法。
祝你好运。
其他提示
删除空格、逗号和破折号将会产生歧义。最好将它们替换为单个空格。
以这个地址为例
56 5th avenue
和这个
5, 65th avenue
按照你的方法,它们都将是:
565THAV
您可以做的是编写一个好的地址缩短算法,然后使用字符串比较来检测重复项。这应该足以在一般情况下检测重复项。一般的相似度算法不起作用。因为一个数字的差异可能意味着地址的巨大变化。
该算法可以这样进行:
- 将所有逗号破折号替换为空格。用他 翻译 方法。
- 用单词及其缩写形式构建字典
- 去除
TH
部分(如果它跟随在数字后面)。
这应该是有帮助建立您的缩写词典:
为了做到这一点吧,你需要根据USPS的标准来规范你的地址(地址的例子似乎是美国的)。有许多直接的营销服务提供商,提供 CASS (编码准确性支持系统)的邮政地址的认证。中国社会科学院过程将规范所有的地址,并追加ZIP + 4到他们。任何无法投递的地址将被标记,这将进一步降低您的邮政邮寄费用,如果这是你的意图。当所有的地址都标准化,消除重复将是微不足道的。
我不得不这样做一次。我转换一切小写,计算每个地址的Levenshtein距离到所有其他地址,并责令结果。它的工作非常好,但它是非常耗时的。
您会想,如果你有一个大的数据集使用莱文斯坦的实现用C而不是在Python。煤矿是一个几万并花了一天的大部分时间运行,我想。
我定期检查地址重复,我的工作,我不得不说,我觉得非常探测法不适合。它既是太慢了,太急于匹配的东西。我有类似的问题与Levenshtein距离。
什么工作最适合我的是消毒和记号化的地址(摆脱标点符号,东西拆分成单词),然后只看到令牌多少匹配。因为地址通常有几个令牌,可以开发在组合方面的置信度水平(1)许多令牌是如何匹配,(2)有多少数字令牌相匹配,和(3)将有多少令牌是可用的。例如,如果在较短的地址的所有令牌是在较长的地址,比赛的信心是相当高的。同样地,如果你匹配5个令牌包括至少一个这是数字,即使每个地址具有图8中,仍然是一个高可信度的匹配。
这绝对是有益的做一些调整,比如代一些常见的缩写。美国邮政总局列出了帮助,但我不会去卖力的努力来实现所有的人,以及一些最宝贵的换人都没有对这些列表。例如,“JFK”应该是关于“肯尼迪”匹配,并且有一些共同的方式来缩短“马丁路德”。
也许不用说,但我会说也无妨,为了完整性:不要忘记了去做对整个地址直串比较更复杂的东西搞乱之前!这应该是一个非常便宜的测试,并且因此可能是一个没有脑子第一遍。
显然,更多的时候你愿意和能够花(无论在编程/测试和运行时),好,你就可以做到。模糊字符串匹配技术(更快和更广义种比的Levenshtein)可以是有用的,因为从令牌的方法的单独通(I不会试图模糊匹配个人令牌彼此)。我发现,模糊字符串匹配不给我足够的一声我的降压上的地址(虽然我会用它的名字)。