如何检查带有模糊性的字符串中的子字符串?

时间:2018-07-10 10:16:00

标签: javascript

我有一个字符串akstr = My name is khan,我想知道akstr是否包含My name,我可以很容易地做到这一点,但是如果要检查akstr是否包含{{ 1}}的拼写错误很少,我希望将My nama作为输出。可以使用javascript完成吗?

2 个答案:

答案 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。

您将从以下链接中获得更多想法

Compare Strings Javascript Return %of Likely