【问题标题】:Perl : Tracking duplicatesPerl:跟踪重复项
【发布时间】:2015-03-24 04:24:44
【问题描述】:

我正在尝试找出在 5 列 csv 数据中查找重复项的最佳方法。真实数据中有超过百万行。

以下是上述6列的内容。

Name, address, city, post-code, phone number, machine number

数据没有固定长度,在某些情况下,某些列中的数据可能会丢失。

我正在考虑使用 perl 首先规范化名称、城市和地址中使用的所有短格式。来自 stackoverflow 的 perl 爱好者对我帮助很大。
但是仍然会有很多难以匹配的数据。 所以我想知道是否可以根据“LIKELINESS / SIMILARITY”(例如,类似于 gugl 的 google)来匹配内容,以克服收集数据时出现的错误。

我手头有 2 个任务。数据。

  1. 使用特定标识符标记重复行
  2. 提及相似行之间的百分比匹配。

如果我能就所有可能的方法可以采用哪些方法以及由于它们的某些优点而可能是最好的方法获得建议,我将不胜感激。

【问题讨论】:

  • 重复是什么意思?因为你提到了类似的行。
  • 我想说的是,数据是关于某个实体的。在收集信息时,有人可能使用了之前使用的确切数据,这将使其重复。在另一种情况下,信息收集器可能使用了简短的表格,或者可能在这里和那里遗漏了信息,这会使数据相似而不是重复。
  • 对计算机程序的定义非常模糊。

标签: perl duplicates match


【解决方案1】:

您可以编写一个 Perl 程序来执行此操作,但将其放入 SQL 数据库并使用它会更容易和更快。

大多数 SQL 数据库都有导入 CSV 的方法。 For this answer, I suggest PostgreSQL 因为它有非常强大的字符串函数,你需要找到你的模糊重复。如果您的 CSV 数据还没有唯一 ID,请使用自动递增的 ID 列创建表。

导入完成后,在要检查重复的列上添加索引。

CREATE INDEX name ON whatever (name);

您可以通过self-join 以您喜欢的任何方式查找重复项。这是一个查找重复名称的示例。

SELECT id
FROM   whatever t1
JOIN   whatever t2 ON t1.id < t2.id
WHERE  t1.name = t2.name

PostgreSQL 有powerful string functions including regexes 进行比较。

索引将很难处理像lower(t1.name) 这样的事情。根据您要使用的重复类型,您可以为这些转换添加索引(这是 PostgreSQL 的一个特性)。例如,如果您想不区分大小写搜索,您可以在小写名称上添加索引。 (感谢@asjo 指出)

CREATE INDEX ON whatever ((lower(name)));

// This will be muuuuuch faster
SELECT id
FROM   whatever t1
JOIN   whatever t2 ON t1.id < t2.id
WHERE  lower(t1.name) = lower(t2.name)

可以通过多种方式实现“相似”匹配,一种简单的方法是使用fuzzystrmatch 函数,如metaphone()。与以前相同的技巧,添加具有转换后行的列并对其进行索引。

在添加索引和查找重复项之前,最好先对数据本身进行数据规范化等其他简单的操作。例如,修剪和挤压多余的空白。

UPDATE whatever SET name = trim(both from name);
UPDATE whatever SET name = regexp_replace(name, '[[:space:]]+', ' ');

最后,您可以使用Postgres Trigram module 为您的表添加模糊索引(再次感谢@asjo)。

【讨论】:

  • @Hynek-Pichi-Vychodil 500,000 行的索引版本在 2 秒内返回。一旦你离开索引,麻烦就开始了。有更好的算法吗?让我们听听您的回答。
  • 对于模糊匹配,trigram contrib 模块 pg_trgm 可能有用:postgresql.org/docs/9.4/static/pgtrgm.html
  • 请注意,您可以在 Postgres 中为函数创建索引,因此您不必创建包含 LOWER(name) 的列,只需创建 LOWER(name) 的索引。
  • @Hynek-Pichi-Vychodil 作为一名拥有多年经验的数据库专家,您肯定知道索引是常用的吗?
  • @Hynek-Pichi-Vychodil 你没有建设性。当问题不清楚时,为问题的子集或明确定义的问题变体提供可行的答案是很有价值的。
猜你喜欢
  • 2020-01-21
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多