【问题标题】:How to check substring in a string with fuzziness?如何检查具有模糊性的字符串中的子字符串?
【发布时间】:2018-07-10 10:16:00
【问题描述】:

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

【问题讨论】:

  • 也许您可以创建一个已接受单词的列表并对其进行查找替换,然后检查“我的名字”
  • 这是不可能的,因为数据库很大。

标签: javascript


【解决方案1】:

如果你使用 node.js,你可以使用 npm 包natural。 它用于自然语言处理应用程序。 它有一组计算字符串距离的方法。这意味着My name 94% 等于My nama。您可以基于此创建模糊算法。一个例子:

const natural = require('natural');
let distance = natural.JaroWinklerDistance("My name", "My nama");
console.log(distance);

打印0.9428571428571428

您还可以在其中找到其他有趣的东西,例如拼写检查和近似字符串匹配。

我只用 javascript 编写了一个简单的模糊包含方法,其中包含三个输入。第一个是完整字符串,第二个是子字符串,第三个是允许的错误。在这种错误 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))

【讨论】:

  • 我没有使用 node.js
  • github.com/thsig/jaro-winkler-JS 如果需要,请选中此项,它提供相同的字符串距离功能。互联网上也有其他实现。
  • 这是为了比较两个字符串。我想检查一个字符串是否包含一个模糊的子字符串。
  • 你说你可以轻松地完成包含部分,你的问题是拼写错误
  • 我说是因为在 javascript 中我可以使用 includes 检查字符串是否包含子字符串,但如果出现拼写错误,我将无法工作,因为 includes 会逐个字母检查。
【解决方案2】:

可以比较String,比如

我的名字 我的名字

是 90% 匹配,因此您可以返回 true。

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

Compare Strings Javascript Return %of Likely

【讨论】:

  • 我怎么知道我会用什么子字符串来比较小字符串。而不是My nama 它可以iss khananame ikmy name khan?
  • 第一个参数可以是您的数据库值,第二个参数可以是您输入的值
猜你喜欢
  • 2015-07-19
  • 2015-01-22
  • 2018-03-23
  • 2013-07-18
  • 2011-02-18
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多