File size: 8,810 Bytes
d756039
 
6a9d280
 
 
 
 
d756039
 
 
6a9d280
d756039
6a9d280
 
 
 
 
 
 
 
 
 
 
 
d756039
 
6a9d280
 
 
 
 
 
d756039
 
 
 
 
 
 
6a9d280
d756039
 
 
6a9d280
 
 
 
 
 
 
d756039
6a9d280
 
 
 
 
 
 
 
 
d756039
6a9d280
 
 
 
 
 
 
 
 
 
d756039
 
 
 
 
 
 
 
6a9d280
d756039
6a9d280
 
 
 
 
 
 
d756039
6a9d280
d756039
6a9d280
 
d756039
 
 
 
 
6a9d280
d756039
77d9c47
d756039
77d9c47
 
 
 
 
 
d756039
 
 
6a9d280
 
 
 
d756039
d0a3fab
6a9d280
d756039
fda1a60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388e3f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
"""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/explanation/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