# FST-этап: расширение словаря словоизменением (GiellaLT myv)

Поднимает охват клавиатурного словаря на порядок за счёт **сгенерированных, а не выдуманных**
словоформ: открытый морфологический FST GiellaLT `myv` (Rueter и др.) даёт парадигмы наших лемм, а
наш выверенный `valks_conv.cyr_to_new` переводит их в новую графику.

## Статус: КОНВЕЙЕР ДОКАЗАН end-to-end (2026-06-21)

Поднято и измерено в WSL (Ubuntu, без sudo):
- тулчейн установлен (pyhfst + пребилт-FST `myv`); анализатор и генератор работают;
- **покрытие FST = 76%** наших лемм (выборка 3000): из распознанных N 54% · V 31% · A 9%;
- генерация даёт корректные парадигмы (`кудо → кудонь, кудосо, кудос, кудова, кудокс…`);
- **end-to-end на выборке:** 260 существительных → ~6 форм/лемму (только ядро падежей) →
  **1513 новых форм** в новой графике (нет в текущем словаре).

**Экстраполяция:** ~17 000 лемм распознаёт FST; существительных ~9 000 × ~6 новых форм ≈ ~50 тыс.
новых форм только по ядру существительных; глаголы (спряжение) добавят кратно больше. Итог —
**словарь вырастет в несколько раз** (с 34k), E1 на реальном словоизменённом тексте поднимется
существенно (точную цифру даст полный прогон + перемер).

## Установка тулчейна (WSL, без sudo)
```bash
mkdir -p ~/fst && cd ~/fst
U='https://apertium.projectjj.com/apt/nightly/pool/main/g/giella-myv/giella-myv_0.2.0+g3745~49d18396-1~sid1_all.deb'
curl -sS -o myv.deb "$U"                     # ~97 МБ; версия в имени может обновиться — взять свежую из pool/
mkdir -p x && dpkg-deb -x myv.deb x          # без root; FST -> x/usr/share/giella/myv/*.hfstol
pip3 install --user --break-system-packages pyhfst
```
FST в git НЕ кладём (97 МБ); качается заново по этой команде.

## Запуск генерации
```bash
# проба (быстро):
PYTHONUTF8=1 python3 keyboard/fst/fst_generate.py --limit 500
# полный прогон (долго, все ~22k лемм):
PYTHONUTF8=1 python3 keyboard/fst/fst_generate.py
# -> keyboard/fst/fst_forms_new.txt  (новые формы в новой графике)
```
Переменные среды: `MYV_FST` (путь к *.hfstol), `VALKS_ROOT` (корень проекта в WSL, по умолч.
`/mnt/c/.../FNL/VALKS`).

## Рецепт генерации (выверен)
- анализ: `analyser-gt-desc.hfstol`, лемма(кир) → `лемма+POS+...` (POS = N/V/A).
- генерация: `generator-gt-norm.hfstol`. Существительные — число **`SP`** (Sg/Pl-неспециф.) для
  косвенных падежей (НЕ `Sg` — он даёт только Nom), `+Indef/+Def`; падежи: Nom Gen Dat Abl Ine Ela
  Ill Lat Prl Comp Tra Abe. Глаголы — индикатив, субъектное спряжение (объектное = взрыв, в v1 не берём).
- конвертация кир→новая: `valks_conv.cyr_to_new` (выверена носителем).

## Что осталось (полноценный этап)
1. Полный прогон по всем распознанным леммам (N+V+A, полные парадигмы); решить охват глагола
   (объектное спряжение/посессив — скоупить, чтобы не взорвать объём).
2. Дедуп `fst_forms_new.txt`, влить в `kbd_build.py` как источник `fst` (приоритет ниже лемм),
   пересобрать словарь, **перемерить E1** (`kbd_eval.py`).
3. Выверка носителем выборки (FST местами over-генерит редкие ячейки); диал./Паасонен-леммы FST не
   знает (24% непокрытых) — для них охват не растёт.
4. Скрипты: `fst_generate.py` (этот), вход `lemmas_cyr.txt` (22 354 чистых леммы).
