1

我有 7 个 MySQL 表,其中包含大约 17000 行中的部分重叠和冗余数据。所有表格都包含学校的名称和地址。有时同一所学校在一个名称略有不同的表中重复,有时同一学校出现在多个表中,同样,其名称或地址略有不同。

我的任务是创建一个带有 id、name 和 town/city id 字段的表,其中包含 7 个表中的数据。对于带有 id 和 name 字段的城镇,将有一个单独的表格。

这很复杂,因为原始表没有单独的城市字段,它必须从具有完全不同格式数据的地址字段中提取。

我意识到这大部分都必须手动完成,我已经硬化了我的灵魂,我已经准备好应对这将带给我的人间地狱。我的问题是:

  • 你将如何开始这样的任务?什么是尽可能多地自动化它的智能策略?
  • 有没有可用的工具可以使这更快?像可以比较字符串,确定它们的“相似性”并建议可能的重复的东西?

谢谢!

4

1 回答 1

2

我曾经做过一次这样的事情,尽管使用的是 Oracle 而不是 MySQL。17000 条记录是可管理的记录数量,但足以使其值得构建工具。

维基百科几乎有世界各地的学校名单,但遗憾的是匈牙利没有。遗憾的是,最好拥有系统中应该拥有的数据列表,而不是尝试从破碎的数据库中重建它。如果您可以获取这样的列表,这将很有用,这样您就可以将您的记录与它进行比较,而不是相互比较。即使您可以获取仍然有用的邮政编码和城市名称列表。

当涉及到模糊匹配字符串时,有许多可用的统计技巧。一个常见的是 Levenshtein 距离。这给出了一个分数,表示两个字符串之间的相似性,表示为从字符串A到字符串B所需的更改次数(AKA 编辑距离)。Code Janitor 有一个 MySQL 实现,但这只是谷歌的热门产品,我不提供任何保证。 在这里找到它。Jaro Winkler 是另一种匹配算法,但在 Internet 上流行的实现似乎较少。

一般处理提示

  • 将所有学校名称和地址提取到一个表中,元数据指示每行的出处(数据库、表、主键)。
  • 添加列以保存学校名称和地址的搜索字符串。例如,有一列去掉标点和数字(在某些匹配算法中,THMAS 比 TH0MAS 更接近 THOMAS)。
  • 在另一列中允许常见的拼写错误(在英国地址中,字符串 SW!^ 可能代表 SW16,即 Streatham 的邮政编码)。
  • 在这些搜索列上构建全文索引,以帮助挑选出现的常用词,如城市名称。
  • 如果您有大量数据和一些耐心,那么构建一个词库来识别常见的缩略词(如 Rd、St、Blvd)可能是一个有用的练习,但对于 17000 行来说可能不值得。
  • 使用正则表达式匹配模式,例如邮政编码。
于 2010-09-15T13:12:16.857 回答