Раздельное повторение (SRS) для обучения - PullRequest
15 голосов
/ 03 июня 2010

Клиент попросил меня добавить простой алгоритм повторения с интервалом (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, чтобы пользователь, в следующий раз, когда он принимал участие в опросе, получал вопросы с неправильными ответами чаще; чем правильно ответил на вопросы. Кроме того, вопросы, на которые ранее отвечали неправильно, но в последнее время часто отвечали правильно, должны встречаться реже.

Кто-нибудь реализовывал что-то подобное раньше? Любые советы или предложения?

Вот лучшие ссылки, которые я нашел:

Ответы [ 2 ]

8 голосов
/ 03 июня 2010

Anki - это программа с открытым исходным кодом, реализующая интервальное повторение.Будучи открытым исходным кодом, вы можете просматривать исходные тексты для libanki , разнесенной библиотеки повторений для Anki.По состоянию на январь 2013 года источники Anki версии 2 можно просматривать здесь .

Источники находятся на Python, исполняемый псевдокод .Чтение источника, чтобы понять алгоритм, возможно.Модель данных определяется с использованием sqlalechmey, инструментария Python SQL и Object Relational Mapper, который предоставляет разработчикам приложений полную мощь и гибкость SQL.

6 голосов
/ 03 июня 2010

То, что вы хотите сделать, это иметь номер X_i для всех вопросов i. Вы можете нормализовать эти числа (сделать их сумму 1) и сделать приоритетный выбор.

Если N - это количество различных вопросов, а M - это количество ответов на каждый вопрос в среднем, тогда вы можете найти X за M*N время, например:

  • Создать массив X[N], установленный в 0.
  • Просмотрите данные, и каждый раз, когда вы видите, что на вопрос i ответили неправильно, увеличьте N[i] на f(t), где t - время ответа, а f - увеличивающаяся функция.

Поскольку f увеличивается, вопрос, на который давным-давно был дан неправильный ответ, оказывает меньшее влияние, чем тот, на который вчера был неверный ответ. Вы можете поэкспериментировать с различными f, чтобы получить хорошее поведение.

Умнее Более быстрый способ - не генерировать X[] каждый раз, когда вы выбираете вопросы, а сохранять его в таблице базы данных. Вы не сможете применить f с этим решением. Вместо этого просто добавляйте 1 каждый раз, когда на вопрос дается неправильный ответ, а затем регулярно просматривайте таблицу - скажем, каждую полночь - и умножьте все X[i] на константу - скажем, 0.9.

Обновление : На самом деле вы должны основывать свои данные на исправлениях, а не на ошибках. В противном случае вопросы, на которые не ответили ни истина, ни ложь в течение длительного времени, будут иметь меньшие шансы быть выбранными. Должно быть наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...