在 unordered_map 的键上实现 "did you mean"

Implement "did you mean" over the keys of an unordered_map

我的情况是:我有一个无序的名字到东西的映射。

客户可以输入名称——比如 fooo——将被搜索(使用 find()),未找到的键将打印 "not found"。

我想为客户提供更好的输出:"fooo not found. did you mean foo ?"

我认为除非实现一个镜像密钥集合的特里树,否则不可能应用 "find smallest levenstein distance" 算法。我是算错了还是算对了?

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

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

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

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

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

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