【问题标题】:What is the best way to fuzzy compare two tables模糊比较两个表的最佳方法是什么
【发布时间】:2015-08-21 23:53:12
【问题描述】:

我有两个大约 70 000 行的表。两个表都有一列“标题”。我需要与表格进行比较并通过标题列找到它们的交集。我尝试使用 JOIN 和 UNION,但标题可能略有不同。我的意思是,在一张桌子上可以是 New-York, USA,但在另一张桌子上可以是 New York Usa。我用谷歌搜索了它,它称之为“模糊字符串搜索”。

我已经开始使用 php 和similar_text,但它非常慢......我认为对于这个任务我应该使用其他东西,比如 R 也许......我已经将这些数据推送到BigQuery,但是 BigQuery 只支持 REGEXEP 在 where 语句中进行搜索,或者我不明白应该如何使用它。

R 能快速解决我的问题吗?

谢谢!

dataset1 的示例:

new-york, usa|100|5000

dataset2:

newyork usa|50|1000
nnNew-York |10|500

所需输出示例:

New-York, Usa|160|6500

换句话说,我需要创建一个包含两个表中的数据的新表。

更新

感谢您的回答,我尝试了 R 和 agrep,它可以工作,但是非常缓慢.. 40 分钟内有 2 000 行,我总共有 190 000 行。正常吗?

【问题讨论】:

  • 您必须提供示例数据集和所需的输出。否则很难帮你。
  • 是的 R 可以解决这个问题。有关模糊搜索,请参阅 agrep 和 adist。自己尝试,速度是另一段历史。
  • 模糊匹配是个棘手的问题。看起来您可能从一张桌子到另一张桌子有多个匹配项。这增加了误报的风险。那是因为您将无法告诉引擎在找到匹配项后停止搜索。例如'New York USA 与 new-York、nnNew York 和 Newark 相匹配'
  • BigQuery 将能够在这里提供帮助 - 只要您能够在 SQL 中编写自己的 Javascript 函数。很快!

标签: php mysql r google-bigquery


【解决方案1】:

评论太长了。

您的问题的答案是“Levenshtein 距离”。但是,对于 70,000 行,这需要大约 70,000*70,000 次比较 - 4.9 亿次。太多了。

在 R 中完成工作可能是您最好的方法,因为 R 会将所有数据保存在内存中,并且可能比在 MySQL 中的实现更有效。

有一些方法可以缩短搜索。例如,一种方法是将每个字符串分成 n-gram(三元组是典型的)并使用它们来减少搜索空间。毕竟,“New York City”和“Dallas”没有共同的字母,所以不需要比较。

R 中可能有处理三元组的例程。它们在 MySQL 中很容易实现,但不是内置的。

【讨论】:

  • 谢谢,看来我应该学R了,我面对很多信息,R擅长分析数据。
  • @d7p4x 。 . .在为这个问题跳入 R 之前,我会先下载一个用于 MySQL 的 Levenshtein 距离函数,并在一个小的数据样本上尝试它。它可能适用于您的数据集和硬件。然后,查看前导子字符串,例如在使用 Levenshtein 过滤器之前匹配到标题的前三个字符。您可能可以在下载 R 并将其配置为读取数据所需的时间内完成所有这些工作。
  • 我尝试使用 R,并首先尝试为第一个表创建具有 levenshtein 比率的向量。我收到“内存不足”错误..但我的表总共大约 10M,笔记本电脑有 8Gb 内存
  • @d7p4x 。 . .用于减少字符串比较函数所需数据量的 n-gram 方法可能会有很大帮助。但是边距太窄,我无法详细解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2022-01-01
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多