导入数据库时​​比较数据的最佳方法是什么?

时间:2011-07-28 08:19:32

标签: php mysql algorithm levenshtein-distance

我有一个MySQL数据库表,其中包含大约1000家商店的信息。现在我将通过上传Excel电子表格来导入更多商店,我正在努力避免重复。

  • 商店可能名称相同,但地址不一样。
  • 商店可能拥有相同的地址,但名称从不相同

但这是我的问题。

  • 商店可能拼写错误
  • 地址可能拼写错误

目前我正在将数据导入临时表。现在我想知道将进口商店与现有商店进行比较的最佳方法是什么。

我的计划是浏览每一行并比较商店。

  • 首先比较a.name = b.name和a.street = b.street。在比赛中,商店被删除。
  • 然后我将在名字和街道上进行Levenshtein比较。在这里,我可能需要手动查看结果以确定它是否重复。

有没有人对这种数据比较有所了解?

更新
谢谢你的好答案。

将用于比较的字段是:

  • 名称
  • 街道地址
  • 邮政编码
  • 城市
  • 国家

我正在思考这些问题:

选择名称= Lavenshtein和country = country的行 这样我只需要处理一个小清单。

然后我可以更彻底地比较姓名和地址。

2 个答案:

答案 0 :(得分:4)

Levenshtein-distance是这样做的方法,你可以避免手动输入。但实际实施将取决于某些关于数据的先验知识。就像拼写中你期望的错误一样。

假设例如它的数据质量很好,而你只想要拼写错误,你可以基于生成匹配条件,1)单词数是否相同? 2)这些单词的顺序3)名字中每个单词的Levenshtein距离允许误差的小阈值。

当名称含糊不清时,可以通过检查具有相似条件的地址来加强条件,反之亦然。

答案 1 :(得分:3)

为了扩展我对Shaunak答案的评论,我采取的方法是:

按优先顺序对每个名称进行一系列“哈希”。例如,对于英国的一些金融公司,我使用了以下内容:

  • “哈希”1:确切的公司名称,例如“圣约翰和詹姆斯金融投资有限公司”。
  • Hash 2:公司名称,所有非字母数字字符被删除,空格标准化:“St John James Financial Investments Ltd”
  • 哈希3:普通缩写扩展,例如“1st”至“First”,“Ltd”至“Limited”:“Saint John James Financial Investments Limited”。我也在这里做了常见的拼写错误,例如“独立”到“独立”。您常见的拼写错误显然取决于您的源数据。
  • 哈希4:“停止”字样,例如“The”,“Limited”,删除:“Saint John James Financial Investments”。

我将所有这些推入一个表,然后构建一个查询来比较表中的每个公司名称与所有其他公司名称,基于它们匹配哈希1,哈希2,哈希3,哈希4.这给了我一个信心因素 - 匹配哈希的数量越多,公司实际上相同的可能性就越大。 (注意,根据我采用的方法,如果哈希1匹配,哈希2,3和4保证匹配,依此类推。)

(检查空哈希,并忽略 - “有限公司”可以减少为空哈希,但你不希望它与其他空哈希匹配。)

我和Levenshtein一起使用这种方法将我可能的重复数据过滤成可能性顺序 - 你如何找到适合Levenshtein的可能方法取决于你的数据;例如,您可能希望将Levenshein应用于第三个哈希而不是实际名称 - 并向我的商务人员提供可能重复的列表以做出最终决定,并自动匹配最高信度匹配,我确信名字真的代表了同一家公司。

查看我的代码,我还使用了一个散列,即在删除停用词等后对每个单词进行Soundex转换,尽管我的评论指出Metaphone本来会更好(我正在使用SQL Server,所以Soundex内置于...)