Размещенное повторение (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. Это хорошо задокументировано и может помочь вам понять.