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


What is the best way to compare data when importing to database?

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

  • 商店可以有相同的名称,但永远不会有相同的地址。
  • 商店可以有相同的地址,但永远不会有相同的名称

但这是我的问题。

  • Stores可能拼错
  • 地址可能拼错

目前我正在导入数据到一个临时表。现在我想知道比较进口商店和现有商店的最好方法是什么。

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

  • 首先比较a.name = b.name和a.street = b.street。匹配时,商店被删除。
  • 然后我会在名字和街道上做一个Levenshtein比较。在这里,我可能需要手动查看结果,以确定它是否是重复的。

有人有这种数据比较的经验吗?


谢谢你的回答。

用于比较的字段有:

    <
  • 名称/gh>
  • 街道地址
  • 邮编
  • 城市
  • 国家

我在想这样的事情:

选择name = Lavenshtein且country = country的行。
这样的话,我只需要处理一个小列表。

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

levenshstein -distance就是这样做的,您可以避免手动输入。但实际的实现将取决于对数据的某种先验知识。比如你期望拼写中有多少错误。

假设这是一个高质量的数据,你只期望拼写错误,你可以生成一个匹配条件基于,1)是否有相同的单词数?2)这些单词的序列3)名称中每个单词的levenshstein -distance允许误差的小阈值

可以通过在名称中存在歧义时检查具有类似条件的地址来加强条件,反之亦然。

详细说明我对Shaunak的回答的看法,我当时采取的方法是:

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

  • "哈希"1:确切的公司名称,例如:"圣·约翰;James' s Financial Investments Ltd."
  • 哈希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是内置的…)