【问题标题】:Recommendation for mailing address matching scenario?推荐邮寄地址匹配方案?
【发布时间】:2019-11-22 17:58:50
【问题描述】:

My SQL 服务器包含 2 个表,其中包含一组类似的邮寄(物理)地址字段。注意这些表是在数据进入我的数据库之前填充的(无法更改)。表中的字段集相似但不相同 - 大多数都存在于两个表中,一些只在一个表中,一些在另一个表中。目标是“高度自信”地确定两个邮寄地址是否匹配。

示例字段:

  1. 街道编号
  2. 预定向
  3. 街道名称
  4. 街道后缀
  5. 后向(一个表而不是另一个)
  6. 单元名称(一个表)v 地址 2(另一个表)--增加复杂性
  7. 邮政编码(每张表的长度各不相同,5 到 5 位以上)
  8. 法律说明

理想情况下,我想要一种简单的方法来调用“函数”,该函数返回一个布尔值或匹配的置信水平 (0.0 - 1.0)。这个调用可以在我的解决方案中用 SQL 或 Python 进行;免费/开源深受客户青睐。

在 SOUNDEX、DIFFERENCE、Levenshtein distance(所有 SQL)和 usaddress 等选项中,没有一个是适合的解决方案。

【问题讨论】:

  • “高置信度”是问题所在……您必须先将两个表中的地址标准化,然后才能尝试匹配它们。您可以查看 Accuzip.com 之类的内容...但就像我说的那样,您首先需要对地址进行标准化,然后再尝试比较它们。
  • 我同意@BillRuhl 关于标准化两个地址然后比较它们的观点。这是一个option,但要花一些钱。
  • 地址标准化比人们想象的要棘手,并且需要持续监控。看看stackoverflow.com/questions/41249742/…
  • 您能否扩展“表中的字段相似但不相同”。 -- 您对这个问题的回答对于确定最佳行动方案很重要。
  • 感谢大家的回复! @JohnCappelletti 您使用 Google Maps API 进行标准化的方法对我们来说似乎很简单且具有成本效益。请说明需要“持续监控”。在更好地理解标准化之后,我将继续比较/相似性指标。再次感谢。

标签: sql-server python-3.x street-address


【解决方案1】:

理想情况下,我想要一种简单的方法来调用返回的“函数” 布尔值或匹配的置信度 (0.0 - 1.0)。

相似性指标就是您要寻找的指标。您可以使用距离度量来计算相似度。 Levenshtein DistanceDamerau-Levenshtein Distance 和汉明距离是距离度量的示例。

给定两者中最短的:M 两者中较短的,N 最长的,以及您的距离度量 (D)可以使用 (MD)/N 测量字符串 相似度。您还可以使用最长公共子序列或最长公共子串 (LCS) 通过划分 LCS/N 来衡量相似度。

如果您可以使用 CLR,我强烈推荐 mdq.similarity,您可以从 here. 获得它,它将使用这些算法提供相似度度量:

  1. Damarau-Levenshtein 距离(文档只写了“Levenshtein”,但他们弄错了)
  2. Jaccard 相似系数算法。
  3. Jaro-Winkler 距离算法的一种形式。 4 最长公共子序列算法(涉及转置时会增长一)

如果性能很重要(这些指标可能会很慢,具体取决于您提供的内容),那么我会熟悉我的Bernie function。它旨在帮助使用上述算法中的任何更快地测量相似度。 Bernie 是 100% 开源的,可以轻松地用任何语言(Python、C# 等)重新创建。同上我的 N-Grams 函数。

您可以使用NGrams8K 轻松创建自己的指标。

对于纯 T-SQL 版本的 Levenshtein 或最长公共子序列,您可以查看 Phil Factor 的博客。 (注意这些不能与我提到的 CLR 竞争)。

我先停下来。在我们更好地了解使字符串不同的原因之后,可以给出最好的建议(请在您的评论下注意我的问题)。

【讨论】:

  • 我在上面澄清了我的问题。有 2 个数据集(最终最多 9 个)。你给了我更多关于相似性指标的信息。不确定我会使用哪一个,但这显着加快了我的调查速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2011-03-11
相关资源
最近更新 更多