"""Métriques officielles Picarones — Cercle 2. Ce package contient l'ensemble des mesures et analyses qui calculent, agrègent ou interprètent des métriques sur un corpus. Il dépend du cercle 1 (``picarones.core``) qui définit les abstractions, et est consommé par le cercle 3 (``picarones.report``, ``picarones.cli``, ``picarones.web``) qui présente les résultats. Sous-modules ------------ Coeur : - :mod:`metrics` compute_metrics (CER/WER/MER/WIL via jiwer) - :mod:`statistics` Wilcoxon, Friedman, Nemenyi, Pareto, CDD - :mod:`runner` run_benchmark — orchestration parallèle - :mod:`builtin_hooks` 12 hooks doc + 12 agrégateurs natifs - :mod:`builtin_metrics` enregistrement métriques dans le registry - :mod:`alto_metrics` métriques jonction TEXT/ALTO - :mod:`normalization` profils Unicode Erreurs et taxonomie : - :mod:`confusion` matrice de confusion Unicode - :mod:`char_scores` scores ligatures/diacritiques - :mod:`taxonomy` taxonomie 9 classes d'erreurs - :mod:`taxonomy_comparison` comparaison taxonomique miroir - :mod:`taxonomy_cooccurrence` Jaccard inter-classes - :mod:`taxonomy_intra_doc` heatmap classes × position Structure et lignes : - :mod:`structure` blocs/lignes/mots - :mod:`line_metrics` distribution CER par ligne (Gini, percentiles) - :mod:`worst_lines` lignes pires globales Fiabilité et calibration : - :mod:`calibration` ECE, MCE, reliability bins - :mod:`reliability` IAA Cohen κ + multirun stability - :mod:`hallucination` détection hallucinations VLM - :mod:`robustness` courbes CER vs dégradation - :mod:`robustness_projection` projection sur corpus réel Image et difficulté : - :mod:`image_quality` contraste, bruit, flou… - :mod:`image_predictive` complexité paléographique - :mod:`difficulty` score difficulté intrinsèque Contenu et lisibilité : - :mod:`searchability` recherchabilité fuzzy (Levenshtein) - :mod:`numerical_sequences` préservation dates/cotes/numéraux - :mod:`rare_tokens` rappel sur tokens rares - :mod:`readability` Δ Flesch (sur-normalisation) Structure ALTO et entités : - :mod:`layout` F1 layout par type de région - :mod:`reading_order` F1 ordre de lecture (ICDAR 2015) - :mod:`ner`, :mod:`ner_backends` - :mod:`error_absorption` correction vs introduction par jonction Inter-moteurs et historique : - :mod:`inter_engine` divergence taxonomique + oracle gap - :mod:`specialization` spécialisation inter-moteurs - :mod:`baseline_comparison` comparaison à l'historique - :mod:`longitudinal` régression linéaire + change-point - :mod:`incremental_comparison` ANOVA-like par slot - :mod:`history` historique SQLite Économie et opération : - :mod:`pricing` table tarifaire - :mod:`throughput` pages/h effectif - :mod:`cost_projection` projection à volume cible - :mod:`marginal_cost` coût par erreur évitée Philologie historique : - :mod:`mufi` couverture MUFI (médiéval) - :mod:`abbreviations` signes d'abréviation Capelli - :mod:`unicode_blocks` précision par bloc Unicode - :mod:`early_modern_typography` ligatures imprimées XVIᵉ-XVIIIᵉ - :mod:`modern_archives` marqueurs XIXᵉ-XXᵉ - :mod:`roman_numerals` numéraux romains - :mod:`lexical_modernization` sur-normalisation lexicale Pipelines composées (axe B) : - :mod:`pipeline_benchmark`, :mod:`pipeline_comparison`, :mod:`pipeline_spec_loader` Aide à la décision : - :mod:`levers` leviers d'amélioration factuels - :mod:`equivalence_profile` curseur fin équivalences diplomatiques - :mod:`module_policy` manifest + audit modules contribués Câblages adaptifs (suffixe ``_hooks``) : - :mod:`readability_hooks`, :mod:`searchability_hooks`, :mod:`numerical_sequences_hooks`, :mod:`philological_hooks` — adaptive masking document-par-document, consommés par :mod:`builtin_hooks`. Ces modules sont des couches d'adaptation entre le calcul pur (sans I/O) et le runner principal (avec agrégation par moteur). Moteur narratif : - :mod:`narrative` (sous-package) : arbiter, registry, renderer, 18 détecteurs en 6 familles. Le modèle de données (``Fact``, ``FactType``, ``DetectorRegistry``) vit en cercle 1 dans :mod:`picarones.core.facts`. Voir :doc:`docs/architecture.md` pour la cartographie complète et la règle de dépendance des 3 cercles. """ # ────────────────────────────────────────────────────────────────────────── # Sprint A3 (renforce le respect de la règle Cercle 2 → Cercle 1 # uniquement) — la cérémonie d'enregistrement des métriques typées dans # le registre Sprint 34 a été déplacée ici depuis ``core/pipeline.py`` # qui violait la règle. # # Tout consommateur qui veut utiliser ``compute_at_junction`` # (``picarones.core.metric_registry``) doit avoir importé # ``picarones.measurements`` au moins une fois pour que les décorateurs # ``@register_metric`` aient été exécutés. C'est le cas par défaut dans # le pipeline standard ; les notebooks isolés peuvent ajouter # ``import picarones.measurements`` (suivi d'un commentaire d'exception # ruff sur la ligne d'import si leur linter signale un import inutilisé). # # Sans ces imports, ``compute_at_junction`` trouverait un registre vide # et ne calculerait rien aux jonctions. # ────────────────────────────────────────────────────────────────────────── # Sprint 34 : cer / wer / mer / wil + stub TEXT→ALTO from picarones.measurements import builtin_metrics # noqa: F401 # Sprints 55-60 : métriques philologiques. from picarones.measurements import abbreviations # noqa: F401 from picarones.measurements import early_modern_typography # noqa: F401 from picarones.measurements import modern_archives # noqa: F401 from picarones.measurements import mufi # noqa: F401 from picarones.measurements import roman_numerals # noqa: F401 from picarones.measurements import unicode_blocks # noqa: F401 # Sprint 53 : reading order F1. Sprints 38, 52 : NER, readability. from picarones.measurements import ner # noqa: F401 from picarones.measurements import readability # noqa: F401 from picarones.measurements import reading_order # noqa: F401 # Chantier 1 (post-Sprint 97) : métriques (ALTO, ALTO) pour évaluer # les reconstructeurs ALTO contre une GT ALTO du document. from picarones.measurements import alto_metrics # noqa: F401 # ────────────────────────────────────────────────────────────────────────── # Sprint « zéro dette actionnable » (mai 2026) — modules sans appel # automatique par le runner OCR principal mais qui font partie de l'API # publique de ``picarones.measurements``. L'import ici les rend # accessibles en ``from picarones.measurements import X`` et garantit # qu'aucun ne devient « test-only » silencieusement (cf. # ``tests/architecture/test_module_coverage.py``). # # Distinction de scope : # - Modules de calcul utilisés via les renderers HTML composables # (l'utilisateur les compose lui-même selon son use case) : from picarones.measurements import baseline_comparison # noqa: F401 # historique SQLite from picarones.measurements import cost_projection # noqa: F401 # volume cible utilisateur from picarones.measurements import equivalence_profile # noqa: F401 # curseur HTML from picarones.measurements import error_absorption # noqa: F401 # jonction pipeline composée from picarones.measurements import layout # noqa: F401 # GT ALTO requise (axe B) from picarones.measurements import longitudinal # noqa: F401 # historique SQLite from picarones.measurements import marginal_cost # noqa: F401 # paires de moteurs from picarones.measurements import module_policy # noqa: F401 # outil d'audit from picarones.measurements import ner_backends # noqa: F401 # factory backends NER from picarones.measurements import rare_tokens # noqa: F401 # corpus-wide from picarones.measurements import reliability # noqa: F401 # multi-runs from picarones.measurements import taxonomy_cooccurrence # noqa: F401 # depuis taxonomy from picarones.measurements import taxonomy_intra_doc # noqa: F401 # depuis taxonomy