【问题标题】:Implement "did you mean" over the keys of an unordered_map在 unordered_map 的键上实现“你的意思是”
【发布时间】:2019-11-15 07:46:11
【问题描述】:

我的情况是:我有一个无序的名称映射。

客户端可以输入名称——比如 fooo——将被搜索(使用find())并且未找到的键将打印“未找到”。

我想为客户提供更好的输出:“foo not found. 你的意思是 foo 吗?”

我认为除非实现一个镜像密钥集合的 trie,应用“查找最小列文斯坦距离”算法,否则这是不可能的。我算错了还是算对了?

【问题讨论】:

  • 这方面的算法有很多,一般都不是微不足道的。除非这是针对一个更大的项目或者它是要求的一部分,否则可能不值得花额外的时间来实现这样的东西。好吧,如果是为了一个私人项目,你只是为了好玩或学习,那也可以,但你仍然应该考虑是否值得付出努力。
  • @Someprogrammerdude 是的,在我的情况下,这只是如果它是一行那么酷。例如就像std::lower_bound(begin(m), end(m), boost::string_distance); 你看到了这个想法。

标签: c++ unordered-map trie levenshtein-distance


【解决方案1】:

几乎可以肯定在这里不值得花哨。实现遍历所有可能键,计算距离,然后取最小值的蛮力解决方案。分析它,您可能会发现它已经足够快了。

但如果你想玩得开心...

字符串编辑距离遵循三角不等式,这意味着任何可以采用任意距离函数的几何近似近邻数据结构都适用于此。我喜欢 LSH。

但是随着维度的增加,ANN 会变得更糟,并且维度大致是字符串长度。因此,您可能需要一种不太严格的方法。 BLAST(基因组搜索)进行基于子串的精确查找。您的字符串较短,因此您可能需要二元组或三元组。或者,您可能会认为 length 将接近正确,然后只需检查那里的所有匹配项即可。

如果您可以访问大型拼写错误数据库,您可以尝试训练卷积神经网络(对每个字符进行一次热编码)以将字符串映射到具有成本函数的低维特征向量,从而使拼写错误接近预期字符串。然后将合法字符串的特征向量保存在 KD 树中。

但这一切都是为了好玩。如果代码很重要,请保持简单。

【讨论】:

  • LSH 听起来很棒。有一天我会将它应用于 knn 搜索光子映射器。
猜你喜欢
  • 2010-09-07
  • 2012-11-02
  • 2011-05-27
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多