我有两张表我想比较重复。这些表只是基本的公司信息字段,如名称、城市、州等。我能看到的唯一可能的常见字段是名称列,但名称并不完全准确。有没有办法可以使用 LIKE 语句在两者之间进行比较?我也愿意接受任何人可能提出的任何其他建议。
谢谢。
我有两张表我想比较重复。这些表只是基本的公司信息字段,如名称、城市、州等。我能看到的唯一可能的常见字段是名称列,但名称并不完全准确。有没有办法可以使用 LIKE 语句在两者之间进行比较?我也愿意接受任何人可能提出的任何其他建议。
谢谢。
我会尝试使用Double Metaphone算法进行匹配,这是一种更复杂的 SOUNDEX 类型算法。
这是一个MySQL 实现。
有些公司通过销售进行这种模糊匹配的数据清理产品来谋生。因此,您似乎不可能用一个简单(甚至是极其复杂)的LIKE
语句来解决这个问题。
您需要的是可以比较两个字符串并返回相似度分数的东西,100% 的分数表示相同。类似于Jaro-Winkler 算法。替代算法包括Metaphone(或双 Metaphone)和Soundex()
. Soundex()
是最粗略的解决方案。
另一种解决方案是使用专业文本索引。这种方法很酷的一点是,我们可以指定一个词库来指定消除不相关差异的同义词(INC = INCORPORATED,CO = COMPANY 等)。
Oracle 和 SQL Server 包含这样的工具,但我对 MySQL 不熟悉。
SOUNDEX()会在一定程度上帮助你。但它远非完美。
soundex(string1) 应该等于 soundex(string2) 即使 string1 和 string2 拼写不同。但正如我所说,它远非完美。
据我所知,没有现有的算法可以完美地做到这一点。
好吧,没有 100% 保证正确的方法,不。但是您可以通过将所有“杂乱”的列转换为更规范的形式来取得一些进展,例如通过大写所有内容、修剪前导和尾随空格并确保最多 1 个空格出现在一行中。还有诸如将“SMITH,JOHN”形式的名称更改为“JOHN SMITH”(反之亦然——只需选择一个表格并使用它)。当然,您应该复制记录,不要更改原件。您可以尝试丢弃更多信息(例如“JOHN SMITH”->“J SMITH”)——您会发现这会改变误报到误报的平衡。
我可能会采用为每对记录分配相似度分数的方法。例如,如果规范化的姓名、地址和电子邮件地址完全一致,则分配 1000 分;否则,从 1000 中减去(一些倍数)Levenshtein 距离并使用它。您需要通过玩弄并确定不同类型差异的相对重要性来提出自己的评分方案(例如,电话号码中的不同数字可能比两个人姓名中的1个字符差异更重要)。然后,您将能够通过实验建立一个分数,高于该分数您可以自信地将“重复”状态分配给一对记录,而低于该分数则需要手动检查;在此之下得分,我们可以自信地说这 2 条记录不重复。
这里的现实目标是减少您需要做的手动重复删除工作量。 您不太可能完全消除它,除非所有重复项都是通过某种自动复制过程生成的。