Датасет и обучение: класс «люб. дубляж», раскладка многотиповых строк, язык из «Аудио», строки из «Аудио», потолок повторов, веса классов
docker / build (push) Successful in 1m40s

- harvest_core: дубляж — тип, а не часть имени студии; split_multi_rows; audio_only_rows; kinozal сопоставляет все аудиодорожки
- prepare_data: --max-dup, отсев остатков многотиповых строк
- train: веса классов (корень из обратной частоты, потолок 4), --no-class-weights
- исправлены регулярки с \b, записанные как символ BS (predict.py, audio18.py)
- PARSE_VERSION 3: кэш разбора сбрасывается
- docs/dataset.md, docs/api-reference.md обновлены

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
DenozordecandClaude Sonnet 5.5 committed 2026-10-29 18:13:07 +07:00
1 parent e648415719
commit 05537ac9e9
10 files changed
+233 -23

No files matched your search

+7 -1
View File
@@ -86,7 +86,12 @@
Поле `lang` описывает только язык дорожки; `role` и `lang` не зависят от `translation_type`.
### translation_type: 14 классов
### translation_type: 14 классов (15 после переобучения на пересобранных данных)
> После пересборки датасета (см. [dataset.md](dataset.md)) добавляется класс `люб. дубляж` — любительский
> дубляж; модели, обученные раньше, его не возвращают и по-прежнему отдают 14 классов из списка ниже.
> Источник истины для конкретной модели — `GET /health` → `classes`; клиенту безопасно сопоставлять по подстроке
> (`дубляж` → дубляж), как описано ниже: `люб. дубляж` её содержит.
Точные строки (регистр, пробелы и точки после префикса — как есть; сортировка — по алфавиту, так их
возвращает `GET /health` → `classes`):
@@ -109,6 +114,7 @@
| Значение | Кто озвучивал | Вид |
|---|---|---|
| `проф. дубляж` | профессиональная студия | дубляж (речь актёров заменяет оригинал; в страницах «Дублированный») |
| `люб. дубляж` | любительская озвучка | дубляж/псевдодубляж; только в моделях, обученных после пересборки датасета |
| `проф. многоголосый` | профессиональная студия | закадровый, три и более голоса |
| `проф. двухголосый` | профессиональная студия | закадровый, два голоса |
| `проф. одноголосый` | профессиональная студия | закадровый, один голос |
+27 -6
View File
@@ -10,10 +10,13 @@
регулярками** — модель учится воспроизводить эту разметку и обобщать её на
новые формулировки.
Снимок: 3286 строк, 3 источника — rutracker 1660, nnm 1549, kinozal 77.
После подготовки: 3284 строки + 458 аугментированных морфологических
вариантов («многоголосое», «дублированное» и т.п.), всего 3742 обучающих
примера. Файлы `*_entries.csv` / `*_releases.csv` — те же данные в нарезке
Размер (на момент последней сборки): ~41 тыс. строк из ~28 тыс. релизов, 3 источника
(rutracker, nnm, kinozal); HTML-дамп страниц — `data/raw` (~32 тыс. файлов, ≈2.6 ГБ, в git не
хранится), разобранные тексты — `data/pages`. Точные числа показывает «Статистика датасета» в
`tools/collect.py` (пункт 3) и отчёт `reports/data_audit.md` после `prepare_data`.
Ранние цифры этого документа (3286 строк) относились к первому снимку.
К строкам при подготовке добавляются аугментированные морфологические варианты
(«многоголосое», «дублированное» и т.п.). Файлы `*_entries.csv` / `*_releases.csv` — те же данные в нарезке
по источникам и по релизам; модель используется только `labels.csv`.
## Колонки labels.csv
@@ -40,9 +43,11 @@
`raw` берётся `role_raw` конкретной дорожки, чтобы одинаковый текст не
получал разные метки).
## Семантика translation_type (14 классов)
## Семантика translation_type (15 классов после пересборки; 14 в ранних моделях)
Составные метки «кто делал × сколько голосов»:
Составные метки «кто делал × сколько голосов». Набор классов не зашит в код: `prepare_data` берёт его
из данных (`label_maps.json`), поэтому модель, обученная до пересборки, знает 14 классов, а после —
ещё и `люб. дубляж`.
* префикс: `проф.` (профессиональная), `люб.` (любительская), `авт.`
(авторская), без префикса — в тексте не указано;
@@ -52,6 +57,22 @@
Все «*неизвестно»-варианты объединены в `неизвестно`; типы «оригинал» и
«субтитры» (1–2 строки-проскока генератора) удалены.
### Что изменено в разметке (парсеры `tools/harvest/harvest_core.py`, `PARSE_VERSION = 3`)
| Проблема в старых метках | Исправление |
|---|---|
| Любительский дубляж («Любительский (дублированный) Red Head Sound», «псевдодублированный») размечался как `проф. дубляж` (644 из 720 строк) | Новый класс `люб. дубляж` |
| Дубляж по имени студии: «многоголосый … Дубляжная», «Продубляж» получали тип «дубляж» | «дубляж» считается типом, только если это отдельное слово или «дублир…» |
| Несколько дорожек в одной строке с одной меткой («Профессиональный (двухголосый закадровый), авторский (одноголосый закадровый)»; 7.3% строк) | `split_multi_rows`: строка раскладывается на дорожки теми же правилами, что и сервис (`src/html_extract._split_entries`); «Многоголосый, профессиональный - LostFilm» остаётся одной дорожкой. Остатки старых данных `prepare_data` отбрасывает (счётчик в аудите) |
| Язык почти не размечался (122 строки `UKR`, 47 `ENG`): kinozal сопоставлял «Перевод» только с русскими аудиодорожками, а в строках `\|Дубляж, Le Doyen\|` студия читалась как одно имя | Сопоставление со всеми аудиодорожками; язык берётся из строки «Аудио»; `src/trackinfo.parse_audio_line` делит `\|Тип, Студия\|` |
| Дорожки, названные только в строках «Аудио» (украинский дубляж и т.п.) терялись | `audio_only_rows`: строки с блоком `\|…\|`, студией и определимым типом (оригинал, комментарии, источники вроде «Blu-ray CEE» не берутся) |
| Одни и те же короткие строки доминировали («Перевод: Дублированный» — 2727 копий) | `prepare_data --max-dup` (по умолчанию 40 копий одного текста и типа) |
| Дисбаланс классов | Веса классов в потерях типа: корень из обратной частоты, потолок 4 (`--no-class-weights` отключает; значение записывается в `run.json`) |
Для применения к уже собранным данным нужна переиндексация с пересчётом меток
(`python tools/collect.py` → пункт 2 → «Переиндексировать data/raw … y»): старые строки
`labels.csv` заменяются, копия прежнего файла сохраняется как `data/labels.bak_<время>.csv`.
## Аудит (reports/data_audit.md) и что с находками сделано
| Находка | Обработка |