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()]