Cài đặt thuật toán lặp lại ngắt quãng SM-2 bằng JavaScript cho ứng dụng học từ vựng
Ứng dụng học từ vựng nào cũng gặp một câu hỏi: hôm nay cho người học ôn lại từ nào. Ôn tất cả mỗi ngày thì quá tải, ôn ngẫu nhiên thì từ khó bị bỏ quên. Lời giải phổ biến nhất là lặp lại ngắt quãng (spaced repetition): từ nào nhớ tốt thì giãn lịch ôn ra, từ nào hay quên thì đưa về sớm. Bài này cài thuật toán SM-2, phiên bản kinh điển do Piotr Woźniak công bố cho SuperMemo năm 1987, bằng JavaScript.
Ý tưởng của SM-2
Mỗi thẻ (một từ) lưu ba giá trị:
n: số lần liên tiếp người học nhớ đúng.ef(easiness factor): độ dễ của thẻ, khởi đầu 2,5, thấp nhất 1,3.interval: số ngày đến lần ôn tiếp theo.
Sau mỗi lần ôn, người học tự chấm q từ 0 đến 5 (0 là quên hẳn, 5 là nhớ ngay).
- Nếu
q < 3: coi như quên,nvề 0 và ôn lại sau 1 ngày. - Nếu
q >= 3: lần đầu ôn sau 1 ngày, lần hai sau 6 ngày, từ lần ba trở điinterval = interval * ef. efđược cập nhật theo công thức:ef = ef + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)).
Cài đặt
function sm2(card, q) {
let { n = 0, ef = 2.5, interval = 0 } = card;
if (q < 3) {
n = 0;
interval = 1;
} else {
if (n === 0) interval = 1;
else if (n === 1) interval = 6;
else interval = Math.round(interval * ef);
n += 1;
}
ef = ef + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02));
if (ef < 1.3) ef = 1.3;
const due = new Date();
due.setDate(due.getDate() + interval);
return { n, ef: Number(ef.toFixed(2)), interval, due: due.toISOString().slice(0, 10) };
}
Thử với một thẻ được chấm 5, 5, 4, 3:
let c = {};
for (const q of [5, 5, 4, 3]) {
c = sm2(c, q);
console.log(q, c.interval, c.ef);
}
// 5 1 2.6
// 5 6 2.7
// 4 16 2.7
// 3 43 2.56
Chọn thẻ cần ôn hôm nay
SELECT * FROM the_tu
WHERE nguoi_dung_id = ? AND due <= CURRENT_DATE
ORDER BY due ASC, ef ASC
LIMIT 50;
Sắp ef tăng dần để thẻ khó lên trước. Đặt trần mỗi ngày (ở đây 50) để người học không bị dồn hàng trăm thẻ sau vài ngày nghỉ.
Mấy điều rút ra khi đưa vào sản phẩm
- Thang 0 đến 5 quá nhiều lựa chọn với người dùng phổ thông. Gộp thành 3 nút "Quên", "Nhớ mờ", "Nhớ" rồi ánh xạ sang q = 1, 3, 5 là đủ.
- Nghỉ nhiều ngày thì không nên trừng phạt thẻ. Thẻ quá hạn vẫn tính theo ngày ôn thực tế, đừng hạ
efchỉ vì người học vắng mặt. - SM-2 không phải thuật toán duy nhất. Các thuật toán mới hơn như FSRS dự đoán xác suất nhớ chính xác hơn, nhưng SM-2 đơn giản, dễ giải thích và đủ tốt cho phần lớn ứng dụng học từ.
Có thể xem lặp lại ngắt quãng chạy trên thẻ từ thật, kèm audio phát âm, ở trang flashcard tiếng Anh của Từ Vựng 123.
All rights reserved