如何进行邮政地址模糊匹配?

数据挖掘 文本挖掘 数据清理
2021-10-14 01:11:38

我想知道在格式不同或其中一个拼写错误时如何匹配邮政地址。

到目前为止,我已经找到了不同的解决方案,但我认为它们已经很老了而且效率不高。我确信存在一些更好的方法,所以如果您有参考资料供我阅读,我相信这是一个可能会引起几个人兴趣的主题。

我找到的解决方案(示例在 R 中):

  • Levenshtein 距离,它等于您必须插入、删除或更改以将一个单词转换为另一个单词的字符数。

    agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE) ## [1] "accusait" "abusait"

  • 音位比较

    library(RecordLinkage) soundex(x<-c('accusait','acusait','abusait')) ## [1] "A223" "A223" "A123"

  • 使用拼写校正器(最终是像彼得诺维格那样的贝叶斯校正器),但我猜在地址上不是很有效。

  • 我考虑过使用谷歌建议的建议,但同样,它在个人邮政地址上效率不高。

  • 您可以想象使用机器学习监督方法,但您需要存储用户拼写错误的请求才能这样做,这对我来说不是一个选择。

4个回答

当您使用 R 时,您可能需要查看可以在计算中使用的 stringdist 包和 Jaro-Winkler 距离度量。这是美国人口普查局为链接而开发的。

有关 Jaro 和 Jaro-Winkler 距离的更多信息,请参阅此期刊

有关不同匹配技术的比较,请阅读本文

有很多巧妙的方法可以扩展 Levenshtein 距离以提供更全面的画面。SeatGeek的团队在这里简要介绍了一个非常有用的模块(用于 python),名为“ Fuzzy Wuzzy ” 。

您可以做的几件事是部分字符串相似性(如果您有不同长度的字符串,例如 m & n 与 m < n),那么您只匹配 m 个字符。您还可以将字符串分成标记(单个单词)并查看标记集如何匹配或按字母顺序排列它们并排序。

另一种检测部分字符串匹配的流行技术(尽管通常在文档级别)是shingling本质上,它是一种移动窗口方法,它为目标单词/文档提取一组 n-gram,并通过Jaccard 系数将它们与其他单词/文档的 n-gram 集进行比较。Manning 及其同事(2008 年)在信息检索的背景下讨论了近似重复和 shingling

我在 Python 中编写了一个通用的概率模糊匹配器,它可以合理地匹配任何类型的数据:

https://github.com/robinl/fuzzymatcher

它在内存中,所以你可能不想用它来匹配超过 100k 行的数据集。

我还编写了一个针对英国地址的类似项目,但这假设您可以访问 Addressbase Premium。这个不在内存中,因此已用于 100m 左右的英国地址。看这里:

https://github.com/RobinL/AddressMatcher

如果您想快速完成这项工作,我建议您使用libpostal来规范您的地址,然后将它们输入我的通用模糊匹配器 ( pip install fuzzymatcher)。

您可以在此处找到使用示例