我正试图找出一种基于相似度得分找到重复地址的方法。考虑这些重复的地址:
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'
感激,
爱德华
答案 0 :(得分:2)
删除空格,逗号和短划线将不明确。用一个空格替换它们会更好。
以此地址为例
56 5th avenue
这个
5, 65th avenue
使用您的方法,它们都将是:
565THAV
你可以做的是编写一个好的地址缩短算法,然后使用字符串比较来检测重复。这应该足以在一般情况下检测重复。一般的相似度算法不起作用。因为一个数字差异可能意味着地址发生巨大变化。
算法可以这样:
TH
部分,如果它在数字后面。答案 1 :(得分:2)
这应该有助于构建缩写词典:
答案 2 :(得分:2)
首先,通过将所有空格折叠到每个单词之间的单个空格来简化地址字符串,并将所有内容强制为小写(或者如果您愿意,则为大写):
adr = " ".join(adr.tolower().split())
然后,我会删除“第42街”中的“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的想法。
祝你好运。答案 3 :(得分:1)
为了做到这一点,您需要根据USPS标准标准化您的地址(您的地址示例似乎是基于美国的)。有许多直销营销服务提供商提供邮政地址的CASS(编码准确性支持系统)认证。 CASS流程将标准化您的所有地址并将zip + 4附加到它们。如果这是您的意图,任何无法送达的地址都将被标记,这将进一步降低您的邮寄费用。一旦您的所有地址都标准化,消除重复将是微不足道的。
答案 4 :(得分:0)
我必须这样做一次。我将所有内容转换为小写,计算每个地址与其他地址的Levenshtein距离,并对结果进行排序。它工作得非常好,但非常耗时。
如果您拥有大型数据集,您将需要在C中使用Levenshtein的实现,而不是在Python中使用。我想,我的成绩是几万,并且花了一天的时间来运行。
答案 5 :(得分:0)
我经常检查我工作的地址是否有重复,我不得不说,我觉得Soundex非常不合适。它既太慢又太急于匹配。我与Levenshtein距离有类似的问题。
对我来说最有效的方法是清理和标记地址(摆脱标点符号,将内容分成单词),然后查看有多少令牌匹配。因为地址通常具有多个令牌,所以您可以在以下组合方面建立一定程度的置信度:(1)匹配了多少个令牌,(2)匹配了多少数字令牌,以及(3)有多少令牌可供使用。例如,如果较短地址中的所有令牌都在较长的地址中,则匹配的置信度非常高。同样,如果您匹配5个令牌,包括至少一个数字,即使每个地址都有8个,这仍然是一个高可信度的匹配。
做一些调整肯定是有用的,比如替换一些常见的缩写。 USPS列出了帮助,虽然我不会试图实现所有这些,并且一些最有价值的替换不在这些列表中。例如,'JFK'应该与'JOHN F KENNEDY'相匹配,并且有许多常用方法可以缩短'MARTIN LUTHER KING JR'。
也许不言而喻但是无论如何我都会说,为了完整性:不要忘记在整个地址上进行直接的字符串比较,然后再搞乱更复杂的事情!这应该是一个非常便宜的测试,因此可能是一个简单的第一次通过。
显然,您愿意和能够花费的时间越多(编程/测试和运行时间),您就能做得越好。模糊字符串匹配技术(比Levenshtein更快和更少的一般化)可以是有用的,作为从令牌方法的单独传递(我不会尝试模糊匹配彼此的单个令牌)。我发现模糊的字符串匹配并没有给我足够的响应地址(虽然我会在名字上使用它)。