【问题标题】:similarity between 2 symbols oracle2个符号oracle之间的相似性
【发布时间】:2019-12-16 12:50:09
【问题描述】:

包含超过 300 万行姓名(姓名、姓氏、父亲姓名)的表格。我希望检查相似性超过 90%。 我使用了许多模糊算法以及 utl_match 相似性(jaro_winkler、edit_distance)。 这些算法的性能不佳。 (超过 20 秒。) 我想检查变化的地方,但它的工作时间很长。像: 姓名 姓 父名, 姓名父亲姓氏, 姓 名 父名, ………… 我找不到任何性能良好的算法,它适用于事务系统

【问题讨论】:

  • 这听起来像是您可能首先想在 Oracle 之外脱机的事情。查看哪些工具/算法运行良好,然后如果您确实需要针对生产数据库执行此操作,请稍后再回来担心。
  • 感谢您的建议,现在这不是问题,但我正在努力改进
  • 您使用的是哪个版本的 Oracle?如果它是 11gR2 或更高版本,您应该查看 Oracle Text 的名称搜索扩展。这将表现良好,但不幸的是需要计划同步,因此它可能不适合事务应用程序。 Find out more.
  • 在过度抱怨它运行缓慢之前,请考虑一下您要求 Oracle 完成的任务。如果没有某种预处理(参见@Thomas 的建议),您要求它针对 3M 行执行 3M 行; 9 万亿 (9,000,000,000,000) 次比较。在 3 次时,您抱怨这仍然是每秒 250 万次比较。这是非常快的 - 只是巨大的音量。你需要减少音量!
  • @belayer 一个名字检查 300 万,而不是 3 百万 x 3 百万。

标签: oracle plsql similarity fuzzy sentence-similarity


【解决方案1】:

您不需要每次都检查所有 300 万个名称,因为您的数据库中有重复项。您还可以做的是将您的条目以最远的距离预先聚集在这些条目中,然后使用不同的入口点。

所以在第一步中创建你的入口点:

Miller
Smith
Yang
...

然后用 > 与这个入口点进行检查,例如 70%,然后深入到你匹配得很好的集群。这应该会修剪大部分搜索并使您的算法更快。

【讨论】:

  • 感谢您的评论,但没有重复的名称。我用 sundex 和 jaro winkler 好多了
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
相关资源
最近更新 更多