Python 查找重复邮件地址的策略

Python 查找重复邮件地址的策略,python,duplicates,street-address,similarity,mailing,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与其他地址进行比较并检测相似的地址?什么百分比的相似

我正试图提出一种基于相似性评分的方法来寻找重复地址。考虑这些重复地址:

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'
谢天谢地


Eduardo删除空格、逗号和破折号将是不明确的。最好将它们替换为单个空间

以这个地址为例

56 5th avenue
还有这个

5, 65th avenue
使用您的方法,这两种方法都将:

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

算法可以如下所示:

  • 用空格替换所有逗号破折号。用这种方法
  • 用单词及其缩写形式建立一本词典
  • 如果
    TH
    部件后面有数字,则将其拆下

  • 这将有助于建立缩略语词典:


    首先,通过将所有空格折叠到每个单词之间的单个空格,并强制所有内容使用小写(或大写,如果您愿意):

    然后,我会去掉“41街”中的“st”或“42街”中的“nd”:

    注意,第二个子函数()将使用“2”和“nd”之间的空格,但我没有设置第一个子函数;因为我不知道你怎么区分“41街”和“41街”(第二个是“41街”的缩写)

    请务必阅读re模块的所有帮助;它强大但神秘

    然后,我会将您留下的内容拆分成一个单词列表,并应用Soundex算法列出看起来不像数字的项目:

    然后,您可以根据自己的想法处理列表或将其连接回字符串

    Soundex的整个想法就是处理拼写错误的地址。这可能不是你想要的,在这种情况下,忽略这个Soundex想法


    祝你好运。

    我不得不这样做一次。我将所有内容转换为小写,计算每个地址到其他地址的Levenshtein距离,并对结果进行排序。它工作得很好,但相当耗时


    如果您有一个大的数据集,您将希望使用C语言而不是Python语言实现Levenshtein。我的地址只有几万个,我想用了一天的时间运行。

    我经常检查我工作的地址是否重复,我不得不说,我觉得Soundex非常不合适。它的速度太慢,也太渴望匹配事物。我对Levenshtein距离也有类似的问题

    对我来说,最有效的方法是对地址进行清理和标记(去掉标点符号,将内容拆分为单词),然后看看有多少标记匹配。因为地址通常有几个令牌,所以您可以根据(1)匹配了多少令牌,(2)匹配了多少数字令牌,以及(3)有多少可用令牌的组合来确定置信度。例如,如果较短地址中的所有令牌都位于较长地址中,则匹配的可信度相当高。同样,如果匹配5个令牌,其中至少包括一个数字,即使每个地址都有8个,这仍然是一个高置信度匹配

    做一些调整是非常有用的,比如替换一些常用的缩写。USPS列表很有帮助,尽管我不会努力去实现所有这些,而且一些最有价值的替换并不在这些列表中。例如,“JFK”应该是“约翰·肯尼迪”的对应词,缩短“小马丁·路德·金”有很多常用方法

    也许不用说,但为了完整起见,我还是要说:在处理更复杂的事情之前,别忘了对整个地址做一个直接的字符串比较!这应该是一个非常便宜的测试,因此可能是一个不需要动脑筋的第一关


    显然,您愿意并且能够花费的时间越多(在编程/测试和运行时上),您就能够做得越好。模糊字符串匹配技术(比Levenshtein更快、更不通用)可能很有用,作为令牌方法的一个单独过程(我不会尝试将单个令牌相互模糊匹配)。我发现模糊字符串匹配并没有给我提供足够的地址信息(尽管我将在名称上使用它)。

    为了正确地做到这一点,您需要根据USPS标准对您的地址进行标准化(您的地址示例似乎基于美国)。有许多直接营销服务提供商提供(编码准确度支持系统)邮政地址认证。CASS过程将标准化您的所有地址,并向其添加zip+4。任何无法投递的地址都将被标记,这将进一步降低您的邮寄成本,如果这是您的意图的话。一旦您的所有地址都标准化,消除重复地址将变得微不足道

    谢谢,我会看看关于soundex的链接。我还将查看Levenshtein Python扩展和C库,以获得模糊匹配。Levenshtein Python扩展和C库。Soundex是一种非常英语特有的算法。如果你处理来自其他语言的街道名称,你可能会发现它会产生许多误报。。。它会产生许多英文名称的误报和误报。如果你有足够的勇气依赖语音相似性,可以使用更现代的方法,比如(Double)
    adr = " ".join(adr.tolower().split())
    
    adr = re.sub("1st(\b|$)", r'1', adr)
    adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)
    
    adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]