允许输入错误

时间:2012-04-22 18:36:45

标签: javascript

我想做一个测验,用户应该输入正确的答案。 假如答案匹配90%,那么答案是正确的。例如,如果用户键入

Britney Spers而不是Britney Spears,答案应该是正确的。

我搜索了Javascript函数来确定答案的准确程度,我发现了PHP,Ruby等一些有趣的函数,但我需要用JavaScript。

有没有人体验过这些算法? 谢谢你,如果你回答:)

2 个答案:

答案 0 :(得分:3)

您正在寻找编辑距离算法。基本上,您希望查看从一个字符串到另一个字符串需要多少字符更改(添加/删除/替换)。当然,现在你必须有一个目标字符串字典才能找到距离。

http://en.wikipedia.org/wiki/Edit_distance

更具体地说:http://en.wikipedia.org/wiki/Levenshtein_distance

Britney SpersBritney Spears之间的编辑距离为1:插入'a'

答案 1 :(得分:3)

您正在寻找 edit distance (又名Levenshtein距离)。在此方案下,两个字符串之间的距离是制作所需的插入删除替换的数量字符串匹配。例如,如果正确的答案是“橙子”,那么:

  • “oranges”的距离为0(它们是同一个单词)
  • “orange”的距离为1(删除s
  • “roranger”的距离为2(插入r,替换s -> r
  • “海绵”的距离为3(替代o -> s,替代r -> p,替换o -> a
  • “”的距离为7(插入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%”或“答案的准确性”)并非明确定义的指标。

有很多方法可以回答错误。例如,假设正确的答案是“苹果”。应该接受以下哪些?

  • “APPLE”(错误的大写)
  • “ppple”(拼写错误)
  • “apples”(复数,但你想要单数)
  • “富士苹果”(太具体)
  • “水果”(太广泛)

等等。决定哪些应该被接受超出了简单的编辑距离算法的能力,并且需要更大的提升,如NLP。