Telegram bot for learning English words with spaced repetition technique

Привіт. Планую розпочати розробку такого бота, шукаю перших користувачів, кому це буде цікаво, та будь які інстайти щодо ідеї.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Буквально на днях сделал себе телеграм бота для изучения новых английских слов методом повторения (интервальное повторение, система Лейтнера) Словарь на 17814 слов, итерации повторения — от суток до года, прослушивание произношения слов сразу во время повторения. t.me/RepeatWordBot

есть жи www.wordupapp.co

Додатків для мобільних телефонів вистачає, говориться саме про бота. Плюс бота в тому, як людина з ним взаємодіє. У додатків інше сприйняття. Для мене додатки — це ще одна робота, яку приходиться виконувати, регулярно, щоб вивчити англ. А відписати боту, це як і комусь іншому. На пару секунд переключився, і далі до своїх справ )

Такий функціонал вже існує. І веб версія, і купа програм під Андроід/айФон.
ankiweb.net/about

еще одна бесполезная прога для изучения английского. Единственный эффективный способ — индивидуальные занятия с профессиональным преподавателем

Нащо створювати ще одного бота, коли можна взяти будь-якого існуючого, створеного носіями мови? Нехай він і не здогадується, чому із ним спілкуються.

Планується, що бот буде створений для вивчення незнайомих слів на англійській мові.

Fail. Реальне вивчення мови відбувається через прокачку знайомими словами, лише з невеликою долею незнайомих. Слово не вивчиш по словнику, його треба вміти використовувати, а для цього потрібні кейзи.

Кейси можна додати разом зі словом ) І пропонувати якраз доповнити речення словом, що вивчається

оо, в мене колись була подібна ідея, правда до реалізації так руки і не дійшли. я перепробував просто неймовірну кількість різних сервісів та застосунків (наразі зупинився на Memrise через велику кількість створеного користувачами якісного контенту). але і у Memrise, і у Anki, і у чого завгодно всюди одна і та сама проблема — там просто дебільні алгоритми розрахунку часу для наступного повторення. мене це жахливо не влаштовувало, але я так і не знайшов жодного сервісу який би мене в цьому плані задовольняв. якщо Ви щось з цим зробите, то буде просто суперово.

Еее... А в чому дебільність? Вроді би якраз норм штука — exponential decay.

наскільки я розумію, всі ці програми мають певні фіксовані проміжки через які запитують повторення (розраховані з отим exponential decay). при помилці вони перекидають користувача на початок, чи ще там якось викручуються. мене тут не влаштовує дві речі:
* по-перше, слова різні за складністю і у кожного, скажімо, мав би бути різний показник у експоненти. тобто імовірність згадати певне слово в момент часу t після його повторення в нульовий момент має бути exp(-a*t), де а залежить від слова (в ідеалі і від людини, яка це слово учить). слова типу car, door легко запам’ятовуються зразу і тримаються в пам’яті довго, а от який-небудь floccinaucinihilipilification фіг там.
* по-друге, при помилці вони кидають на початок (бувають чуть складніші алгоритми, я вже всіх деталей не пам’ятаю, бо давно в тім копався) і треба знов щохвилини повторювати те слово, яке до того вже разів 30 повторив і навіть через півроку його успішно згадував, але тут раптом опечатався і на тобі.
найгірше, що ці алгоритми часто прошиті прямо «в ядро» і можливості «акуратно підкостилити» своїм алгоритмом нема. я так на Anki глянув... і забив, не так уже й хотілось, щоб ввесь той код перебирати ))

Я думаю це питання вирішить наявність кнопок, типу «впевнено знаю, інколи забуваю» і тд. Таким чином алгоритм повторень буде корегуватися. До прикладу, слово що ви інколи забуваєте, буде показуватися з середньою частотою, поки не натисните «впевнено знаю»

Таким чином можна зробити exponential + кастомне втручання в алгоритм

якщо дозволите, можу запропонувати трохи більш автоматизований підхід, але відразу чесно скажу, що я його не тестував. ідея приблизно така: імовірність згадати дане слово для даного користувача падає по експоненті з невідомим показником альфа. нас цікавить «період напівзабуття» — час який має пройти, щоб імовірність згадати слово була 50% (от тоді користувача і спитати). модель користувача виглядала би якось так (мої вибачення за код, але писав дуже давно, на 2-му пітоні і то все зліплено на коліні як попало, але добре, що він хоч взагалі зберігся з тих часів)

def get_answer(time, half_time):
    alpha = np.log(2) / half_time
    threshold = np.exp(- alpha * time)
    return np.random.rand() < threshold
ця функція каже правильно чи неправильно згадав користувач слово, якщо з останнього запиту пройшло time часу, а період напівзабуття half_time. ми не знаємо half_time, але маємо набір time і результатів роботи цієї функції. треба відновити half_time. для відновлення я пропоную щось таке
#                                                  this is bad practice
def predict_halftime(delta_t, result, cache_size=5, _cache=[]):
    if result == None:
        return 5 # initial value

    _cache.append((delta_t, result))
    if len(_cache) > cache_size:
        _cache = _cache[1:] # remove the first element, don't keep the history too long

    success = [dt for dt,r in _cache if r]
    failure = [dt for dt,r in _cache if not r]
    if len(failure) == 0:
        return 2 * np.max(success) # double waiting time until a failure occurs
    if len(success) == 0:
        return 0.5 * np.min(failure) # halve waiting time until a success occurs

    koef = np.log(np.sum(failure) / np.sum(success) + 1.0)
    alpha_min = koef / np.max(failure)
    alpha_max = koef / np.min(failure)
    if alpha_max - alpha_min < 1e-25:
        return np.log(2) / alpha_max

    f     = lambda x:     0.0 if x > 1e2 else (1.0 - x/2.0 if x < 1e-3 else  x / (np.exp(x) - 1.0))
    func  = lambda alpha: np.sum(map(f, np.multiply(alpha, failure))) / alpha - np.sum(success)
    alpha = scipy.optimize.bisect(func, alpha_min, alpha_max)
    return np.log(2) / alpha
в мене десь були чорновики з формулами, де я виводив всю цю фігню, якщо буде цікаво, то я пошукаю. але сенс в тому, що якщо тепер це все потестити
unknown_half_time = 15
when_to_ask = 0.0
last_result = None
for i in range(1, 30): # try 20 times
    when_to_ask = predict_halftime(when_to_ask, last_result, cache_size=10)
    last_result = get_answer(when_to_ask, unknown_half_time)
    print i, last_result, when_to_ask
то воно порівняно швидко зорієнтується, що unknown_half_time = 15 і буде коло того значення крутитись
1 True 5
2 True 10
3 False 20
4 False 20.0
5 True 10.6696876512
6 False 14.7583847427
7 True 11.0563853507
8 True 13.8447995535
9 False 17.2294630012
10 True 14.0786748211
11 False 16.6580150647
12 False 13.4816058877
13 True 11.805267223
14 False 13.2748363538
15 True 11.8650049009
.........

Бро, заради Бога, не пиши так:

return True if np.random.rand() < threshold else False
пиши так:
return np.random.rand() < threshold
бо аж передьорнуло

цьому коду вже не один рік — це одна з перших програм, що я писав на пайтон ))

підфіксив, доки ще повідомлення правляться

Ееее... Так це ж було чи не з першої версії:
cdn.lo4d.com/...​t/screenshot/500/anki.png

Анкі десь так і робить...
faqs.ankiweb.net/...​repetition-algorithm.html

посилання на код там биті. посилання на статтю (www.supermemo.com/...​s1990-2015/english/ol/sm2) працює, але там я бачу

After each repetition assess the quality of repetition response in 0-5 grade scale:

тобто ніякого автоматизму, сам себе ще й оцінюй (я таке не люблю). а ще купа феноменологічних коефіцієнтів

EF’:=EF+(0.1-(5-q)*(0.08+(5-q)*0.02))

мені здається, що я вже читав ту статтю і навіть бачив ці коефіцієнти в коді анкі. я просто пам’ятаю, що в свій час перекопав дуже багато всього і мене постійно щось не влаштовувало. звичайно, я міг щось пропустити, чи за ці роки якісь нові підходи з’явились. але просто якщо така лінива людина як я вже взялась щось кодити, то значить на той момент справи дійсно були кепські.

Я щось туплю ...

0. Ось посилання на код на паскалі (чи дельфі) прямо з їхньої сторінки: www.supermemo.com/...​2015/english/ol/sm2source

1. Чому погано самому оцінити наскільки легко ти згадав якесь слово? Просто коли тебе просять дати відповідь на питання «столция Есватіні?», то які є варіанти? Ну я сходу бачу кілька:
* треба вручну ввести — довго і муторно, + автокоррект допоможе. Але ця штука дає змогу дивитись як саме ти набираєш відповідь, тіпа швидко набрав чи ні... впевнено чи виправляв багато. Але важко оцінити чи те, що ти описався це фундаментальна помилка чи реально описався.
* треба вибрати один із варіантів відповідей — туфта, Київ, Москва, і Лондон 100% не є столицями Есватіні, значить беремо четвертий варіант.
* треба попросити щоб ти сам сказав наскільки легко ти згадав — гірше ніж вручну, але як и ти сам себе обманюєш. зате афігенне розуміння того, що відбувається — скажеш «легко», то наступний раз будеш проходити цю задачу сильно пізніше

2. Феноменологічні коефіцієнти. Мужик, це ж перевернута парабола з вершиною в q=5. Тебе просять оцінити свої знання від 0 до 5. Якщо візьмеш 5, то easiness (легкість) зросте на 0.1. Якщо візьмеш q=0, то впаде на 0.8.

0. Ось посилання на код на паскалі (чи дельфі) прямо з їхньої сторінки: www.supermemo.com/...​2015/english/ol/sm2source

видно, я якось умудрився його не помітити. але все одно там в коді

EF:=EF+(0.1-(5-Grade)*(0.08+(5-Grade)*0.02));

так що моя попередня думка про всю цю емпірику залишається в силі.

1. Чому погано самому оцінити наскільки легко ти згадав якесь слово?

та не те щоб це було погано, просто незручно. це як програмувати в блокноті без автодоповнення і підсвітки синтаксису — можна, нічого поганого в цьому нема, але назвати таке зручним...

Ну я сходу бачу кілька:
* треба вручну ввести — довго і муторно

от я б проголосував за цей перший варіант. дійсно муторно, але мій досвід каже, що всі ті варіанти з вибором ітд працюють лише на перших кількох повтореннях коли слово з розряду «взагалі ніколи не бачив» переходить у «можу з трудом впізнати». а от щоб його грамотно писати і достатньо легко згадувати, то таки ввід незамінний. хоча може це якісь мої особливості сприйняття, я хз, статистики не маю.

2. Феноменологічні коефіцієнти. Мужик, це ж перевернута парабола з вершиною в q=5. Тебе просять оцінити свої знання від 0 до 5. Якщо візьмеш 5, то easiness (легкість) зросте на 0.1. Якщо візьмеш q=0, то впаде на 0.8.

лол, ну кожна функція якось називається і що з того? а чого там парабола, а не кубіка, не синусоїда, не функція Бесселя? трансляцією і скейлом по іксах-ігриках я будь-яку функцію проведу через 2 задані точки і що з того? чому впаде на 0.8, а не 0.9? або 0.76342? я за цим всім не бачу підґрунтя.

А ви пробували розібратися із настройками? Не знаю як в інших, а в анкі дуже гнучко налаштовуються інтервали — 4 варіанти із довільним коефіцієнтом, крім того початковий та максимальний інтервал.
В анкі найскладніше -контент, знайти те що тобі «зайде», або створити самому. Я комбінував готові колоди (найкраще зайшла «6000 слів» від пола ньюмана вроді) і свої — LinguaLeo + конвертація їх в колоди akni.Результат феноменальний.

щось пробував, але в будь-якому випадку це не те, що мені потрібно. просто я хочу налаштування для _кожного_слова_окремо_. аргументую це тим, що слова дуже різні за складністю і потребують «індивідуальний підхід». навіть якщо в анкі є можливість налаштовувати кожне слово окремо, то з очевидних причин параметри повинні підбиратися автоматично, а такої автоматики там точно нема.

Anki рулить.. Чим бот буде кращим?

Anki, як і інші апки, це ще одне місце куди потрібно зайти, і не забути ) Також на скільки я знаю (можете мене поправити), там немає нагадувань.
Ми більшість часу проводимо зараз в месенджерах, тому ціллю буде зробити вивчення англ таким ж простим, як відписати комусь в чаті )

Плюс хотілось б зробити оцінку рівня знання слів, на початку розмови з ботом, і відштовхуючись від цього пропонувати незнайомі користувачу слова. Завантажувати їх з інтернету, та пропонувати речення як приклад використання.

Підписатись на коментарі