Размещенное повторение (SRS) для обучения
Клиент попросил меня добавить простой разнесенный алгоритм повторения (SRS) для онлайн-сайта обучения. Но прежде, чем наброситься на него, я хотел бы обсудить это с сообществом.
В основном сайт запрашивает у пользователя кучу вопросов (автоматически выбирая 10 из 100 общих вопросов из базы данных), и пользователь дает либо правильный, либо неправильный ответ. Результат пользователя затем сохраняется в базе данных, например:
userid questionid correctlyanswered dateanswered
1 123 0 (no) 2010-01-01 10:00
1 124 1 (yes) 2010-01-01 11:00
1 125 1 (yes) 2010-01-01 12:00
Теперь, чтобы максимизировать способность пользователей изучать все ответы, я должен иметь возможность применять алгоритм SRS, чтобы пользователь, в следующий раз, когда он брал викторину, часто получал вопросы, которые были неправильно отреагированы; чем правильно ответил вопрос. Кроме того, вопросы, которые ранее отвечали неправильно, но недавно часто отвечали правильно, должны происходить реже.
Кто-нибудь реализовал что-то подобное раньше? Любые советы или предложения?
Тезы - лучшие ссылки, которые я нашел:
Ответы
Ответ 1
Что вы хотите сделать, так это иметь номер X_i
для всех вопросов i
. Вы можете нормализовать эти числа (сделать их сумму 1) и сделать выбор по приоритетам.
Если N
- количество разных вопросов, а M
- это количество раз, на которое ответили каждый вопрос в среднем, тогда вы можете найти X
в M*N
времени, как это:
- Создать массив
X[N]
, установленный в 0.
- Запустите данные, и каждый раз, когда вы задаете вопрос
i
, ответьте неправильно, увеличьте N[i]
на f(t)
, где t
- время ответа, а f
- функция incresing.
Потому что f
растет, вопрос, который давно не отвечал, имеет меньшее влияние, чем вчера ответили неправильно. Вы можете поэкспериментировать с другим f
, чтобы получить хорошее поведение.
Более разумный способ
Более быстрый способ - не генерировать X[]
каждый раз при выборе вопросов, а сохранять его в таблице базы данных.
Вы не сможете применить f
к этому решению. Вместо этого просто добавляйте 1 каждый раз, когда на вопрос ответят неправильно, а затем регулярно повторяйте таблицу - скажите каждую полночь - и умножьте все X[i]
на константу - скажем 0.9
.
Обновить. На самом деле вы должны основывать свои данные на исправлениях, а не на ошибках. В противном случае вопросы не будут отвечать ни истинным, ни ложным в течение длительного времени, будут иметь меньшие шансы на выбор. Это должно быть наоборот.
Ответ 2
Anki - это программа с открытым исходным кодом, реализующая разнесенное повторение.
Являясь открытым исходным кодом, вы можете просмотреть источник libanki, разнесенную библиотеку повторов для Anki.
Начиная с Januray 2013, источники Anki версии 2 можно просмотреть здесь.
Источники находятся в Python
, языке исполняемого псевдокода.
Чтение источника для понимания алгоритма может быть осуществимым. Модель данных определяется с помощью sqlalechmey
, инструментария Python SQL и реляционного сопоставления объектов, который предоставляет разработчикам приложений полную мощность и гибкость SQL.
Ответ 3
Я сделал этот разнесенный алгоритм повторения: https://github.com/Jakobovski/SaneMemo. Это хорошо задокументировано и может помочь вам понять.