假设您需要检查字符串行“怪物”。 你有这样的示例字符串行:
1) People are afraid of monters
2) Mansters are very scary
3) I like mnsters
正如你所看到的,所有“怪物”单词拼写错误。 问题是你怎么能发现那些字符串包含“怪物”? 我正在考虑某些 for循环的单词长度,这会对单词“monster”进行不同的操作,比如删除第一个或最后一个字母(“onster”,“monste”),中间的字母( “monter”),将单词分成两部分(“mon”,“ster”)或类似于smth。然后尝试在字符串中找到这个新单词。
你可以说 - 使用正则表达式! - 但是当我的单词 - “怪物”动态输入数据时,我想我不能使用它们。
感谢您的所有答案。
其他问题:
Indexof(“myst”)和string.search(新的RegExp(“myst”,“gi”)在这种情况下将返回相同的结果,但我认为第二个选项需要更多时间。
答案 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'的出现次数,您将获得所需的计数。或者你可以在其中过滤掉带有“怪物”字样的字符串。 如果我的理解不正确或者这不是你想要实现的,请纠正我。