2011-06-23 38 views
6

Tôi đang làm việc trên một kịch bản để đánh giá phản hồi của người dùng bằng cách so sánh hai mảng. (Đó là một bài kiểm tra để xem họ biết thông tin từng từ một cách rõ ràng như thế nào.) Tôi đã có một số mã mà tôi cần, như làm cho chữ thường phản ứng của người dùng và tách nó ra. Tất cả những gì tôi cần là cái gì đó để tìm ra số khác biệt/sai lầm. Ví dụ:Sử dụng JavaScript để đánh giá phản hồi của người dùng (so sánh hai mảng)

var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"]; 
var useranswer = ["The","brown","fox","jumped","up","and","over","the","really","lazy","cat"]; 
alert(counterrors(correctanswer, useranswer)); 

Trong ví dụ cụ này, chạy chức năng tôi đang tìm kiếm sẽ trở lại mà người dùng đã chia sẻ 5 lỗi (họ bỏ qua "nhanh", thêm "lên", "và" và "thực sự" và đã thay đổi "chó" thành "mèo"). Như bạn có thể thấy, hai mảng có thể có độ dài khác nhau.

Có ai biết cách tiếp cận điều này không? Tôi đã nghĩ rằng nó có thể sẽ là một vòng lặp như:

for (x in correctanswer) { 
    // compare correctanswer[x] to useranswer[x]... not sure how exactly. Seems tricky... 
} 

Cảm ơn bạn đã xem xét điều này! Tôi đã thấy giải pháp khác của John Resig (http://ejohn.org/projects/javascript-diff-algorithm/) và những thứ tương tự khác, và thậm chí là một vài so sánh mảng, nhưng không có gì có hiệu quả vì những cái tôi tìm thấy trả về tất cả sự khác biệt, trong khi tôi muốn xem có bao nhiêu sự khác biệt. Một lần nữa, cảm ơn bạn đã tìm kiếm và vui lòng cho tôi biết về bất kỳ câu hỏi nào.

Cập nhật: Rất cám ơn Magnar đã trả lời! Nó hoạt động hoàn hảo.

Trả lời

6

Điều sau bạn là The Levenshtein Distance của hai mảng.

Nó là một thuật toán cho phép tính số bổ sung, xóathay cần thiết để chuyển đổi một chuỗi thành khác.

Wikipedia page I linked có triển khai mã giả. Tôi đã làm một line-cho-line dịch JavaScript cho bạn:

var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"]; 
var useranswer = ["The","brown","fox","jumped","up","and","over","the","really","lazy","cat"]; 

console.log(calculate_levenshtein_distance(correctanswer, useranswer)); 

function calculate_levenshtein_distance(s, t) { 
    var m = s.length + 1, n = t.length + 1; 
    var i, j; 

    // for all i and j, d[i,j] will hold the Levenshtein distance between 
    // the first i words of s and the first j words of t; 
    // note that d has (m+1)x(n+1) values 
    var d = []; 

    for (i = 0; i < m; i++) { 
    d[i] = [i]; // the distance of any first array to an empty second array 
    } 
    for (j = 0; j < n; j++) { 
    d[0][j] = j; // the distance of any second array to an empty first array 
    } 

    for (j = 1; j < n; j++) { 
    for (i = 1; i < m; i++) { 
     if (s[i - 1] === t[j - 1]) { 
     d[i][j] = d[i-1][j-1];   // no operation required 
     } else { 
     d[i][j] = 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[m - 1][n - 1]; 
} 

này sẽ đăng nhập 5 ra cửa sổ Console. Đó là, như bạn sẽ thấy, khoảng cách chính xác giữa các mảng. Học sinh không thêm lazy. Vì vậy, nó là 1 xóa, 3 bổ sung và 1 thay thế.

+0

Magnar - Cảm ơn! Tôi nghĩ rằng đây là nó ... Vì vậy, tôi sẽ vượt qua các giá trị mảng thay vì các chuỗi như họ đã làm trong bài viết? – Alex

+0

Có, thay vì ký tự, bạn sẽ sử dụng các giá trị mảng; từ. – Magnar

+0

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn! Tôi chưa quá giỏi với JavaScript, nhưng tôi sẽ cố gắng lấy nó từ đây. Nếu bạn có bất kỳ đề xuất nào về cách triển khai, vui lòng cho tôi biết. Tôi sẽ đánh dấu đây là câu trả lời được chấp nhận. – Alex

0

Tôi không chắc chắn nếu tôi hoàn toàn hiểu những gì bạn muốn nhưng tôi nghĩ rằng đây là giải pháp.

function counterrors(a, b) { 
    var max = Math.max(a.length, b.length); 
    var min = Math.min(a.length, b.length); 
    var count = 0; 
    for (var i = 0; i < min; i+=1) { 
     if (a[i] !== b[i]) { 
      count += 1; 
     } 
    } 
    return count + max - min; // max - min for any extra things that don't match 
} 
var correctanswer = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"]; 
var useranswer = ["The", "brown", "fox", "jumped", "up", "and", "over", "the", "really", "lazy", "cat"]; 
alert(counterrors(correctanswer, useranswer)); 
+0

John - Cảm ơn bạn đã chia sẻ. Tôi chỉ thử điều đó và nó tính 10 lỗi thay vì 6 ... – Alex

+0

10 là giá trị chính xác nếu họ cần nhập các từ theo thứ tự đó. Bạn đang cố gắng tìm hiểu xem có bao nhiêu từ mà người dùng không nhập trong câu trả lời? Tôi nghĩ Magnar có giải pháp mà bạn đang tìm kiếm. –

+0

Tôi đang cố gắng tìm số lần thêm cộng với xóa cộng với biến thể từ (như đổi "chó" với "mèo"). Vì vậy, không chỉ những gì họ không gõ mà còn là những thứ không chính xác mà họ đã gõ ... Bất kỳ ý tưởng nào khác? EDIT: Chỉ cần nhìn thấy câu trả lời của Magnar. – Alex

Các vấn đề liên quan