Слияние студии из заголовка, title в сервисе, детект заглушек, e2e через predict_release
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
1 parent
8cbd800ec7
commit
6be369c415
7 files changed
+112
-19
No files matched your search
+14
-3
@@ -16,12 +16,14 @@ from pathlib import Path
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
||||
|
||||
from src.predict import DubPredictor # noqa: E402
|
||||
from src.html_extract import read_input # noqa: E402
|
||||
from src.release import predict_release # noqa: E402
|
||||
from src.studio_norm import canonical # noqa: E402
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
|
||||
def release_check(predictor: DubPredictor, rows: list[dict]) -> dict:
|
||||
def release_check(predictor: DubPredictor, rows: list[dict], use_title: bool = True) -> dict:
|
||||
"""E2E на текстовых дампах страниц: пары (тип, автор) по релизам."""
|
||||
by_release: dict[tuple[str, str], list[dict]] = defaultdict(list)
|
||||
for r in rows:
|
||||
@@ -43,7 +45,10 @@ def release_check(predictor: DubPredictor, rows: list[dict]) -> dict:
|
||||
gt_rows = by_release[(src, rid)]
|
||||
gold = {(r["translation_type"], r["studio"] or None) for r in gt_rows}
|
||||
try:
|
||||
tracks = predictor.predict_file(page)
|
||||
if use_title: # путь релиза: описание + студии из заголовка раздачи
|
||||
tracks = predict_release(predictor, text=read_input(page))["tracks"]
|
||||
else:
|
||||
tracks = predictor.predict_file(page)
|
||||
except Exception as e: # noqa: BLE001
|
||||
misses.append(f"{page.name}: ошибка {e}")
|
||||
continue
|
||||
@@ -115,7 +120,13 @@ def main() -> None:
|
||||
.read_text(encoding="utf-8"))
|
||||
predictor = DubPredictor()
|
||||
|
||||
print("== e2e: страницы против меток ==")
|
||||
print("== e2e: страницы против меток (только описание, baseline) ==")
|
||||
base = release_check(predictor, rows, use_title=False)
|
||||
print(f"релизов: {base['n_releases']}, precision {base['mean_precision']:.3f}, "
|
||||
f"recall {base['mean_recall']:.3f}; "
|
||||
+ "; ".join(f"{s}: P={v['precision']:.3f} R={v['recall']:.3f}"
|
||||
for s, v in base["per_source"].items()))
|
||||
print("\n== e2e: страницы против меток (описание + заголовок, predict_release) ==")
|
||||
rel = release_check(predictor, rows)
|
||||
print(f"релизов проверено: {rel['n_releases']}, "
|
||||
f"mean precision {rel['mean_precision']:.3f}, "
|
||||
|
||||
@@ -201,5 +201,28 @@ check("aggregate: 18+ = OR", agg["is_18plus"] is True)
|
||||
check("aggregate: студии", [x["studio"] for x in agg["studios"]] == ["MovieDalen", "LostFilm"])
|
||||
check("aggregate: пусто", aggregate([])["is_18plus"] is False)
|
||||
|
||||
from src.fetch import blocked_reason # noqa: E402
|
||||
from src.release import merge_title_tracks, title_from_text # noqa: E402
|
||||
|
||||
check("заглушка Cloudflare", blocked_reason("<html><title>Один момент…</title>") is not None)
|
||||
check("нормальная страница", blocked_reason("<html><title>X</title>Перевод: A") is None)
|
||||
|
||||
_page = [dict(_t("проф. двухголосый", None), studio_span=None, studio_confidence=None),
|
||||
dict(_t("проф. дубляж", "MovieDalen"), studio_span="MovieDalen", studio_confidence=1)]
|
||||
_title = [dict(_t("проф. двухголосый", "Red Head Sound"), studio_span="Red Head Sound",
|
||||
studio_confidence=0.9),
|
||||
dict(_t("проф. дубляж", "MovieDalen"), studio_span="x", studio_confidence=1),
|
||||
dict(_t("проф. многоголосый", "LostFilm"), studio_span="LostFilm", studio_confidence=1)]
|
||||
merge_title_tracks(_page, _title)
|
||||
check("title: студия вписана в дорожку без студии",
|
||||
_page[0]["studio"] == "Red Head Sound" and _page[0]["source"] == "page+title")
|
||||
check("title: дубль студии пропущен, новая добавлена",
|
||||
len(_page) == 3 and _page[2]["source"] == "title")
|
||||
|
||||
_dump = ("Меню\nГангстерленд / MobLand / 2025 / ПМ (LostFilm) / WEB\n"
|
||||
"Гангстерленд / 2026 / ДБ (X) / WEB-DL")
|
||||
check("title_from_text: первая строка",
|
||||
"LostFilm" in title_from_text(_dump) and "ДБ" not in title_from_text(_dump))
|
||||
|
||||
print(f"\nитог: {PASS} ok, {FAIL} failed")
|
||||
sys.exit(1 if FAIL else 0)
|
||||
Reference in new issue
Block a user