如何解决Levenshtein距离包括
假设我有以下数组:
const data = [{
label: 'Östra Halmgatan,Stockholm',value: 'Östra Halmgatan,Stockholm'
},{
label: 'Västra Vägen,value: 'Västra Vägen,{
label: 'Cykelvägen,Göteborg',value: 'Cykelvägen,Göteborg'
},{
label: 'Servicevägen,Köpenhamn',value: 'Servicevägen,Köpenhamn'
}
]}
我想进行搜索,以便用户可以使用模糊搜索来搜索商品。
我采取的第一步是实现一个用于检查距离的过滤器levenshtein算法。我过滤掉距离大于2的所有结果。
第一个问题是,当用户开始输入文字时,距离会很远。如果他们写“服务”,则距离为19,但显然应该显示Servicevägen,Köpenhamn
。我仅通过使用标签的子字符串(从0到userInput.length
)来解决此问题。在大多数情况下,这将导致正确的功能。因此,如果他们写Vöstra
(有错字),则只会显示Östra Halmgatan,Stockholm
和Västra Vägen,Stockholm
(因为这两个字符之间的距离为2或更小)。
但是,这导致了另一个问题。如果有人会写Stockholm
,那么当然应该显示前两个项目。我通过添加一个针对过滤器功能的修复程序对此进行了修复,该功能还检查了用户输入值是否包含在标签字符串中(所有字符串均设置为小写)。
这出奇地好,但是我仍然想知道是否有人可以帮助我解决这个问题。
例如,如果某人将使用非瑞典语键盘,那么如果他们要输入Göteborg
,则需要显示Goteborg
。使用include时,include从一开始就不会考虑拼写错误(或距离)。
基本上,我想知道是否有一种方法可以为考虑了距离的字符串编写包含函数?那将解决我的案例的所有用例。然后,我只能使用该函数,因为Vöstra
将对前两个返回true(假设距离设置为2或更小)。它也适用于Goteborg
和Stockholm
。
我在想的是您以……的风格编写函数
String.prototype.includesWithDistance(value: string,maxDistance: number) {
//... how would you approach this?
return substring (with a distance) is included
}
我看到很多可能的情况下都可以使用它,所以任何想法都会受到赞赏。
解决方法
您可能想尝试Smith-Waterman Gotoh
或Jaro-Winkler
算法进行这种计算。它更精确,并且能够处理错字。
您可以在此处测试您的比较: Test Similarity
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。