当它们之间不存在公共密钥时,是否可以比较两个表?

时间:2009-09-18 04:20:34

标签: mysql fuzzy-comparison

我有两个表,我想比较重复项。这些表只是基本的公司信息字段,如名称,城市,州等。我可以看到的唯一可能的常见字段是名称列,但名称不太准确。有没有办法可以使用LIKE语句在两者之间进行比较?我也愿意接受任何人可能提出的任何其他建议。

感谢。

4 个答案:

答案 0 :(得分:3)

我会尝试使用Double Metaphone算法进行匹配,这是一种更复杂的SOUNDEX类型算法。

这是MySQL implementation

答案 1 :(得分:2)

有些公司通过销售采用这种模糊匹配的数据清洁产品来谋生。因此,使用简单(甚至极其复杂)的LIKE语句来解决这个问题似乎不太可能。

你需要的是可以比较两个字符串并返回相似度得分的东西,100%的得分意味着相同。像Jaro-Winkler algorithm这样的东西。替代算法包括Metaphone(或双重Metaphone)和Soundex()Soundex()是最原始的解决方案。

另一种解决方案是使用专家文本索引。关于这种方法的一个很酷的事情是我们可以指定一个同义词库来指定同义词来解决不相关的差异(INC = INCORPORATED,CO = COMPANY等)。

Oracle和SQL Server包含这样的工具,但我不熟悉MySQL。

答案 2 :(得分:1)

SOUNDEX()会在一定程度上帮助您。但它远非完美。

即使string1和string2拼写不同,

soundex(string1)也应该等于soundex(string2)。但正如我所说,这远非完美。

据我所知,目前还没有完美的算法。

答案 3 :(得分:0)

嗯,没有100%保证正确的方式,没有。但是你可以通过将所有“凌乱”的列转换为更强大的规范形式来取得一些进展,例如:通过大写一切,修剪前导和尾随空格并确保连续出现最多1个空格。还有一些事情,例如将“SMITH,JOHN”形式的名称更改为“JOHN SMITH”(反之亦然 - 只需选择一个表格并继续使用)。当然,您应该制作副本的记录,不要更改原件。您可以尝试丢弃更多信息(例如“JOHN SMITH” - >“J SMITH”) - 您会发现这会将误报的平衡改为假阴性。

我可能会采用为每对记录分配相似性分数的方法。例如。如果规范化的名称,地址和电子邮件地址完全一致,则分配1000分;否则,从1000减去({3}}的(多个)并使用它。您需要通过四处游戏并确定不同类型差异的相对重要性来提出自己的评分方案(例如,电话号码中的不同数字可能比两个人姓名中的1个字符差异更重要)。然后,您将通过实验确定一个分数,在该分数之上您可以放心地将“重复”状态分配给一对记录,并且低于该分数需要手动检查;在 得分之下,我们可以自信地说2条记录不是重复。

这里的现实目标是减少您需要执行的手动重复删除工作量。您不太可能完全消除它,除非所有重复项都是通过一些自动复制过程生成的。