6

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

  • 商店可能有相同的名称,但永远不会有相同的地址。
  • 商店可能有相同的地址,但绝不会使用相同的名称

但这是我的问题。

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

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

我的计划是遍历每一行并比较商店。

  • 首先比较 a.name = b.name AND a.street = b.street。匹配时,商店被删除。
  • 然后我将对名称和街道进行 Levenshtein 比较。在这里,我可能必须手动查看结果以确定它是否重复。

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

更新
感谢您的好答案。

将用于比较的字段是:

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

我在想一些事情:

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

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

4

2 回答 2

4

Levenshtein-distance 是这样做的方式,您可以避免手动输入。但实际的实现将取决于有关数据的某种先验知识。就像您期望拼写有多少错误一样。

例如,假设它是一个高质量的数据,并且您只期望拼写错误,您可以根据以下条件生成匹配条件:1)单词数是否相同?2) 这些单词的序列 3) 名称中每个单词的 Levenshtein-distance 允许误差的小阈值。

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

于 2011-07-28T08:27:22.097 回答
3

为了扩展我对 Shaunak 回答的评论,我这样做时采取的方法是:

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

  • “哈希” 1:确切的公司名称,例如“St. John & James' Financial Investments Ltd.”。
  • 哈希 2:公司名称,去除所有非字母数字字符并标准化空格:“St John James Financial Investments Ltd”
  • Hash 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 是内置的...... )

于 2011-07-28T09:07:20.433 回答