查找重复邮寄地址的策略

时间:2009-09-02 18:11:04

标签: python duplicates street-address similarity mailing

我正试图找出一种基于相似度得分找到重复地址的方法。考虑这些重复的地址:

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'

感激,

爱德华

6 个答案:

答案 0 :(得分:2)

删除空格,逗号和短划线将不明确。用一个空格替换它们会更好。

以此地址为例

56 5th avenue

这个

5, 65th avenue

使用您的方法,它们都将是:

565THAV

你可以做的是编写一个好的地址缩短算法,然后使用字符串比较来检测重复。这应该足以在一般情况下检测重复。一般的相似度算法不起作用。因为一个数字差异可能意味着地址发生巨大变化。

算法可以这样:

  1. 用空格替换所有逗号破折号。使用他translate方法。
  2. 使用单词及其缩写形式构建字典
  3. 删除TH部分,如果它在数字后面。

答案 1 :(得分:2)

这应该有助于构建缩写词典:

http://www.usps.com/ncsc/lookups/usps_abbreviations.html

答案 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更快和更少的一般化)可以是有用的,作为从令牌方法的单独传递(我不会尝试模糊匹配彼此的单个令牌)。我发现模糊的字符串匹配并没有给我足够的响应地址(虽然我会在名字上使用它)。