在字符串中找出错误的单词

时间:2014-04-05 05:15:35

标签: javascript string

假设您需要检查字符串行“怪物”。 你有这样的示例字符串行:

1) People are afraid of monters
2) Mansters are very scary
3) I like mnsters

正如你所看到的,所有“怪物”单词拼写错误。 问题是你怎么能发现那些字符串包含“怪物”? 我正在考虑某些 for循环的单词长度,这会对单词“monster”进行不同的操作,比如删除第一个或最后一个字母(“onster”,“monste”),中间的字母( “monter”),将单词分成两部分(“mon”,“ster”)或类似于smth。然后尝试在字符串中找到这个新单词。

你可以说 - 使用正则表达式! - 但是当我的单词 - “怪物”动态输入数据时,我想我不能使用它们。

感谢您的所有答案。

其他问题:

  1. 花朵生长在神秘洞穴中。 输入单词 - myst。 LastIndexOf将是我的选择吗?或者我应该使用像string.search(/ myst / gi)这样的东西?
  2. Indexof(“myst”)和string.search(新的RegExp(“myst”,“gi”)在这种情况下将返回相同的结果,但我认为第二个选项需要更多时间。

2 个答案:

答案 0 :(得分:1)

这是levenshteinDistance算法的javascript实现,它可以衡量两个字符序列的不同。在此示例中,我将一系列测试源字符串中的每个单词与特定候选单词进行比较。有许多方法可以进一步扩展这一点,例如理解复数形式而不是折扣只有多个不同的匹配。无论如何,这是下面link to a demo的实现:

function levenshteinDistance (s, t) {
        if (!s.length) return t.length;
        if (!t.length) return s.length;

        return Math.min(
                levenshteinDistance(s.substr(1), t) + 1,
                levenshteinDistance(t.substr(1), s) + 1,
                levenshteinDistance(s.substr(1), t.substr(1)) + (s.charAt(0).toLowerCase() !== t.charAt(0).toLowerCase() ? 1 : 0)
        );
}

var testStrings = [
    "People are afraid of monters.",
    "Mansters are very scary, even in the daytime",
    "I like mnsters.",
    "I like a big, scary monser"
];

var candidateWord = "monsters";
var words;
var results = [];
for (var i = 0; i < testStrings.length; i++) {
    words = testStrings[i].split(/[\s.,<>;:'"{}\[\]]+/);
    for (var j = 0; j < words.length; j++) {
        if (words[j]) {
            results.push({word: words[j], score: levenshteinDistance(words[j], candidateWord)});
        }
    }
}

并且,一个有效的演示:http://jsfiddle.net/jfriend00/3xEwj/

对输出进行排序后,它会显示测试字符串中每个单词的这些分数(分数越低意味着差异越小,因此匹配越好):

Score: 1
    monters
    Mansters
    mnsters
Score: 2
    monser
Score: 6
    scary
    very
    scary
Score: 7
    People
    of
    even
    in
    are
    daytime
    like
    like
    are
    the
Score: 8
    I
    I
    a
    big
    afraid

您可以根据需要打包此逻辑。您可以设置您愿意承受多少差异的阈值,然后将该阈值用作二进制匹配。例如,您可以将阈值设置为2,以便任何小于或等于2的分数表示它是匹配的。

答案 1 :(得分:0)

首先你需要拼写你的句子。

为此你需要一本字典。拼写纠正部分有点棘手但可以实现。对于字典中的每个单词,您需要在字典中找到最接近的匹配项。我知道一种技术可以用字典中的每个单词计算Levenstien Distance,对于字符串中的单词,如果它不是0,那么它就是拼写错误的单词。在这种情况下,您需要将其更正为最接近的匹配。对于'monter',它与'monster'的最小距离为1,因此正确的单词将是怪物。这样你就可以纠正整个句子。所以现在没有拼写错误的单词。

所以,如果您的输入是

1) People are afraid of monters
2) Mansters are very scary
3) I like mnsters

拼写纠正后的输出

1) People are afraid of monsters
2) Monsters are very scary
3) I like monsters

在这一步之后,基本上不应该有“字典外”字样。 我已经实现了一个稍微修改过的版本,您可以在github处查看它,但我希望您明白这一点。

在此之后,您可以计算单词'monster'的出现次数,您将获得所需的计数。或者你可以在其中过滤掉带有“怪物”字样的字符串。 如果我的理解不正确或者这不是你想要实现的,请纠正我。