Files
DenozordecandClaude Opus 5.5 89ffe4375b
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>
2026-11-02 21:55:43 +07:00

96 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Датасет
## Откуда берётся
`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»).