我有一个字符串akstr = My name is khan
,我想知道akstr
是否包含My name
,我可以很容易地做到这一点,但是如果要检查akstr
是否包含{{ 1}}的拼写错误很少,我希望将My nama
作为输出。可以使用javascript完成吗?
答案 0 :(得分:1)
假设您使用的是node.js,则可以使用npm软件包natural。
它用于自然语言处理应用程序。
它具有一组用于计算弦距的方法。意味着My name
等于My nama
的94%。您可以基于此创建模糊算法。一个例子:
const natural = require('natural');
let distance = natural.JaroWinklerDistance("My name", "My nama");
console.log(distance);
打印0.9428571428571428
您可能还会在其中找到其他有趣的内容,例如拼写检查和近似字符串匹配。
我只用JavaScript编写了一个简单的带有三个输入的Fuzzy contains方法。第一个是完整字符串,第二个是子字符串,第三个是允许的错误。在这种情况下出现错误2,您允许子字符串的2个字符不同。为0时,您将获得常规的contains方法。您还可以更改错误的计算方式(可能是基于子字符串长度的百分比)。我从下面将代码用于levenstein方法:https://gist.github.com/andrei-m/982927
function levenstein(a, b) {
var m = [], i, j, min = Math.min;
if (!(a && b)) return (b || a).length;
for (i = 0; i <= b.length; m[i] = [i++]);
for (j = 0; j <= a.length; m[0][j] = j++);
for (i = 1; i <= b.length; i++) {
for (j = 1; j <= a.length; j++) {
m[i][j] = b.charAt(i - 1) == a.charAt(j - 1)
? m[i - 1][j - 1]
: m[i][j] = min(
m[i - 1][j - 1] + 1,
min(m[i][j - 1] + 1, m[i - 1 ][j] + 1))
}
}
return m[b.length][a.length];
}
function fuzzyContains(a, b, error) {
var matchLength = a.length - b.length;
var distanceToMatch = levenstein(a, b) - matchLength;
if(distanceToMatch - error > 0) {
return false;
} else {
return true;
}
}
console.log(fuzzyContains("hello world entire", "worlf", 1))
答案 1 :(得分:0)
您可以比较字符串,例如
我的名字 我的妈妈
匹配率为90%,因此您可以返回true。
您将从以下链接中获得更多想法