Picarones / docs /reference /text-view.md
Claude
docs: refonte Diataxis + 8 documents institutionnels (S60)
d0a3fab unverified
# TextView — première vue canonique
Sprint A14-S14 du rewrite ciblé livre `TextView`, la première vue
d'évaluation canonique. Elle répond à la question patrimoniale la
plus fréquente : **"quel pipeline produit le meilleur texte
final ?"**
## Cas d'usage central BnF
Une bibliothèque numérique veut comparer 3 pipelines hétérogènes
sur le même corpus :
1. **Tesseract** → texte brut (`RAW_TEXT`)
2. **OCR + LLM + remapping ALTO** → ALTO XML enrichi (`ALTO_XML`)
3. **VLM avec sortie markdown structurée**`CANONICAL_DOCUMENT`
Sans `TextView`, comparer ces 3 pipelines est trompeur : ils ne
produisent pas le même type d'artefact. Avec `TextView`, chaque
sortie est **projetée vers du texte plat** avant calcul de
CER/WER, et le rapport documente explicitement ce que la vue
**ignore** (géométrie, structure de blocs, ordre de lecture, IDs,
formatage).
## API
```python
from picarones.evaluation.views import build_text_view
# Vue canonique avec valeurs par défaut
view = build_text_view()
# Vue spécialisée (par exemple : OCR seul, sans ALTO/PAGE)
from picarones.domain import ArtifactType
view_ocr_only = build_text_view(
candidate_types=frozenset({
ArtifactType.RAW_TEXT,
ArtifactType.CORRECTED_TEXT,
}),
metric_names=("cer", "wer"),
normalization_profile="medieval_french",
)
```
## Types acceptés (par défaut)
| Type | Projection | Justification |
|---|---|---|
| `RAW_TEXT` | identité | déjà du texte |
| `CORRECTED_TEXT` | identité | déjà du texte (modifié par un LLM) |
| `ALTO_XML` | `AltoToText` | extraction par ordre de lecture, gestion césure |
| `PAGE_XML` | `PageToText` | extraction depuis `<TextEquiv><Unicode>` |
| `CANONICAL_DOCUMENT` | `CanonicalToText` | décode markdown, aplatit JSON canonique |
## Métriques (par défaut)
`cer`, `wer`, `mer`, `wil` — toutes typées `(RAW_TEXT, RAW_TEXT)`
puisque la comparaison se fait toujours après projection vers
texte plat.
## Dimensions explicitement ignorées
Le `ViewResult` propage dans `ignored_dimensions` les dimensions
que cette vue **ne mesure pas** :
- `geometry` — coordonnées HPOS/VPOS/WIDTH/HEIGHT des mots
- `block_structure` — découpage en `TextBlock` / `TextRegion`
- `reading_order` — ordre de lecture spatial
- `ids` — identifiants stables des éléments
- `confidence` — scores de confiance par mot
- `formatting` — gras / italique / titre
Ces dimensions sont éventuellement évaluées par d'autres vues :
- `geometry`, `block_structure`, `reading_order`, `ids`
**`AltoView`** (S15)
- `confidence` → vue calibration (existante via S5 metrics)
## Garde-fou méthodologique
Chaque `ViewResult` produit par `TextView` porte un `warnings`
explicite :
> Cette vue compare les sorties textuelles finales après
> projection éventuelle. Les pipelines qui produisent
> ALTO/PAGE/markdown sont projetés vers du texte plat — leurs
> structures spatiale et documentaire ne sont PAS évaluées ici.
> Pour évaluer la qualité ALTO, voir AltoView (S15).
Ce warning sera affiché en tête du bloc TextView dans le rapport
HTML (S22) pour signaler à un lecteur exactement la portée de la
comparaison.
## Exemple de `ViewResult`
```python
ViewResult(
view_name="text_final",
candidate_artifact_id="bnf_doc:vlm:canonical_document",
ground_truth_artifact_id="bnf_doc:gt:raw_text",
metric_values={
"cer": 0.04,
"wer": 0.12,
"mer": 0.04,
"wil": 0.18,
},
failed_metrics={},
projection_report=ProjectionReport(
source_artifact_id="bnf_doc:vlm:canonical_document",
source_type=ArtifactType.CANONICAL_DOCUMENT,
target_type=ArtifactType.RAW_TEXT,
projector_name="canonical_to_text",
lossy=True,
ignored_dimensions=("structure", "formatting", "headers", "links"),
warnings=("Markdown / JSON canonique projeté en texte plat...",),
),
warnings=(
"Cette vue compare les sorties textuelles finales...",
"Markdown / JSON canonique projeté en texte plat...",
),
ignored_dimensions=(
"geometry", "block_structure", "reading_order", "ids",
"confidence", "formatting", "structure", "headers", "links",
),
)
```
## Limites assumées
- **Pas de comparaison fuzzy / search recall** — c'est `SearchView`
(S16).
- **Pas d'évaluation structurelle ALTO** — c'est `AltoView` (S15).
- **`CANONICAL_DOCUMENT` peut perdre beaucoup de structure** ; le
warning du `ProjectionReport` le signale.
- **Pas de pondération inter-pipelines** — chaque pipeline est
évalué indépendamment ; le ranking et l'agrégation sont la
responsabilité du caller (typiquement le rapport HTML S22).
## Statut
- ✅ Sprint S14 — `TextView` livré (codé + testé)
- ⏳ Sprint S15 — `AltoView` (fidélité documentaire)
- ⏳ Sprint S16 — `SearchView` (recherchabilité fuzzy)
- ⏳ Sprint S17 — intégration runner + RunManifest
- ⏳ Sprint S18 — tests E2E sur le cas BnF central avec 3 pipelines