2013-03-21 24 views
6

tôi thấy chút mã này mà tính Levenshtein's distance giữa một câu trả lời và đoán:khoảng cách levenshtein C# count loại lỗi

int CheckErrors(string Answer, string Guess) 
{ 
    int[,] d = new int[Answer.Length + 1, Guess.Length + 1]; 
    for (int i = 0; i <= Answer.Length; i++) 
     d[i, 0] = i; 
    for (int j = 0; j <= Guess.Length; j++) 
     d[0, j] = j; 
    for (int j = 1; j <= Guess.Length; j++) 
     for (int i = 1; i <= Answer.Length; i++) 
      if (Answer[i - 1] == Guess[j - 1]) 
       d[i, j] = d[i - 1, j - 1]; //no operation 
      else 
       d[i, j] = Math.Min(Math.Min(
        d[i - 1, j] + 1, //a deletion 

        d[i, j - 1] + 1), //an insertion 

        d[i - 1, j - 1] + 1 //a substitution 

       ); 
    return d[Answer.Length, Guess.Length]; 
} 

Nhưng tôi cần một cách để làm một số cho số lần mỗi lỗi xảy ra. Có cách nào dễ dàng để thực hiện điều đó không?

Trả lời

4

Có vẻ như bạn có thể thêm các quầy cho từng hoạt động:

   if (Answer[i - 1] == Guess[j - 1]) 
        d[i, j] = d[i - 1, j - 1]; //no operation 
       else 
       { 
        int del = d[i-1, j] + 1; 
        int ins = d[i, j-1] + 1; 
        int sub = d[i-1, j-1] + 1; 
        int op = Math.Min(Math.Min(del, ins), sub); 
        d[i, j] = op; 
        if (i == j) 
        { 
         if (op == del) 
          ++deletions; 
         else if (op == ins) 
          ++insertions; 
         else 
          ++substitutions; 
        } 
       } 
+0

Tôi đã thử điều này với một ví dụ về "hello" và "hello" và nó cho biết thêm lên trên xóa và chèn khi nó là chính xác. Đây là loại điều tôi cần chỉ không chắc chắn bit này là chính xác làm việc! – user1988332

+0

Xóa và chèn cả hai nhổ ra số 9 khi "hello" là chính xác? – user1988332

+0

Vấn đề cơ bản là tôi hiểu lầm những gì đang xảy ra. Trong mã, bạn chỉ muốn tăng số lần xóa, chèn, v.v. khi 'i == j'. Ít nhất, tôi nghĩ đó là vấn đề. Bạn có thể phải thử nghiệm nó. Tôi đã thực hiện thay đổi đối với mã của mình. –