我想做一个测验,用户应该输入正确的答案。 假如答案匹配90%,那么答案是正确的。例如,如果用户键入
Britney Spers
而不是Britney Spears
,答案应该是正确的。
我搜索了Javascript函数来确定答案的准确程度,我发现了PHP,Ruby等一些有趣的函数,但我需要用JavaScript。
有没有人体验过这些算法? 谢谢你,如果你回答:)
答案 0 :(得分:3)
您正在寻找编辑距离算法。基本上,您希望查看从一个字符串到另一个字符串需要多少字符更改(添加/删除/替换)。当然,现在你必须有一个目标字符串字典才能找到距离。
http://en.wikipedia.org/wiki/Edit_distance
更具体地说:http://en.wikipedia.org/wiki/Levenshtein_distance
Britney Spers
和Britney Spears
之间的编辑距离为1:插入'a'
。
答案 1 :(得分:3)
您正在寻找 edit distance (又名Levenshtein距离)。在此方案下,两个字符串之间的距离是制作所需的插入,删除或替换的数量字符串匹配。例如,如果正确的答案是“橙子”,那么:
s
)r
,替换s -> r
)o -> s
,替代r -> p
,替换o -> a
)oranges
中的每个字母)Javascript中的简单算法看起来像这样(根据 this gist 进行修改和修改):
function(a, b){
// Return the number of characters in the other
// string if either string is blank.
if(a.length == 0) return b.length;
if(b.length == 0) return a.length;
// Otherwise, let's make a matrix to represent the possible choices
// we can take.
var matrix = [];
var i;
for(i = 0; i <= b.length; i++){
matrix[i] = [i];
}
var j;
for(j = 0; j <= a.length; j++){
matrix[0][j] = j;
}
for(i = 1; i <= b.length; i++){
for(j = 1; j <= a.length; j++){
if(b.charAt(i-1) == a.charAt(j-1)){
matrix[i][j] = matrix[i-1][j-1];
} else {
matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
Math.min(matrix[i][j-1] + 1, // insertion
matrix[i-1][j] + 1)); // deletion
}
}
}
return matrix[b.length][a.length];
};
您的问题的一个问题是,您撰写的关于您正在寻找的内容的示例(例如“匹配90%”或“答案的准确性”)并非明确定义的指标。
有很多方法可以回答错误。例如,假设正确的答案是“苹果”。应该接受以下哪些?
等等。决定哪些应该被接受超出了简单的编辑距离算法的能力,并且需要更大的提升,如NLP。