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 <[email protected]>
This commit is contained in:
1 parent
588b1f1579
commit
89ffe4375b
6 files changed
+40
-18
No files matched your search
@@ -76,19 +76,21 @@ docs/ документация
|
|||||||
|
|
||||||
## Качество
|
## Качество
|
||||||
|
|
||||||
Held-out test (645 строк, группировка по релизам и текстам; полная таблица и
|
Held-out test (4 377 строк, группировка по релизам и текстам; модель
|
||||||
графики — [reports/summary.md](reports/summary.md)):
|
`models/runs/20261102_190555_basecodec`, обучена 02.11.2026 на `labels.csv` со студиями из
|
||||||
|
кодек-строк; сравнение моделей — `python -m src.runs`):
|
||||||
|
|
||||||
| модель | type acc | type macro-F1 | span exact | 18+ acc | joint exact |
|
| модель | type acc | type macro-F1 | span exact | 18+ acc | lang acc | joint exact |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|
|
||||||
| rubert-tiny2 | 0.991 | 0.970 | 0.918 | 1.000 | 0.915 |
|
| **ruBert-base (models/best)** | **0.978** | **0.903** | **0.922** | **1.000** | **0.997** | **0.906** |
|
||||||
| **ruBert-base (models/best)** | **0.994** | 0.966 | **0.950** | **1.000** | **0.946** |
|
|
||||||
|
|
||||||
* joint exact — строка распознана полностью (тип + автор + 18+).
|
* joint exact — строка распознана полностью (тип + автор + 18+).
|
||||||
* E2E на сохранённых страницах релизов: rutracker — precision 0.83 / recall 0.98
|
* Тест-сплит пересобирается вместе с датасетом, поэтому цифры разных снимков напрямую
|
||||||
по парам (тип, автор); kinozal-текстовые дампы содержат только тех-вкладку
|
не сравниваются (ранние 0.946 — на тесте из 645 строк). rubert-tiny2 на текущем
|
||||||
без авторов (автор подгружался на сайте через JS), поэтому там автор
|
датасете не переобучалась.
|
||||||
недоступен в принципе.
|
* E2E по релизам (`tests/e2e_segmenter.py`, по 400 тестовых страниц на трекер, пары
|
||||||
|
тип + студия, precision / recall): kinozal 0.766 / 0.879, rutracker 0.877 / 0.870,
|
||||||
|
nnm 0.838 / 0.825.
|
||||||
* ONNX-экспорт эквивалентен PyTorch на 100% строк test — [reports/onnx_parity.md](reports/onnx_parity.md).
|
* ONNX-экспорт эквивалентен PyTorch на 100% строк test — [reports/onnx_parity.md](reports/onnx_parity.md).
|
||||||
* Smoke на формулировках, которых нет в датасете: тип 9/10, 18+ 10/10,
|
* Smoke на формулировках, которых нет в датасете: тип 9/10, 18+ 10/10,
|
||||||
автор 5/10 (полное извлечение автора на непривычных форматах записи —
|
автор 5/10 (полное извлечение автора на непривычных форматах записи —
|
||||||
@@ -99,14 +101,14 @@ Held-out test (645 строк, группировка по релизам и т
|
|||||||
* Метки датасета сгенерированы регулярками (пайплайн deepseek-harness) — метрики
|
* Метки датасета сгенерированы регулярками (пайплайн deepseek-harness) — метрики
|
||||||
измеряют согласование с этой разметкой; ценность модели — обобщение на новые
|
измеряют согласование с этой разметкой; ценность модели — обобщение на новые
|
||||||
формулировки без сопровождения регулярок.
|
формулировки без сопровождения регулярок.
|
||||||
* Источники несбалансированы (rutracker 1658 / nnm 1549 / kinozal 77 строк).
|
* Датасет: 55 324 строки из 27 900 релизов (kinozal 21 766 / nnm 18 363 / rutracker 15 195).
|
||||||
* Извлечение автора уверенно работает на форматах записи, представленных в
|
* Извлечение автора уверенно работает на форматах записи, представленных в
|
||||||
датасете (имя после типа через разделитель, в скобках у AVO/MVO/DVO-дорожек,
|
датасете (имя после типа через разделитель, в скобках у AVO/MVO/DVO-дорожек,
|
||||||
после тире); на непривычных форматах («Одноголосый закадровый (Фамилия)»)
|
после тире); на непривычных форматах («Одноголосый закадровый (Фамилия)»)
|
||||||
модель может не выделить имя — span остаётся пустым, тип при этом верный.
|
модель может не выделить имя — span остаётся пустым, тип при этом верный.
|
||||||
* kinozal-страницы: авторы озвучки подгружаются на сайте JavaScript-ом; в
|
* kinozal-страницы: авторы озвучки лежат во вкладках, которые сайт подгружает
|
||||||
статическом HTML и текстовых дампах их нет — модель их не увидит (это
|
JavaScript-ом. По `url` сервис скачивает их сам (`fetch_html`, `showtab`); в
|
||||||
ограничение данных, не модели).
|
присланном `html`/`text` без этих вкладок студий может не быть.
|
||||||
* Классы с 1–8 примерами почти не выучиваются (видно в macro-F1 и confusion
|
* Классы с 1–8 примерами почти не выучиваются (видно в macro-F1 и confusion
|
||||||
matrix); морфологическая аугментация (458 вариантов: «многоголосое» и т.п.)
|
matrix); морфологическая аугментация (458 вариантов: «многоголосое» и т.п.)
|
||||||
частично закрывает этот пробел.
|
частично закрывает этот пробел.
|
||||||
@@ -81,15 +81,19 @@ BIO-разметка строится по символьным спанам ч
|
|||||||
«Релиз», `segmenter.page_text`): в `data/pages/kz-*.txt` нет ни заголовка, ни
|
«Релиз», `segmenter.page_text`): в `data/pages/kz-*.txt` нет ни заголовка, ни
|
||||||
«Техданных», откуда взята половина меток kinozal, а сервис (`fetch_html`)
|
«Техданных», откуда взята половина меток kinozal, а сервис (`fetch_html`)
|
||||||
видит обе вкладки.
|
видит обе вкладки.
|
||||||
* Кодек-строка русской дорожки («Аудио 3: AC3 … Русский (MVO, LostFilm)»,
|
* Кодек-строки со студией с 02.11.2026 размечены сами (`studio_source=codec`, см.
|
||||||
«Аудио Rus: … | LostFilm»), не попавшая в разметку, в обучение не идёт
|
`docs/collecting.md`): их `raw`/`audio_raw` дают позитивы. Кодек-строка русской
|
||||||
|
дорожки («Аудио 3: AC3 … Русский (MVO, LostFilm)», «Аудио Rus: … | LostFilm»),
|
||||||
|
не попавшая в разметку, в обучение не идёт
|
||||||
(метка -1): у rutracker `raw` — строка «Перевод N:», и как негатив она учила
|
(метка -1): у rutracker `raw` — строка «Перевод N:», и как негатив она учила
|
||||||
модель отбрасывать кодек-строки — а на kinozal студии только в них.
|
модель отбрасывать кодек-строки — а на kinozal студии только в них.
|
||||||
* В `predict_release` выбранные моделью кодек-строки — второстепенный источник
|
* В `predict_release` выбранные моделью кодек-строки — второстепенный источник
|
||||||
(`source: codec`): подключаются, только если у какой-то дорожки страницы нет
|
(`source: codec`): подключаются, только если у какой-то дорожки страницы нет
|
||||||
студии; если других строк нет (nnm), они и есть дорожки.
|
студии; если других строк нет (nnm), они и есть дорожки.
|
||||||
* e2e: `tests/e2e_segmenter.py [каталог]` — пары (тип, студия) на тестовых
|
* e2e: `tests/e2e_segmenter.py [каталог]` — пары (тип, студия) на тестовых
|
||||||
страницах, не больше `E2E_MAX` (400) на трекер; `--train-pages` — ещё и train.
|
страницах, не больше `E2E_MAX` (400) на трекер; `--train-pages` — ещё и train;
|
||||||
|
основная модель — `E2E_MODEL` (по умолчанию `models/best`), например
|
||||||
|
`set E2E_MODEL=models/runs/<запуск>` перед запуском, чтобы сравнить кандидата.
|
||||||
* Нарезка ВНУТРИ строки («Дублированный, многоголосый») в данных не размечена
|
* Нарезка ВНУТРИ строки («Дублированный, многоголосый») в данных не размечена
|
||||||
(91 группа из 6735) — остаётся на правилах `_split_entries`, но только на
|
(91 группа из 6735) — остаётся на правилах `_split_entries`, но только на
|
||||||
строках, выбранных моделью.
|
строках, выбранных моделью.
|
||||||
|
|||||||
@@ -163,6 +163,11 @@ id разных трекеров не пересекались. Коллизий
|
|||||||
студия. +6 428 строк в 2 862 релизах (kinozal 3 444, nnm 1 609, rutracker 1 375). Аудит,
|
студия. +6 428 строк в 2 862 релизах (kinozal 3 444, nnm 1 609, rutracker 1 375). Аудит,
|
||||||
откуда взялась доработка: `reports/tracks_audit.md`.
|
откуда взялась доработка: `reports/tracks_audit.md`.
|
||||||
|
|
||||||
|
Повторить аудит дорожек по `data/raw` (сколько студий из кодек-строк, «Перевод:»
|
||||||
|
и заголовков не попало в метки, мусор в колонке студий, форматы, которые не ловят регулярки):
|
||||||
|
`.venv\Scripts\python tools\audit_tracks.py` → `reports/tracks_audit_numbers.md`
|
||||||
|
(`--cache путь.pkl` ускоряет повторный запуск). Выводы и план — `reports/tracks_audit.md`.
|
||||||
|
|
||||||
Сборщик делает это при переиндексации. Для уже собранного `labels.csv` без пересборки
|
Сборщик делает это при переиндексации. Для уже собранного `labels.csv` без пересборки
|
||||||
страниц: `.venv\Scripts\python tools\relabel_studios.py` (копия — `data/labels.bak_relabel_*.csv`;
|
страниц: `.venv\Scripts\python tools\relabel_studios.py` (копия — `data/labels.bak_relabel_*.csv`;
|
||||||
`--dry-run` — только статистика; повторный запуск ничего не добавляет).
|
`--dry-run` — только статистика; повторный запуск ничего не добавляет).
|
||||||
|
|||||||
+3
-1
@@ -10,7 +10,7 @@
|
|||||||
регулярками** — модель учится воспроизводить эту разметку и обобщать её на
|
регулярками** — модель учится воспроизводить эту разметку и обобщать её на
|
||||||
новые формулировки.
|
новые формулировки.
|
||||||
|
|
||||||
Размер (на момент последней сборки): ~41 тыс. строк из ~28 тыс. релизов, 3 источника
|
Размер (снимок 02.11.2026): 55 324 строки из 27 900 релизов, 3 источника
|
||||||
(rutracker, nnm, kinozal); HTML-дамп страниц — `data/raw` (~32 тыс. файлов, ≈2.6 ГБ, в git не
|
(rutracker, nnm, kinozal); HTML-дамп страниц — `data/raw` (~32 тыс. файлов, ≈2.6 ГБ, в git не
|
||||||
хранится), разобранные тексты — `data/pages`. Точные числа показывает «Статистика датасета» в
|
хранится), разобранные тексты — `data/pages`. Точные числа показывает «Статистика датасета» в
|
||||||
`tools/collect.py` (пункт 3) и отчёт `reports/data_audit.md` после `prepare_data`.
|
`tools/collect.py` (пункт 3) и отчёт `reports/data_audit.md` после `prepare_data`.
|
||||||
@@ -29,6 +29,8 @@
|
|||||||
| `studio` | автор («(не указана)» если нет) | **метка 2** (спан в тексте) |
|
| `studio` | автор («(не указана)» если нет) | **метка 2** (спан в тексте) |
|
||||||
| `age_18`, `note` | флаг/пометка 18+ | **метка 3** |
|
| `age_18`, `note` | флаг/пометка 18+ | **метка 3** |
|
||||||
| `role_raw` | скобочная часть / конкретный тип из перечисления | вход для nnm tech-строк |
|
| `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`, …) | контекст релиза | не используются |
|
| остальные (`ru_title`, `codec`, …) | контекст релиза | не используются |
|
||||||
|
|
||||||
## Форматы входа по источникам
|
## Форматы входа по источникам
|
||||||
|
|||||||
@@ -71,6 +71,7 @@
|
|||||||
| 6 tiny2 + int8 | сделано: 29.3 МБ, parity 99.8% тип / 99.2% спан / 100% 18+ (`reports/onnx_parity_tiny2_int8.md`) |
|
| 6 tiny2 + int8 | сделано: 29.3 МБ, parity 99.8% тип / 99.2% спан / 100% 18+ (`reports/onnx_parity_tiny2_int8.md`) |
|
||||||
| 7 тесты | `run_tests.py`: 57 ok (URL allowlist/SSRF, декодирование, заглушки Cloudflare/логина, title, слияние, агрегат) |
|
| 7 тесты | `run_tests.py`: 57 ok (URL allowlist/SSRF, декодирование, заглушки Cloudflare/логина, title, слияние, агрегат) |
|
||||||
| 8 `target/` | сделано |
|
| 8 `target/` | сделано |
|
||||||
|
| 10 аудит дорожек | сделано 02.11.2026: `tools/audit_tracks.py` → `reports/tracks_audit.md` (план из 5 пунктов). Пункт 1 — студии из кодек-строк в разметке (`codec_line_rows`, +6 428 строк); модель переобучена: test joint exact 0.891 → 0.906, e2e P/R kinozal 0.745/0.850 → 0.766/0.879, rutracker 0.866/0.859 → 0.877/0.870, nnm 0.845/0.829 → 0.838/0.825. Пункты 2–5 и сегментатор на новой разметке — открыты |
|
||||||
|
|
||||||
## Открытые вопросы
|
## Открытые вопросы
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,14 @@ copy /Y <путь>\labels.csv data\labels.csv
|
|||||||
.venv\Scripts\python -m src.train
|
.venv\Scripts\python -m src.train
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Если поменялась только логика разметки студий (без перекачки страниц), сначала
|
||||||
|
`.venv\Scripts\python tools\relabel_studios.py` (см. `docs/collecting.md`), затем
|
||||||
|
`prepare_data` и обучение. Кандидата из `models/runs/` перед заменой `models/best`
|
||||||
|
сравнить: `python -m src.runs --out runs.json --dirs models/best models/runs/<запуск>` (test-сплит) и
|
||||||
|
`E2E_MODEL=models/runs/<запуск>` + `tests/e2e_segmenter.py` (релизы). Поставить —
|
||||||
|
меню `tools/collect.py`, пункт 7, или `src.runs.promote`; для Docker затем
|
||||||
|
`python tools/pack_models.py --stage docker-models`.
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
| Симптом | Причина | Решение |
|
| Симптом | Причина | Решение |
|
||||||
|
|||||||
Reference in new issue
Block a user