MorphoSyntaxTrening
MorphoSyntaxTrening
Интерактивный тренажёр морфосинтаксического анализа — веб-приложение для обучения школьников полному морфологическому разбору русских предложений.
Хакатон 2026 · Версия 4.0.1
Описание
Учитель создаёт тренажёры из предложений (вручную или из загруженной книги), назначает их группам учеников. Ученик входит по коду учителя и проходит тренажёр: кликает на слова и заполняет признаки по выбранному уровню сложности. После завершения — детальный разбор ошибок по каждому слову и каждому признаку.
Ключевые возможности
- Пять уровней сложности: от определения части речи до полного морфологического разбора с синтаксическими ролями
- Автоматический анализ через pymorphy3 + Natasha NLP; учитель правит разбор ИИ вручную
- Пошаговая оценка: звезда за каждый правильный признак (не за слово целиком)
- Светлая / тёмная тема с сохранением в localStorage
- Генерация предложений из загруженной книги (fb2 / txt)
- Статистика учеников и групп с фильтрами, экспорт CSV
- Рассылка приглашений по email (SMTP)
- Передача группы другому учителю по 6-значному коду — ученики и история результатов сохраняются
- Поделиться тренажёром — создаётся полная копия тренажёра на аккаунте коллеги
- Docker-деплой
Стек технологий
| Компонент | Технология |
|---|---|
| Backend | FastAPI + Starlette SessionMiddleware |
| ORM | SQLAlchemy (sync), SQLite |
| NLP | pymorphy3 (морфоанализ) + Natasha (NLP, синтаксис) |
| Frontend | Jinja2, vanilla JS, CSS (light/dark тема) |
| smtplib (SSL / STARTTLS) | |
| Деплой | Docker + docker-compose |
Уровни тренажёра
| Уровень | Что проверяется |
|---|---|
| Ознакомительный | Часть речи |
| Начальный | + начальная форма (лемма / инфинитив) |
| Базовый | + непостоянные признаки: наклонение, время, число, падеж, род… |
| Углублённый | + постоянные признаки (склонение, спряжение, вид, залог…) + синтаксическая роль |
| Продвинутый | Полный морфологический разбор: все признаки + члены предложения |
Роли и доступ
| Роль | URL | Описание |
|---|---|---|
| Администратор | /admin/ |
Управление учителями, настройки SMTP, смена пароля |
| Учитель | /teacher/ |
Группы, ученики, тренажёры, книга, статистика |
| Ученик | /student/ |
Вход по коду учителя, прохождение тренажёров |
Структура проекта
MorphoSyntaxTrening/
├── main.py # Все FastAPI-маршруты
├── models.py # ORM-модели (Teacher, Group, Student, Trainer, Sentence, TrainerResult)
├── morpho.py # pymorphy3 + Natasha, POS_COLORS, ALL_POS, SCORED_*_FEATURES
├── book.py # Парсинг и извлечение предложений из книги
├── smtp_settings.py # Загрузка/сохранение SMTP-настроек (instance/smtp_settings.json)
├── email_service.py # Отправка писем (приглашения, сброс пароля, тест)
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── start.sh # Точка входа контейнера (фиксит DNS Docker Desktop)
├── static/
│ └── style.css # CSS design system, light/dark тема
├── templates/
│ ├── base.html # Навигация, тема, flash-сообщения
│ ├── index.html
│ ├── about.html
│ ├── admin/ # dashboard, teachers, settings, login
│ ├── teacher/ # dashboard, groups, trainers, trainer_detail, book, stats, export
│ └── student/ # login, dashboard, exercise_full, results, stats
└── instance/
├── morpho.db # SQLite база данных
└── smtp_settings.json # SMTP-конфигурация
Запуск проекта
Требования
- Python 3.10+ (для локального запуска)
- Docker + Docker Compose (для запуска в контейнере)
1. Локальный запуск (без Docker)
Шаг 1 — клонировать репозиторий и перейти в папку проекта:
git clone <repo-url>
cd MorphoSyntaxTrening
Шаг 2 — создать и активировать виртуальное окружение:
# Windows
python -m venv venv
venv\Scripts\activate
# Linux / macOS
python3 -m venv venv
source venv/bin/activate
Шаг 3 — установить зависимости:
pip install -r requirements.txt
Шаг 4 — создать файл .env в папке MorphoSyntaxTrening/:
SECRET_KEY=your-secret-key-here
ADMIN_PASSWORD=admin
SECRET_KEY— секрет для подписи сессий (любая длинная случайная строка).
ADMIN_PASSWORD— пароль администратора при первом запуске (можно сменить позже).
Шаг 5 — запустить сервер:
uvicorn main:app --reload --port 5000
Открыть в браузере: http://localhost:5000
2. Запуск в Docker
Шаг 1 — создать файл .env (см. выше).
Шаг 2 — собрать и запустить контейнер:
docker-compose up --build
Открыть в браузере: http://localhost:5000
Для запуска в фоне:
docker-compose up -d --build
Остановить:
docker-compose down
Windows + Docker Desktop: если внутри контейнера не работает DNS (не скачиваются NLP-модели при первом запуске), это исправляется автоматически через
start.sh.
3. Первый вход
- Открыть http://localhost:5000/admin/login
- Логин:
admin, пароль — значениеADMIN_PASSWORDиз.env - На вкладке Учителя создать первого учителя
- На вкладке Безопасность настроить SMTP (нужен для отправки приглашений)
4. Деплой на сервере (Coolify / Docker)
Проект готов к деплою через Dockerfile без docker-compose.
Настройки в Coolify:
- Build Pack: Dockerfile
- Base Directory: /MorphoSyntaxTrening
- Dockerfile Location: /Dockerfile
- Ports Exposes: 5000
- Direction: Redirect www to non-www
Переменные окружения задаются в разделе Environment Variables (только значение, без KEY=):
| Переменная | Описание |
|---|---|
SECRET_KEY |
Секрет сессий — задайте длинную случайную строку |
ADMIN_PASSWORD |
Пароль администратора |
Важно: не используйте
url_for()для CSS — за reverse-proxy генерируется неверный URL. В шаблонах путь задан статически:/static/style.css.
SMTP (email)
Настраивается через интерфейс администратора (/admin/settings).
Яндекс:
- Хост: smtp.yandex.ru, порт 465, тип SSL
- Логин: полный адрес ящика (user@yandex.ru)
- Пароль: пароль приложения (не пароль от аккаунта) — создаётся на id.yandex.ru
- В настройках почты должен быть включён IMAP
Mail.ru: хост smtp.mail.ru, порт 465, SSL, пароль приложения
Gmail: хост smtp.gmail.com, порт 587, STARTTLS, пароль приложения (2FA обязательна)
Совместная работа учителей
Передача группы
На странице Ученики у каждой группы есть кнопка «↗ Передать». Введите 6-значный код коллеги — группа переходит на его аккаунт. Связи с тренажёрами текущего учителя удаляются, история результатов учеников сохраняется.
Поделиться тренажёром
На странице тренажёра в боковой панели введите код коллеги и нажмите «Поделиться». На аккаунте коллеги создаётся полная независимая копия тренажёра со всеми предложениями и разбором — он может редактировать её самостоятельно.
Известные особенности
- Менеджер паролей в браузере не срабатывает на странице входа ученика — поле пароля создаётся динамически через JS
- Docker Desktop / Windows — DNS внутри контейнера исправляется через
start.sh(перезаписывает/etc/resolv.confна8.8.8.8) - bcrypt должен быть версии
<4.0— passlib 1.7.4 несовместим с bcrypt ≥ 4.0 - CSS должен подключаться через относительный путь
/static/style.css, а не черезrequest.url_for()— за reverse-proxy генерируется неверный URL
Части речи
Существительное · Прилагательное · Глагол · Наречие · Местоимение · Предлог · Союз · Частица · Причастие · Деепричастие · Числительное · Междометие
Каждая часть речи имеет уникальный цвет, используемый во всём интерфейсе.