Picarones / docs /reference /normalization-profiles.md
Claude
docs(sprint-H.9): archive migration plans + cleanup stale doc paths
2b782d0 unverified
# Profils de calcul — chantier 2 post-Sprint 97
Picarones expose **7 profils de calcul** qui modulent les métriques
calculées par le runner selon le use case. Chaque profil active un
sous-ensemble des **12 hooks document-level** et **12 agrégateurs
corpus-level** du registre central
([`picarones/evaluation/metric_hooks.py`](../picarones/evaluation/metric_hooks.py)).
## Synoptique
| Profil | Hooks doc | Cible | CLI dédiée |
|---|---|---|---|
| `minimal` | 0 | Tests rapides, bench massif (CER/WER seuls) | — |
| `standard` (défaut) | 12 | Comportement historique, rétrocompat | `picarones run` |
| `philological` | 12 | Édition critique, paléographie | `picarones edition` |
| `diagnostics` | 12 | Comprendre **pourquoi** un moteur produit ses résultats | `picarones diagnose` |
| `economics` | 12 | Décision budget : pages/h utilisable, coût marginal | `picarones economics` |
| `pipeline` | 12 | Bench de pipelines composées (axe B) | `picarones pipeline run` |
| `full` | 12 | R&D — tout ce qui peut être calculé | — |
> **Note rétrocompat** : aujourd'hui les profils `philological`, `diagnostics`,
> `economics`, `pipeline` et `full` activent **le même ensemble** que `standard`
> côté hooks calculés. Ce qui change, c'est la **vue HTML rendue** : chaque
> profil active des sous-sections différentes du rapport (cf. `docs/reference/views.md`).
> Les profils sont volontairement génériques pour permettre aux contributeurs
> futurs d'ajouter des hooks spécifiques sans casser l'API.
## Détail des hooks par profil
### `minimal`
Aucun hook. Le runner calcule uniquement les métriques de base
(`cer`, `wer`, `mer`, `wil` via `compute_metrics`). Les `DocumentResult`
n'ont **aucun champ** `confusion_matrix`, `taxonomy`, `calibration`, etc.
**Cas d'usage** : bench de régression sur 10 000 documents pour mesurer
le CER d'une mise à jour de modèle, sans avoir besoin du diagnostic
philologique. Réduit drastiquement le temps de calcul (∼5× plus rapide).
```bash
picarones run --corpus ./corpus --profile minimal
```
### `standard` (défaut)
Active les 12 hooks document-level historiques :
| Hook | Sprint | Champ DocumentResult | Notes |
|---|---|---|---|
| `confusion` | 5 | `confusion_matrix` | Matrice unicode |
| `char_scores` | 5 | `char_scores` | Ligatures + diacritiques |
| `taxonomy` | 5 | `taxonomy` | 9 classes d'erreurs |
| `structure` | 5 | `structure` | Lignes / blocs / mots |
| `image_quality` | 5 | `image_quality` | Contraste, bruit, flou… |
| `line_metrics` | 10 | `line_metrics` | Distribution CER + Gini |
| `hallucination` | 10 | `hallucination_metrics` | Détection VLM |
| `calibration` | 42 | `calibration_metrics` | ECE/MCE (si confidences) |
| `philological` | 61 | `philological_metrics` | 6 modules (Sprints 55-60) |
| `searchability` | 86 | `searchability_metrics` | Fuzzy recall (Sprint 84) |
| `numerical_sequences` | 86 | `numerical_sequence_metrics` | Sprint 85 |
| `readability` | 87 | `readability_metrics` | Δ Flesch (Sprint 52) |
12 agrégateurs corpus-level correspondants remplissent les attributs
`aggregated_*` de chaque `EngineReport`.
### `philological` (édition critique)
Active les 12 hooks `standard` + déclenchera (chantiers futurs)
l'enrichissement par des hooks dédiés à la paléographie médiévale,
l'imprimé ancien et les archives modernes (déjà calculés via le module
`philological` du `standard`, mais valorisés différemment dans la vue
HTML « Taxonomie avancée »).
```bash
picarones edition --corpus ./manuscrits --engines tesseract,pero_ocr
```
Vue HTML supplémentaire activée : `view_advanced_taxonomy.html` avec
diagramme miroir leader vs runner-up, classes par récupérabilité
éditoriale.
### `diagnostics` (analyse approfondie)
Identique à `standard` côté hooks. Déclenche la vue HTML « Diagnostic
approfondi » avec **leviers d'amélioration** factuels (jamais
prescriptifs) calculés par `picarones.domain.levers.detect_levers()`.
```bash
picarones diagnose --corpus ./corpus --engines tess,pero
```
Vue HTML supplémentaire : `view_diagnostics.html` avec :
- Leviers d'amélioration (`dominant_recoverable_class`,
`pareto_concentration`, etc.).
- Profil d'image du corpus (complexité paléographique + homogénéité,
opt-in).
- Comparaison historique (baseline, opt-in si historique SQLite).
### `economics` (décision budget)
Active la vue HTML « Coût et performance » avec **throughput effectif**
calculé selon la formule HTR-United (5 s/erreur de correction humaine).
Discrimine entre un moteur cloud rapide mais imprécis (drag élevé) et
un local lent mais fiable.
```bash
picarones economics --corpus ./corpus --engines mistral_ocr,tesseract
```
### `pipeline` (axe B)
Profil utilisé par `picarones pipeline run` pour les benchmarks de
pipelines composées (Sprints 32-34, 53-54, 63-68, 94-97 + chantier 1).
La vue HTML produite contient le DAG visuel de la pipeline,
l'absorption d'erreur par jonction, et la comparaison incrémentale par
slot.
```bash
picarones pipeline run examples/pipelines/ocr_to_alto.yaml --corpus DIR
```
### `full`
Active **tous** les hooks et toutes les vues. Coût maximal mais
reproductibilité scientifique maximale.
## Comment ajouter un hook personnalisé
Voir [`docs/explanation/narrative-engine.md`](developer/narrative-engine.md)
pour le détail. Pattern de base :
```python
from picarones.evaluation.metric_hooks import (
register_document_metric, PROFILE_DIAGNOSTICS, PROFILE_FULL,
)
@register_document_metric(
name="my_metric",
attribute="my_metric", # nom du champ DocumentResult
profiles=(PROFILE_DIAGNOSTICS, PROFILE_FULL),
requires_success=True,
)
def my_hook(*, ground_truth, hypothesis, image_path, corpus_lang, ocr_result):
from my_module import compute_my_metric
return compute_my_metric(ground_truth, hypothesis)
```
## Code source
- [`picarones/evaluation/metric_hooks.py`](../picarones/evaluation/metric_hooks.py)
— registre, profils, `run_document_hooks()`, `run_corpus_aggregators()`.
- [`picarones/evaluation/metrics/builtin_hooks.py`](../picarones/evaluation/metrics/builtin_hooks.py)
— les 12 hooks doc + 12 agrégateurs natifs Picarones.
- [`tests/test_metric_hooks.py`](../tests/test_metric_hooks.py)
— tests unitaires + rétrocompat profil `standard`.