Проект: Dasbot — Telegram-бот для повторения немецких артиклей  Публичный пост
11 ноября 2021  770
Держи долор ⨯3
Dasbot – Telegram-бот для повторения немецких артиклей

Когда я переехал в Германию и познакомился поближе с немецким языком, то обнаружил, что у существительных в нем есть грамматический род.
Индикатором рода служит артикль -- der для мужского, die для женского, das для среднего. Поэтому часто говорят о том, какой у слова артикль, имея в виду род.

Простой системы распределения по родам (как, например, в английском) в немецком нет.
Знание русского тоже никак не помогает, скорее, даже мешает.
Для примера: Солнце (die Sonne) в немецком -- женского рода, а Луна (der Mond) -- мужского, водка (der Wodka) -- тоже мужского, но девушка (das Mädchen) -- среднего.

"Запомните это, дэти, потому что понять это нэвозможно"!

Идея

До 2020 я работал в тревел-индустрии, но в середине года мой работодатель решил урезать расходы, и у меня стало много свободного времени (попросту говоря, меня уволили).
От безделья я наконец активно принялся за немецкий, а параллельно размышлял, не стоит ли поучиться и программировать.

Однажды, в очередной раз открывая словарь, чтобы посмотреть род какого-то слова, я подумал, а почему бы не написать мобильное приложение или бота, чтобы они регулярно присылали опрос с артиклями?

Заодно и технологии какие-нибудь по пути можно освоить.

Технологии

Насчет приложения я быстро понял, что это как-нибудь потом.
Зато бот выглядел реализуемо.

Писать я решил на Питоне, так как с ним уже пару раз встречался. Нашел пару сносно документированных библотек для работы с Telegram Bot API и остановился на Aiogram (просто понравилось слово "асинхронный" в названии).
Боту нужно где-то хранить список чатов и состояние для каждого из них. Сложной структуры данных не ожидалось, так что я решил использовать MongoDB.
Деплоить проект оказалось проще всего при помощи Docker (два контейнера, app & db, запускаемые через docker-compose).

Образ контейнера автоматически собирался Docker Hub из master-ветки на GitHub, после этого достаточно было скриптом на сервере скачать его и перезапустить контейнер. (Я пишу "было", тк недавно Docker отменил автобилды для бесплатных аккаунтов, я пока не придумал простой замены, собираю сам и пихаю в Docker Hub).

Что сделано

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

После первой пары недель кто-то из них заблочил бота, и из-за необработанного exception он зациклился и несколько часов рассылал опрос раз в минуту. После этого я освоил try/catch и юнит-тесты.

Потом, уже немного подучившись в программерском буткемпе, я добавил интервальное повторение (spaced repetition). Алгоритмов для него есть несколько, я реализовал самый простой: правильный ответ повышает score слова, а каждая ошибка -- снижает. Чем выше у слова score -- тем дальше отодвигается дата, когда его надо будет повторить.
Чтобы было не так скучно (повторять приходится много), под повторение отведена только половина опроса. Вторая половина -- новые слова, они выбираются из словаря по порядку: чем дальше -- тем более редкое слово.

Недавно вкрутил базовую статистику -- можно посмотреть, в каких словах чаще всего делаешь ошибки:

Более детальную статистику думаю показывать в браузере.

Что дальше

Сейчас ботом каждый день пользуются человек 40 (это активных подписок, из 90 чатов всего), из них я знаю примерно 7, остальные как-то сами пришли.
Текущий челендж -- без рекламы набрать 1000 активных пользователей. Принимаю идеи, как это сделать, пока что начал с Клуба :) Как думаете, стоит ли сделать пост на ProductHunt?

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

А, да, затраты и доходы!

  • Деньги ~0 (все мои проекты крутятся на одном droplet-е Digital Ocean за ~14 баксов в месяц).
  • Время -- пару недель в начале, потом спорадически по 2-3 часа в месяц.
  • Доходы: ценный опыт :)

В общем, если вы изучаете немецкий -- вилькоммен:
https://dasbot.yak.supplies/
И друзьям расскажите :) Спасибо!

UPDATE. Полторы недели спустя пользователей стало уже 250 (из них активных 150). Клуб работает! :)

Связанные посты
29 комментариев 👇
Alex Antsiferov , программирую автор 21 ноября 2021

Английский перевод тем временем добавлен, как и некоторые визуальные улучшения (типа артиклей в статистике и красных крестиков).
Интерфейсное решение пока такое: кнопка '?' рядом с кнопками артиклей.
Добавлять перевод ко всем словам подряд не хотелось бы -- там часто несколько значений, может оказаться много лишней информации.
Как вариант -- можно использовать инлайн-кнопку или добавить опцию в настройках "всегда показывать перевод". Послушаю отзывы и определюсь =)

Захар Кириллов , Амбассадор ЕРАМ в Клубе 11 ноября 2021

Это гениально!
Артикли — мой бич. На телефоне у меня всегда программа для тренировки артиклей, но дома я редко прикасаюсь к телефону. А вот телега всегда запущена.

Порекламирую завтра внутри компании.

Фича-реквест-1: почему-то если я правильно отвечаю, то ставит красивую зеленую галочку. А когда неправильно — просто текст. Почему нет красного кружка или крестика?

Фича-реквест-2: хочется либо приболдить слова для которых надо подбирать артикль, либо вообще радикально упросить подачу и начиная со второго (подхода или вопроса — обдумать) вместо полного "1/10. What's the article for Prozent?" спрашивать "1/10: ... Prozent?"

Фича-реквест-3: я хочу по чуть-чуть слов (круто что есть настройка на 5...50 слов!), но регулярно: например, в рабочие дния каждый час с 9 до 17 по 10 слов или там каждые 2 часа. Раз в день для сидящего за компом — мало.

Рекламу можно было бы вкрячить если отвечаешь правильно только на 6 из 10 или меньше.

Куда рубль заносить?

  Развернуть 1 комментарий

@zahhar, вау, спасибо за фидбэк и долор!

  • Про более краткую формулировку вопроса (или болд) и красный крестик -- согласен, что-то такое просится! Покручу в ближайшее время и посмотрю, как оно будет выглядеть.

  • Насчет более частых интервалов -- запрос интересный, реализацию надо обдумать... время опроса сейчас требует небольшой доработки для правильной поддержки таймзоны, мб заодно и кастомные интервалы сделаю. Еще надо придумать, как это в настройках отображать.

Короче, реквесты записал в книжечку :)

Показ рекламы двоечникам -- идея :) заодно и мотивация!

  Развернуть 1 комментарий

@wetterkrank, накину ещё чутка.

Сегодня дошел до статистики и как-то я не сразу врубился, что тут показываются слова, где я сделал ошибки.

  1. Я не увидел смысла для себя лично в разделении на слова за последние 30 дней и за всё время. У тебя же всё равно там интервальный алгоритм, который, если я правильно понимаю, берет самые старые из неправильных слов и подсовывает их мне в ближайшей сессии? В любом случае, я бы предпочёл видеть простой топ-10 проблемных слов.

  2. Более важное: этот топ-10 проблемных слов я бы хотел видеть вместе с правильными артиклями: das Deutsch, der Aspekt (артикли можно даже приболдить) — чтобы посещение статистики хоть чуточку контрибутило в запоминание. Увидеть правильно написанное слово важно, как мне кажется.

  3. Общий свой прогресс я бы хотел видеть в % от общего числа слов: 1% (19 out of 1836 touched)

  Развернуть 1 комментарий

@zahhar, привет!

Простой общий топ через некоторое время становится менее полезен. Например, в каких-то словах я часто ошибался, но наконец как-то их уложил в голове и перестал. Появились новые, но в едином топе их может быть долго не видно. Поэтому все же лучше разбить на recent и all-time.

По остальным двум пунктам согласен с тобой, просто поленился =)

  Развернуть 1 комментарий

До кучи ещё можно режим обратного запоминания - ты ему слово, он тебе артикль. Поможет при написании писем.

  Развернуть 1 комментарий

@Cooch, привет! ну это уже совсем другое приложение получается! :)

Для такого у меня, кстати, есть нейросеточка, натасканная на немецкие артикли: https://genderful.yak.supplies/
Она игрушечная, зато умеет слова с ошибками и ненастоящие :)

  Развернуть 1 комментарий

@wetterkrank, интересная идея

  Развернуть 1 комментарий

@Cooch, ты ему слово → оно тебе назад артикль в целом да, имеет смысл. Особенно если оно сразу же одновременно подскажет и все падежные варианты артиклей → для начинающих может иметь смысл когда ты не знаешь когда die в der переходит.

@wetterkrank, можно подумать ещё над такой механикой: оно даёт сразу комбинацию "das Frau" и предлагает Richtig oder Falsch.

Или варик, когда надо именно что впечатать артикль — чтобы запоминать не только визуально, но и тактильно. Это будет полезно когда не отдельные слова изучаешь, а сразу короткие примеры использование, например "Mit mein... Ehefrau"

  Развернуть 1 комментарий

@zahhar, да, идея с примерами мне тоже нравится.
Меня еще спрашивали насчет подсказок -- чтобы можно было посмотреть значение слова или контекст.
Нужен какой-то источник контекста -- простых предложений, где будет нужное слово не в именительном падеже.

А чтобы подсмотреть артикль, я обычно пользуюсь Leo (dict.leo.org). Там и склонения/спряжения/примеры и прочее есть. Хотя UI не идеал, конечно =)

  Развернуть 1 комментарий
Alex V , ORM (интернет репутация) 15 ноября 2021

Спасибо! Буду пробовать, тож начал немецкий осваивать. Единственная просьба - если бы он еще переводы для слов сразу говорил, было бы вообще круто. Можно на английском.
Типа "6/10. What's the article for Mensch (human)?"

Еще раз спасибо!

  Развернуть 1 комментарий

@MyDen, да, подсказки с переводом и, возможно, контекстом будут! это пока самый популярный запрос =)

  Развернуть 1 комментарий
Yury Katkov , миддл формошлёп 21 ноября 2021

Подход использовать бота явно перспективный, мы ведь воспринимаем его как собеседника. Сразу напрашивается чтобы он тебя теребил несколько раз в день по всяким лингвистическим поводам.

  Развернуть 1 комментарий
Андрей Серов , пишу всякое, иногда автоматизирую препресс 15 ноября 2021

Два долора! :)
Присоединюсь практически ко всем хотелкам, которые выразил выше @zahhar.
Ну и перевод тоже круто было бы видеть, типа режим "для вспоминающих немецкий".

  Развернуть 1 комментарий
Olexiy Kyrychenko , Fullstack Программист 16 ноября 2021

Ещё бы разные падежи 🙏

Всё время путаю ich gehe in den Park, ich bin im (in dem) Park

Для Plural свои окончания по падежам снова

Может другой бот, я бы с радостью пользовался и даже помог бы написать

  Развернуть 1 комментарий

@olexiy, думаю над этим! самое главное -- это найти источник готовых предложений.

  Развернуть 1 комментарий

Классная идея и прикольно работает. Я прошел всё за два дня, и когда приближается к концу, то появляется такой баг: при настройке выдавать 50 слов выдает только 25. Наверное, на таких наркоманов как я это не было рассчитано и что-то пошло не так, но тем не менее.

  Развернуть 1 комментарий

@NikolayLukin, ЗА ДВА ДНЯ? %-O

  Развернуть 1 комментарий

@wetterkrank, ну да, я просто пытался на 50 словах не допустить ошибку и у меня долго не получалось, а когда получилось было уже за 1000 и я решил допроходить

  Развернуть 1 комментарий

@NikolayLukin, а также спасибо за репорт :)
Баг уже заведен, на это поведение уже жаловался один маньяк. Но у него пару месяцев все-таки заняло!
У меня еще не сделана обработка ситуации, когда все слова успешно повторены. Я считал, что у меня еще с полгода есть до этого момента, но теперь че-то не уверен.
Короче, в ближайшее время исправлю, спасибо!

  Развернуть 1 комментарий
Орхан Мамедов , Код писат, деплой делат 5 декабря 2021

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

  Развернуть 1 комментарий

@0p3xh7, оо, вот это было бы очень здорово!
Я недавно узнал про GH Actions и сделал воркфлоу для прогона тестов, но на сборке и публикации контейнера подзастрял.
Стукнусь к тебе в телеграме в ближайшее время, спасибо!

  Развернуть 1 комментарий

Я вам тут немного испорчу малину, но есть же приложение Anki. Не могу преставить, что можно придумать что-то лучше и универсальнее.

Вот ссылка ну уже имеющиеся ресурсы для немецкого - https://ankiweb.net/shared/decks/german

  Развернуть 1 комментарий

@nedden, спасибо, знаю про Anki, просто как-то не удалось найти подходящее приложение. то карточки руками добавлять, то стоит 25 евро =)

  Развернуть 1 комментарий

@nedden, Анки увы вот вообще не вариант. Учить при помощи Анки — только убивать мотивацию, на мой взгляд.

Анки начинется с того, что её надо скачивать и устанавливать (wft в 21 веке?), я уж молчу что тебе в комп приезжает 500 МБ совершенно отвратительного интерфейса.

Дальше ты продираешься через этого говноинтерфейс с кучей кнопочек и формочек, делая всё что угодно, кроме как собственно изучения.

Анки может пинать меня когда пора позаниматься? Нет. Всёпока, я о ней забыл.

  Развернуть 1 комментарий

@zahhar, во всех современных мобильных ос есть прекрасное приложение reminder - рекомендую! Анки дает возможность создать свою систему изучения чего угодно или начать учить прямо СЕЙЧАС скачав уже готовый словарь. И да я разобрался в этом говноинтерфейсе без каких-то проблем и учу слова.

  Развернуть 1 комментарий

@nedden, ты молодец, что разобрался с Анки и учишь слова!

А вот коммент твой первый про Анки — он уничижительный и обесценивающий. Ты написал, будто автор и поддерживающие его идею страдают какой-то ерундой бесполезной, зря тратя время на решение задачи, для которой уже есть ультимативное всех устраивающее решение. Не надо так.

Все учат язык по-своему, инструментов должно быть много — хороших и разных. Тебе вот зашли Анки, кому-то другому — Квизлет, третьим подойдёт DasBot. И без необходимости заводить ещё один ремайндер в телефоне.

  Развернуть 1 комментарий

@nedden, @zahhar, друзья, не ссорьтесь! :) Действительно, у всех разные юзкейсы, и одному нравится арбуз, другому свиной хрящик!
Бот в принципе появился как проект для изучения программирования =) У него нашлись пользователи, и это замечательно. Автору будет полезно ощущать ответственность за сделанную и несделанную работу =)

  Развернуть 1 комментарий

очень круто, спасибо!

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб