docker / build (push) Successful in 39s
README: метрики модели 02.11.2026 (test 4 377 строк, e2e по трекерам), размер датасета, kinozal-вкладки. dataset.md: размер снимка, колонки studio_source и audio_raw. architecture.md: кодек-строки как позитивы сегментатора, E2E_MODEL. collecting.md: tools/audit_tracks.py. training-windows.md: доразметка, сравнение кандидата и постановка в models/best и Docker. plan.md: шаг «аудит дорожек». Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
96 lines
11 KiB
Markdown
96 lines
11 KiB
Markdown
# Датасет
|
||
|
||
## Откуда берётся
|
||
|
||
`data/labels.csv` — снимок датасета, собранного пайплайном
|
||
`deepseek-harness/default-workspace/dataset.py`: системный Chrome по CDP
|
||
обходит релизы трекеров, из страницы извлекается вкладка описания (kinozal),
|
||
пост (rutracker, nnm), регулярки разбирают строки дорожек, а имена авторов
|
||
канонизируются словарём алиасов. **Метки автоматически сгенерированы
|
||
регулярками** — модель учится воспроизводить эту разметку и обобщать её на
|
||
новые формулировки.
|
||
|
||
Размер (снимок 02.11.2026): 55 324 строки из 27 900 релизов, 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
|
||
|
||
| Колонка | Смысл | Использование моделью |
|
||
|---|---|---|
|
||
| `source`, `release_id` | трекер и id релиза | группировка сплитов |
|
||
| `raw` | строка дорожки целиком (с префиксом «Перевод:»/«Аудио N:») | **вход** (после снятия префикса) |
|
||
| `translation_type` | тип озвучки | **метка 1** |
|
||
| `studio` | автор («(не указана)» если нет) | **метка 2** (спан в тексте) |
|
||
| `age_18`, `note` | флаг/пометка 18+ | **метка 3** |
|
||
| `role_raw` | скобочная часть / конкретный тип из перечисления | вход для nnm tech-строк |
|
||
| `studio_source` | откуда взята строка: `release` / `tech` (описание релиза / техданные, в т.ч. nnm «Перевод:»), `codec` (кодек-строка «Аудио N: … (MVO, LostFilm)»), `title` (заголовок kinozal), `audio` (только строка «Аудио»), `manual` (ручная разметка) | не используется; `codec` не попадает в словарь студий `codec_line_rows` |
|
||
| `audio_raw` | кодек-строка той же дорожки целиком | разметка строк для сегментатора |
|
||
| остальные (`ru_title`, `codec`, …) | контекст релиза | не используются |
|
||
|
||
## Форматы входа по источникам
|
||
|
||
* **rutracker**: `raw` = тело после «Перевод N:» («Профессиональный
|
||
(двухголосый закадровый) tycoon»); несколько дорожек уже разнесены по строкам.
|
||
* **kinozal**: `raw` = строка целиком с префиксом («Перевод: Дублированный |
|
||
HDRezka Studio»); префикс снимается при подготовке.
|
||
* **nnm**: два вида строк — «Аудио N: Opus, 6 ch, 221 Kbps \| Русский AVO
|
||
(Дмитрий Пучков)» (автор в скобках) и «Перевод: Одноголосый, многоголосый
|
||
закадровый» (одна строка на несколько дорожек; при подготовке вместо общей
|
||
`raw` берётся `role_raw` конкретной дорожки, чтобы одинаковый текст не
|
||
получал разные метки).
|
||
|
||
## Семантика translation_type (15 классов после пересборки; 14 в ранних моделях)
|
||
|
||
Составные метки «кто делал × сколько голосов». Набор классов не зашит в код: `prepare_data` берёт его
|
||
из данных (`label_maps.json`), поэтому модель, обученная до пересборки, знает 14 классов, а после —
|
||
ещё и `люб. дубляж`.
|
||
|
||
* префикс: `проф.` (профессиональная), `люб.` (любительская), `авт.`
|
||
(авторская), без префикса — в тексте не указано;
|
||
* вид: `дубляж`/`дублированный`, `многоголосый`, `двухголосый`,
|
||
`одноголосый` (обычно закадровые), `неизвестно`.
|
||
|
||
Все «*неизвестно»-варианты объединены в `неизвестно`; типы «оригинал» и
|
||
«субтитры» (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) и что с находками сделано
|
||
|
||
| Находка | Обработка |
|
||
|---|---|
|
||
| Из 3286 строк уникальных текстов ~2000, 377+ строк повторяются в разных релизах | Сплиты группируются не только по релизу, но и по тексту — одинаковые строки не попадают одновременно в train и test |
|
||
| 26 «мусорных» studio («лицензия R5», «+ вставки», «x4», суффиксы «ненормативная лексика») | Считаются «автора нет»; суффиксы дополнительно чистятся в словаре алиасов |
|
||
| Слитые дорожки (одна строка = несколько типов) | nnm решается через `role_raw`; оставшихся противоречий — 0 |
|
||
| Спан автора не найден в тексте | 11 строк: автор в метке есть, но в тексте написан иначе; BIO-разметка для них пустая |
|
||
| 18+ | 156 строк (в 1 строке флаг есть только в note, в тексте не виден — недообучаемая) |
|
||
|
||
## Словарь алиасов (src/studio_norm.py)
|
||
|
||
Порт `STUDIO_ALIASES` генератора датасета: «hdrezka studio»→HDrezka,
|
||
«read head sound»→Red Head Sound, «гаврилов»→Андрей Гаврилов, инициалы
|
||
«ю. сербин»→Юрий Сербин и т.д. Поиск спана автора в тексте пробует по
|
||
порядку: точное вхождение → алиасы → фамилия/инициалы → гибкий шаблон
|
||
«слова через произвольные кавычки/разделители» (ловит «Студия «Кравец»,
|
||
LostFilm» и «SDI Media \| TV 1000»).
|