Переобучение на нескольких авторах в строке: метки PARSE_VERSION 9, новая models/best (base)
docker / build (push) Successful in 43s

Метки пересобраны новыми парсерами (collect.py build --relabel): 69 511 строк из 30 451 релиза;
после prepare_data 52 658 строк, 3 529 с несколькими авторами, 5 ручных решений применены.

Новая models/best (ruBert-base) на общем тесте 4 984 строк: joint exact 0.903 против 0.800 у
прежней, span exact 0.919 против 0.813, type macro-F1 0.976 против 0.909; строки с 2+ авторами —
span 0.815 против 0.011. Прежняя модель — models/best_backup_20261109_164800. ONNX пересобран,
паритет 100 %.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
DenozordecandClaude Opus 5.5 committed 2026-11-09 16:56:12 +07:00
1 parent 8511744d3a
commit e8035e1e9d
4 files changed
+2041 -3860

No files matched your search

+26 -20
View File
@@ -10,8 +10,9 @@ kinozal / nnm-club) модель определяет:
алиасов («HDRezka Studio» → `HDrezka`, «Ю. Сербин» → «Юрий Сербин»);
* **18+** дорожка или нет — бинарная голова.
Обучено на датасете из 60 944 строк (71 339 размеченных строк из 30 401 релиза
`data/raw` + морфологическая аугментация). Как страницы превращаются в строки и
Обучено на датасете из 52 658 строк (69 511 размеченных строк из 30 451 релиза
`data/raw` + морфологическая аугментация; у строки может быть несколько авторов —
«Многоголосый (HDRezka Studio, LostFilm)» даёт обоих). Как страницы превращаются в строки и
что было исправлено в сборщике — [docs/dataset-coverage.md](docs/dataset-coverage.md).
Multi-task RuBERT: сравниваются `rubert-tiny2` и `ruBert-base`,
лучшая кладётся в `models/best`.
@@ -79,22 +80,27 @@ docs/ документация
## Качество
Held-out test (6 258 строк, группировка по релизам и текстам; после полной
переиндексации `data/raw` 09.11.2026). Обе модели оценены на **одном и том же**
тесте (`python -m src.runs --dirs … --refresh`):
Held-out test (4 984 строки, группировка по релизам и текстам; метки пересобраны
парсерами `PARSE_VERSION` 9, строки со списком студий склеены в одну с несколькими
авторами). Все модели оценены на **одном и том же** тесте:
| модель | type acc | type macro-F1 | span exact | 18+ acc | lang acc | joint exact |
|---|---|---|---|---|---|---|
| прежняя `models/best` (02.11) | 0.949 | 0.880 | 0.643 | 1.000 | 0.994 | 0.615 |
| **новая `models/best` (09.11)** | **0.976** | **0.906** | **0.674** | **1.000** | **0.995** | **0.658** |
| модель | type acc | type macro-F1 | span exact | 18+ acc | lang acc | joint exact [95 %] | строки с 2+ авторами (438), span |
|---|---|---|---|---|---|---|---|
| прежняя `models/best` (09.11, один автор на строку) | 0.981 | 0.909 | 0.813 | 1.000 | 0.998 | 0.800 [0.788–0.810] | 0.011 |
| rubert-tiny2, несколько авторов | 0.978 | 0.904 | 0.869 | 0.999 | 0.999 | 0.854 [0.843–0.863] | 0.637 |
| **ruBert-base, несколько авторов (`models/best`)** | **0.979** | **0.976** | **0.919** | **1.000** | **0.999** | **0.903** [0.895–0.911] | **0.815** |
* joint exact — строка распознана полностью (тип + автор + 18+).
* Абсолютный `span exact` ниже прежних 0.922 не потому, что модель стала хуже:
тест теперь включает форматы, которых раньше в датасете не было (авторы из
кодек-строк и списков, аниме-раздачи, «Язык озвучки», nnm `Аудио … (Русский,
X)`), и в нём много одиночных имён в перечислениях. На одном и том же тесте
новая модель лучше прежней по всем головам (+2.7 п.п. type acc, +3.1 п.п. span).
* E2E по релизам (`tests/e2e_segmenter.py`, по 400 тестовых страниц на трекер, пары
* joint exact — строка распознана полностью (тип + все авторы + 18+); span exact
сравнивает набор авторов строки целиком.
* Новая `models/best` против прежней на тех же строках: исправлено 647, сломано 131
(знаковый критерий p ≈ 1e-83). Прежняя модель часть тестовых строк видела при
обучении, так что сравнение в её пользу.
* Противоречивых строк (один текст — разные метки) в датасете 1.2 % вместо 20 %:
исправлены парсеры студий (пол голоса, техпараметры, «т/к», «N-й канал»), а
списки студий размечаются целиком. Оставшиеся расхождения между релизами
разбираются вручную: `tools/collect.py` → «Разбор противоречий»
(`data/text_fixes.csv`).
* E2E по релизам (замер для модели от 09.11 с одним автором на строку) (`tests/e2e_segmenter.py`, по 400 тестовых страниц на трекер, пары
тип + студия, precision / recall) — новая модель на тех же страницах:
kinozal 0.805 / 0.867, rutracker 0.771 / 0.740, nnm 0.752 / 0.693; прежняя
модель там же: 0.752 / 0.830, 0.729 / 0.700, 0.669 / 0.604. Справочно, правила:
@@ -102,16 +108,16 @@ Held-out test (6 258 строк, группировка по релизам и
* Сегментатор (`models/segmenter`) переобучен на расширенном наборе страниц
(`models/segmenter_v2`, line precision 0.933 / recall 0.977), но e2e новых весов
хуже по nnm (0.610 / 0.560) — в `models/segmenter` оставлены прежние веса.
* `models/best-onnx` не пересобран под новую модель: `python -m src.export_onnx`.
Паритет предыдущего экспорта — [reports/onnx_parity.md](reports/onnx_parity.md).
* `models/best-onnx` пересобран под новую модель: паритет с PyTorch 100 % по типу,
авторам и 18+ — [reports/onnx_parity.md](reports/onnx_parity.md).
## Ограничения
* Метки датасета сгенерированы регулярками (пайплайн deepseek-harness) — метрики
измеряют согласование с этой разметкой; ценность модели — обобщение на новые
формулировки без сопровождения регулярок.
* Датасет: 71 339 строк из 30 401 релиза (kinozal 23 969 / nnm 27 092 /
rutracker 20 278); после подготовки 60 944 строки. Покрытие страниц `data/raw`
* Датасет: 69 511 строк из 30 451 релиза (kinozal 23 749 / nnm 26 478 /
rutracker 19 284); после подготовки 52 658 строк (3 529 — с несколькими авторами). Покрытие страниц `data/raw`
— 85.5 % (30 260 из 35 385); оставшиеся — почти все без озвучки (русский
оригинал, «не требуется», музыка/сканы), см. [docs/dataset-coverage.md](docs/dataset-coverage.md).
* Извлечение автора уверенно работает на форматах записи, представленных в
+1975 -3803
View File
File diff suppressed because it is too large. Load diff
+37 -35
View File
@@ -1,46 +1,54 @@
# Аудит датасета: data/labels.csv
строк в CSV: 71339
строк после подготовки: 60944 (train 54686 / test 6258)
источники: {'kinozal': 15188, 'rutracker': 21303, 'nnm': 24453}
уникальных нормализованных текстов: 30761
групп (релиз ∪ одинаковый текст): 8743
удалено: пустой текст 0, мусорный studio 447, не-озвучка (оригинал/субтитры) 13, отказ от озвучки 184, противоречивые дубли 123 (групп-противоречий: 100), несколько дорожек в одной строке 7, лишние повторы (> 40 одинаковых) 20649
спан автора найден: 50477 (82.8%), не найден: 299
аугментировано морфологических вариантов: 10513
дорожек 18+: 1156 (из них без упоминания «18» в тексте: 27)
язык размечен: 38352 из 60944; со строкой «Аудио» во входе: 30844; классы: {'RUS': 36243, 'UKR': 1978, 'ENG': 90, 'KAZ': 21, 'JPN': 20}; редкие (<20, не учатся): {'DEU': 8, 'FRA': 13, 'CHI': 3, 'BEL': 2, 'GEO': 1, 'ITA': 14, 'KOR': 1, 'LAV': 1, 'UZB': 1, 'CZE': 5, 'SPA': 7}
строк в CSV: 69511
строк после подготовки: 52658 (train 47674 / test 4984)
источники: {'kinozal': 14015, 'rutracker': 17812, 'nnm': 20831}
уникальных нормализованных текстов: 30041
групп (релиз ∪ одинаковый текст): 8749
удалено: пустой текст 0, мусорный studio 359, не-озвучка (оригинал/субтитры) 13, отказ от озвучки 184, противоречивые дубли 109 (групп-противоречий: 109), несколько дорожек в одной строке 7, лишние повторы (> 40 одинаковых) 20592
несколько авторов в одной строке: склеено 5727 строк, строк с 2+ авторами 3529
ручные решения data/text_fixes.csv: 5 текстов, метка заменена в 409 строках, выброшено 0 строк
спан автора найден: 42489 (80.7%), не найден: 272
аугментировано морфологических вариантов: 9711
дорожек 18+: 1066 (из них без упоминания «18» в тексте: 25)
язык размечен: 34038 из 52658; со строкой «Аудио» во входе: 26700; классы: {'RUS': 32125, 'UKR': 1848, 'ENG': 65}; редкие (<20, не учатся): {'DEU': 8, 'FRA': 13, 'CHI': 3, 'KAZ': 14, 'BEL': 4, 'GEO': 2, 'ITA': 5, 'KOR': 1, 'JPN': 14, 'LAV': 1, 'UZB': 1, 'CZE': 1, 'SPA': 10}
## Распределение translation_type
- проф. многоголосый: 15272
- проф. дубляж: 14484
- авт. одноголосый: 7096
- неизвестно: 6806
- одноголосый: 3717
- многоголосый: 3468
- проф. двухголосый: 3467
- люб. многоголосый: 2171
- двухголосый: 1557
- люб. двухголосый: 1001
- люб. одноголосый: 966
- люб. дубляж: 520
- проф. одноголосый: 410
- авт. двухголосый: 6
- авт. многоголосый: 3
- проф. многоголосый: 13827
- проф. дубляж: 13226
- авт. одноголосый: 6463
- неизвестно: 4918
- проф. двухголосый: 3079
- одноголосый: 3016
- многоголосый: 2446
- люб. многоголосый: 2039
- двухголосый: 923
- люб. двухголосый: 921
- люб. одноголосый: 914
- люб. дубляж: 492
- проф. одноголосый: 387
- авт. двухголосый: 5
- авт. многоголосый: 2
## Примеры противоречий (один текст — разные типы)
- rutracker:6111749 «(св-дубль - вгтрк) [vhs] [rus ac3 2ch 192kbps]» -> ['неизвестно', 'проф. дубляж']
- nnm:nnm-1009875 «русский dts 5.1, 1509 kbps, 48.0 khz (двуголосый) п. гланц и» -> ['двухголосый', 'проф. двухголосый']
- nnm:nnm-1014436 «ac-3, 48.0 khz, 2 ch, 192 kbps, cbr (russian) - двухголосый » -> ['двухголосый', 'проф. двухголосый']
- nnm:nnm-1028054 «ac-3, 48.0 khz, 6 ch, 448 kbps (russian) - многоголосый [rus» -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1058230 «ac3, 2 канала, 384 кбит/сек - русский (многоголосый закадров» -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1104137 «ac-3, 48.0 khz, 1 ch, 192 kbps, cbr (русский, проф. многогол» -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1104203 «lpcm, 1 ch, 1152 kbps, 48,0 khz - русский (многоголосый ''ка» -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1116916 «ac3, 2 ch, 192 kbps, 48,0 khz (русский - двухголосый ''видео» -> ['двухголосый', 'проф. двухголосый']
- nnm:nnm-1126664 «1 ac3, 2 ch, 192 kbps - русский, многоголосый (св-дубль) [ru» -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1141333 «ac3, 6 ch, 448 kbps (русский - многоголосый ''d2lab'') [rus » -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1151582 «русский, aac, 2 ch, 192 kbps, 48,0 khz (многоголосый r5) med» -> ['многоголосый', 'проф. многоголосый']
- nnm:nnm-1154096 «ac3, 2 ch, 192 kbps (русский - двухголосый ''нтв+'') [rus ac» -> ['двухголосый', 'проф. двухголосый']
- nnm:1176495 «ac3, 2 ch, 192 kbps (русский - многоголосый ''первый канал''» -> ['многоголосый', 'проф. многоголосый']
## Спан не найден (примеры)
- [rutracker] studio=«студия Кадр , по заказу РТР, 1995 г» text=«Профессиональный (дублированный): студия "Кадр" (при уч. студии "Нота"»
- [rutracker] studio=«от : : gamekoff» text=«от [Fansub AOS]: Переводчик: gamekoff, Anku, Cracknight, Makentosh, sh»
- [nnm] studio=«SovetRomantica 2) HorribleSubs» text=«1) GerKo, Ryuji, Tousaka Jun (01-06 + SP); SovetRomantica (07-11) 2) H»
- [nnm] studio=«Истари Комикс + Anilibria» text=«Funimation; Истари Комикс (OVA) + Anilibria (TV)»
- [nnm] studio=«FRT Sora & KaijuKeizer Media Info на первую серию» text=«Shift (TV) | FRT Sora & KaijuKeizer (TV + OVA) Media Info на первую се»
- [nnm] studio=«YakuSub Studio + SovetRomantica» text=«Wakanim (TV 01-12 + OVA); YakuSub Studio (TV 01-10) + SovetRomantica (»
- [nnm] studio=«Zottig & Daidzobu» text=«Zottig (Teisoku) & Daidzobu (Aragami Fansubs)»
- [rutracker] studio=«Ancord & Noir Ancord» text=«Ancord & Noir (01-35) Ancord (36+)»
- [rutracker] studio=«Правильный от студии ПЭ http» text=«Любительский (Гоблинa, "Правильный от студии "Полный ПЭ" http://www.op»
- [rutracker] studio=«Тот самый с кассет» text=«Профессиональный (полное дублирование) + Aвторский перевод А.Михалёва »
@@ -48,10 +56,4 @@
- [rutracker] studio=«но его довольно часто встречал» text=«Любительская (одноголосая) - озвучника не помню как зовут, но его озву»
- [rutracker] studio=«absurd95 & Eladiel» text=«absurd95 (м.) & Eladiel (ж.)»
- [rutracker] studio=«Доп.инфо о : Инна Королева и Петр Гланц» text=«Профессиональный (двухголосый закадровый) Доп.инфо о переводе: Инна Ко»
- [rutracker] studio=«Persona99 ^_^» text=«Persona99 (одноголосое закадровое женское) ^_^»
- [rutracker] studio=«Доп.инфо о НТВ+» text=«Профессиональный (двухголосый закадровый) Доп.инфо о переводе НТВ+»
- [rutracker] studio=«Доп.инфо о НТВ+» text=«Профессиональный (многоголосый закадровый) Доп.инфо о переводе НТВ+»
- [rutracker] studio=«эп. 1-9 , эп. 10-13» text=«эп. 1-9 [YakuSub Studio], эп. 10-13 [Advantage]»
- [rutracker] studio=«Кубик в кубе на ознакомительный день и преображение дома. На Банан не требуется» text=«Профессиональный (двухголосый, закадровый) Кубик в кубе на ознакомител»
- [rutracker] studio=«версия 2015» text=«Одноголосый закадровый Александр Герусов, версия озвучки 2015»
- [rutracker] studio=«Доп.инфо о НТВ+» text=«Профессиональный (многоголосый закадровый) Доп.инфо о переводе НТВ+»
- [rutracker] studio=«Persona99 ^_^» text=«Persona99 (одноголосое закадровое женское) ^_^»
+3 -2
View File
@@ -1,9 +1,10 @@
# ONNX parity (test split)
- строк: 645
- модель: models/best / model.onnx (711.2 MB)
- строк: 2000
- совпадение класса типа: 1.0000
- совпадение текста спана: 1.0000
- совпадение флага 18+: 1.0000
- макс. расхождение type_logits: 4.29e-06
- макс. расхождение type_logits: 2.57e-05
Вердикт: **OK** (≥99% все критерии)