我正在寻找一个模糊搜索JavaScript库来过滤数组.我已经尝试过使用fuzzyset.js和fuse.js,但结果非常糟糕(你可以尝试在链接页面上进行演示).
在对Levenshtein距离进行一些阅读之后,它让我感到很难接近用户在打字时所寻找的内容.对于那些不知道的人,系统会计算需要多少插入,删除和替换才能使两个字符串匹配.
在Levenshtein-Demerau模型中固定的一个明显的缺陷是blub和boob被认为与灯泡同样相似(每个需要两次替换).然而,很明显,灯泡更像blub而不是bob,而我刚才提到的模型通过允许换位来识别它.
我想在文本完成的上下文中使用它,所以如果我有一个数组['international', 'splint', 'tinder'],并且我的查询是int,我认为国际应该比夹板排名更高,即使前者的得分(更高=更差)为10与后者的3相比.
所以我正在寻找(并且如果它不存在则会创建),是一个执行以下操作的库:
有没有人遇到这样的事情?我意识到StackOverflow不是要求软件推荐的地方,但上面隐含的(不再是!)是:我正在考虑这个正确的方法吗?
我找到了一篇关于这个主题的好文章(pdf).一些注释和摘录:
仿射编辑距离函数为插入或删除序列分配相对较低的成本
Monger-Elkan距离函数(Monge&Elkan 1996),它是Smith-Waterman距离函数的一个仿射变体(Durban et al.1998),具有特定的成本参数
对于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扩展.这几乎与Monge-Elkan方案一样,但速度提高了一个数量级.组合TFIDF方法和Jaro-Winkler的一种简单方法是使用基于Jaro-Winkler方案的近似令牌匹配替换TFIDF中使用的确切令牌匹配.这种组合平均比Jaro-Winkler或TFIDF略好,并且偶尔表现得更好.对于本文中考虑的几个最佳指标的学习组合,它的性能也很接近.
javascript regex fuzzy-search pattern-matching string-matching