【问题标题】:Identifying (non exact) duplicates from a MySQL database从 MySQL 数据库中识别(非精确)重复项
【发布时间】:2012-07-24 10:59:58
【问题描述】:

是否有任何工具可以识别和合并 MySQL 表中的非精确重复项?

我有一个包含许多重复项的大型数据集,例如:

1348,  Auto Motors, 12 Long Road, etc
48264, Auto Mtors,  12 Log Road,  etc
82743, Ato Motoers, 12 Lng Road,  etc
83821, Auto Motors, 13 Long Road, etc
92743, Auto Motors, 11 Long Road, etc

有很多表需要合并,比如:

  • 公司
  • 地址
  • 电话号码
  • 员工

每行大约有 100,000 行和 30-40 列要匹配(连接表)。

那么,有人知道解决这个问题的工具吗?我已经安装了 MySQL、PHP。如果他们有帮助的话,我之前有/可以使用(d)MongoDB 和 Solr。如果需要,我愿意安装其他软件。


如果我找不到处理此问题的工具,我应该运行哪种查询。

简单的find all duplicates 不起作用,因为它们不准确。

对于我需要尝试的所有不同组合,进行类似通配符的搜索会非常慢。

使用 OliverLevenshtein (MySQL) 可能会起作用,而且有太多数据需要拉入 PHP(也可能非常慢)。

【问题讨论】:

  • 您是要清理数据,还是只查找一次数字?如果您有时间清理,您可以使用 MySQL full text search 来匹配相关性(尽管这需要一些时间)并允许您清理现有数据 - 然后您将能够运行一些快速比较.
  • @Fluffeh 只是识别数据是关键步骤,如果我能识别它,我可以建立一个合并过程。如果有一个工具可以为我合并它,太好了!全文搜索并不是真正那么好,尤其是在搜索地点和公司名称时会遇到麻烦,因为它们并不总是真实的单词。
  • 你看过MySQL操作符SOUNDEX()吗?
  • 您需要确定什么是拼写错误 - Ato MotorsLog Road 可能都是允许的?

标签: php mysql search full-text-search search-engine


【解决方案1】:

对于我需要尝试的所有不同组合,进行类似通配符的搜索会非常慢。

使用 Oliver 或 Levenshtein (MySQL) 可能会奏效,但有太多数据需要导入 PHP(也可能非常慢)。

你说这好像是事实,但这正是我的建议。例如。将一行加载到 php.ini 中。然后遍历所有其他行,匹配您认为合适的各种算法(Levenshtein 或您自己的停用词列表等)。这需要一段时间才能完成,但这大概是您可以一次性完成的任务,或者至少是定期任务(例如,每天一次)

【讨论】:

    【解决方案2】:

    您有需要按摩的数据。我不认为这是你可以完全在 sql 中完成的事情。

    Google Refine 是一个伟大的按摩工具。我会先在 Refine 中加载数据,对其进行清理,然后导入到您的关系数据库中。

    【讨论】:

    • 在“按摩”数据时,我会小心使用任何第 3 方 API,除非他们的 TOS 明确声明他们“不”,否则 Google 可能会存储正在按摩的数据以供他们自己访问。跨度>
    • Google Refine 是离线工具,而不是网络服务。数据不会发送给 Google。
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多