我正在寻找一个模糊搜索 JavaScript 库来过滤一个数组。我试过使用 Fuzzyset.js和 保险丝 JS,但结果很糟糕(有演示,你可以尝试在链接页面)。
在阅读了一些关于莱文斯坦距离的文章之后,我发现它并不能很好地反映用户在打字时所寻找的内容。对于那些不知道的人,系统计算需要多少 插入、 删除和 替代品才能使两个字符串匹配。
Levenshtein-Demerau 模式的一个明显缺陷是,哇和 咪咪被认为与 灯泡同样相似(每种模式都需要两种替代)。然而,很明显,灯泡比 咪咪更类似于 哇,我刚才提到的模型通过考虑到 换位而认识到了这一点。
我想在文本完成的上下文中使用它,所以如果我有一个数组 ['international', 'splint', 'tinder']
,我的查询是 Int,我认为 国际的应该比 夹板排名更高,即使前者的得分(更高 = 更差)为10比后者的3。
因此,我所寻找的(如果它不存在,我将创建)是一个具有以下功能的库:
有人见过这样的东西吗?我意识到 StackOverflow 不是一个需要软件推荐的地方,而是一个隐含的地方(不再是了!)以上是: 我是否正确地思考这个问题?
我找到了一个关于这个主题的 好文件(pdf)。一些注释和摘录:
仿射编辑距离函数为插入或删除序列分配相对较低的成本
Monger-Elkan 距离函数(Monge & Elkan 1996) ,它是 Smith-Waterman 距离函数的仿射变体,具有特定的成本参数
对于 史密斯-沃特曼距离(维基百科),“ Smith-Waterman 算法比较所有可能长度的片段并优化相似性度量,而不是查看总序列。”这是 n-gram 方法。
一个非常类似的度量指标(不基于编辑距离模型)是 Jaro 度量(Jaro 1995; 1989; Winkler 1999年)。在记录连接文献中,基于两个字符串之间公共字符的数量和顺序,使用这种方法的变体已经取得了很好的结果。
Winkler (1999)的一个变体也使用了最长公共前缀的长度 P
(似乎主要用于短的字符串)
出于文本完成的目的,Monger-Elkan 和 Jaro-Winkler 方法似乎是最有意义的。Winkler 对 Jaro 度量的添加有效地加重了单词开头的权重。Monger-Elkan 的仿射方面意味着完成一个单词的必要性(这只是一个简单的添加序列)不会对它产生太大的不利影响。
结论:
TFIDF 在几个基于令牌的距离中表现最好的排名 以及由 Monge 和 Elkan 提出的调谐仿射间隙编辑距离度量,在几个指标中表现最好 字符串编辑距离度量。一个惊人的好距离 度量是一个快速的启发式方案,由 Jaro 提出,后来由 Winkler 扩展。 这几乎和蒙格-埃尔坎计划一样有效,但是 数量级更快。 一种将 TFIDF 方法与 Jaro-Winkler 将替换 基于 Jaro-的近似令牌匹配的 TFIDF 温克勒计划。这种组合的平均表现略好于 Jaro-Winkler 或 TFIDF,有时表现得更好。它的性能也接近于几个最好的度量标准的学习组合 在本文中考虑。