我正在尝试想出一种根据相似度分数查找重复地址的方法。考虑这些重复的地址:

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

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

该算法可以这样进行:

  1. 将所有逗号破折号替换为空格。用他 翻译 方法。
  2. 用单词及其缩写形式构建字典
  3. 去除 TH 部分(如果它跟随在数字后面)。

这应该是有帮助建立您的缩写词典:

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

为了做到这一点吧,你需要根据USPS的标准来规范你的地址(地址的例子似乎是美国的)。有许多直接的营销服务提供商,提供 CASS (编码准确性支持系统)的邮政地址的认证。中国社会科学院过程将规范所有的地址,并追加ZIP + 4到他们。任何无法投递的地址将被标记,这将进一步降低您的邮政邮寄费用,如果这是你的意图。当所有的地址都标准化,消除重复将是微不足道的。

我不得不这样做一次。我转换一切小写,计算每个地址的Levenshtein距离到所有其他地址,并责令结果。它的工作非常好,但它是非常耗时的。

您会想,如果你有一个大的数据集使用莱文斯坦的实现用C而不是在Python。煤矿是一个几万并花了一天的大部分时间运行,我想。

我定期检查地址重复,我的工作,我不得不说,我觉得非常探测法不适合。它既是太慢了,太急于匹配的东西。我有类似的问题与Levenshtein距离。

什么工作最适合我的是消毒和记号化的地址(摆脱标点符号,东西拆分成单词),然后只看到令牌多少匹配。因为地址通常有几个令牌,可以开发在组合方面的置信度水平(1)许多令牌是如何匹配,(2)有多少数字令牌相匹配,和(3)将有多少令牌是可用的。例如,如果在较短的地址的所有令牌是在较长的地址,比赛的信心是相当高的。同样地,如果你匹配5个令牌包括至少一个这是数字,即使每个地址具有图8中,仍然是一个高可信度的匹配。

这绝对是有益的做一些调整,比如代一些常见的缩写。美国邮政总局列出了帮助,但我不会去卖力的努力来实现所有的人,以及一些最宝贵的换人都没有对这些列表。例如,“JFK”应该是关于“肯尼迪”匹配,并且有一些共同的方式来缩短“马丁路德”。

也许不用说,但我会说也无妨,为了完整性:不要忘记了去做对整个地址直串比较更复杂的东西搞乱之前!这应该是一个非常便宜的测试,并且因此可能是一个没有脑子第一遍。

显然,更多的时候你愿意和能够花(无论在编程/测试和运行时),好,你就可以做到。模糊字符串匹配技术(更快和更广义种比的Levenshtein)可以是有用的,因为从令牌的方法的单独通(I不会试图模糊匹配个人令牌彼此)。我发现,模糊字符串匹配不给我足够的一声我的降压上的地址(虽然我会用它的名字)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top