通过 Javascript 中对象属性之一的字符串相似性来比较 2 个大型对象表

问题描述 投票:0回答:1

我想比较来自两个不同数据库的 2 个大对象表:

  • 包含 2700 个对象的数组
  • 1800 个对象的数组

每个对象都是具有 30 个属性的科学出版物。目的是识别重复的标题。但由于标题在两个数据库中的输入方式并不完全相同,我想使用此答案中实现的编辑距离对出版物标题进行比较:Compare Strings Javascript Return %of Likely

我测试了两种方法:

  • 使用映射:我将每个数组存储在 2 个不同的映射中,使用出版物标题作为键。然后我循环遍历第一个地图,然后循环遍历第二个地图,并对 2 个键执行 Levenshtein 测试。
  • 仅使用标题:我创建了 2 个出版物标题数组。然后我循环第一个数组,然后循环第二个数组,并对这两个元素执行 Levenshtein 测试。

这两个过程都非常耗时。您认为有更有效的方法吗?

非常感谢您的回答。

javascript arrays fuzzy-comparison
1个回答
0
投票

这个问题与所有编程语言固有的基本性能瓶颈有关。我假设您的目标是“简单地”通过任何必要的手段降低处理时间(因此不仅优化代码本身,还优化计算的完成方式)。

在这种情况下,根据我的经验,这些是大多数解决问题的方法:

  1. easy)优化计算密集型任务,在您的情况下,这将是距离计算。
  2. (meh) 尽量减少操作次数。
  3. )向其扔
    threads
    。基本上,使用“并行性”来加速该过程。您的情况可以相对容易地解决。
  4. 在这个答案中,我将为您提供解决方案,而不是实现。您可以 随后对它们进行更多研究,也许将它们混合实施。

话题

此解决方案通常是解决可能遇到的任何缓慢处理问题的首选解决方案,但它并不总是最好的解决方案,并且通常会增加大量开销。关于该主题的帖子和文章有很多,因此我不会在这里深入讨论细节,但就您而言,

worker threads

可能有助于加快处理速度(我认为您不需要

child process
es,但是为了以防万一,我会在这里列出他们的名字)。唯一的障碍是弄清楚如何拆分数组、处理它并将其合并回来。
优化

有点像科学出版物(讽刺的是),建立在最先进的技术之上通常是一个好主意。虽然我对所给出的实现无话可说,但我不确定它的性能。有一个名为

fastest-levenshtein

 的软件包提供了性能基准。根据它与您已有的功能相比的快(或慢)程度,您可能最好使用包的实现。
但就目前而言,没有太多需要优化的地方。

最小化

这有点理论上,但您可以考虑采用逐步过程进行比较,以最大程度地减少操作数量。这种做事方式可能不是最快的,尤其是对于较少的物品,但如果做得正确,它可以带来更快的时间。快速思考一下,您可以组织以下处理管道:

精确匹配:首先遍历数组并检查精确匹配(可能是小写且没有特殊字符),然后从数组中删除它们
  1. 在剥离的数组上,运行基本的字母匹配,然后将它们从数组中删除
  2. ...
  3. Continue stripping the array
  4. 计算距离
这种方法虽然绝对不是最好的也不是最快的,但仍然可以通过删除明显的情况来帮助将操作数量减少到最低限度。这不是我的第一个想法,但它是一个想法。我添加此选项主要是为了完整性。

© www.soinside.com 2019 - 2024. All rights reserved.