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,StockholmVästra Vägen,Stockholm(因为这两个字符之间的距离为2或更小)。

但是,这导致了另一个问题。如果有人会写Stockholm,那么当然应该显示前两个项目。我通过添加一个针对过滤器功能的修复程序对此进行了修复,该功能还检查了用户输入值是否包含在标签字符串中(所有字符串均设置为小写)。

这出奇地好,但是我仍然想知道是否有人可以帮助我解决这个问题。

例如,如果某人将使用非瑞典语键盘,那么如果他们要输入Göteborg,则需要显示Goteborg。使用include时,include从一开始就不会考虑拼写错误(或距离)。

基本上,我想知道是否有一种方法可以为考虑了距离的字符串编写包含函数?那将解决我的案例的所有用例。然后,我只能使用该函数,因为Vöstra将对前两个返回true(假设距离设置为2或更小)。它也适用于GoteborgStockholm

我在想的是您以……的风格编写函数

String.prototype.includesWithdistance(value: string,maxdistance: number) {
    //... how would you approach this?
    return substring (with a distance) is included
}

我看到很多可能的情况下都可以使用它,所以任何想法都会受到赞赏。

解决方法

您可能想尝试Smith-Waterman GotohJaro-Winkler算法进行这种计算。它更精确,并且能够处理错字。

您可以在此处测试您的比较: Test Similarity