Audit d’ingestion : gloses et découpage en mots

Déclencheur : la note 5 du scan des lettres irrégulières (Lettres-irregulieres-monte-carlo, ticket 1701908b) signalait une glose massorétique incorporée au texte d’Esther 9,9.

1. Cause racine

Sefaria livre le texte hébreu (édition MAM) avec ses notes de bas de page massorétiques en HTML :

וְאֵ֥ת ׀ אֲרִדַ֖י<sup class="footnote-marker">*</sup><i class="footnote">(בספרים אחרים אֲרִידַ֖י וכך כתוב במגילות רבות)</i>

Le pipeline de nettoyage (gematria.core.hebrew.clean_text) retirait les balises mais gardait leur contenu. Résultat : la glose se collait au mot précédent et ses mots entraient dans le verset.

Esther 9,9texte
avantואת פרמשתא ואת אריסי ואת ארדיבספרים אחרים ארידי וכך כתוב במגילות רבות ואת ויזתא
aprèsואת פרמשתא ואת אריסי ואת ארדי ואת ויזתא

Correctif : étape 0 du pipeline, strip_footnotes(), qui retire la balise et son contenu — appliquée à clean_text, preserve_nikkud, clean_text_keep_maqqef, et au pré-nettoyage de backfill_maqqef_group.py qui portait le même défaut.

2. Étendue : 31 versets, tous faux

Recherche exhaustive sur les 23 206 versets : 31 portent une note de bas de page, et les 31 étaient corrompus.

Référencemots avant → aprèsE après
Gn 4,1310 → 7263
Gn 5,116 → 12475
Gn 7,1125 → 221007
Gn 9,2913 → 10429
Gn 41,4525 → 21976
Gn 41,5021 → 17717
Gn 46,2021 → 17748
Ex 1,1922 → 17825
Ex 17,1618 → 11366
Ex 25,3117 → 14746
Ex 28,2620 → 17756
Ex 33,2315 → 9357
Ex 34,726 → 22960
Lv 6,227 → 23786
Lv 7,2129 → 24905
Lv 7,2714 → 10423
Lv 19,1616 → 11421
Nb 1,1712 → 9401
Nb 10,1023 → 201234
Nb 22,531 → 281141
Nb 25,1129 → 22977
Nb 25,1212 → 8354
Dt 11,2121 → 17826
Dt 22,630 → 261098
Dt 23,213 → 8282
Dt 27,1915 → 10417
Dt 32,619 → 15537
Dt 33,2923 → 19926
Est 8,1128 → 261240
Est 9,223 → 211045
Est 9,914 → 8347

En gras : les cinq versets qui portent aussi une lettre irrégulière du corpus 1701908b.

Dommage collatéral découvert au passage : la glose décalait aussi l’alignement OSHB (lemmes, Strong, morphologie) sur toute la fin de chaque verset touché. Dans Est 9,9, ארידי (mot de la glose) portait le Strong 2055 qui appartient à ויזתא, et les deux derniers mots réels n’avaient aucun lemme. 501 mots réalignés.

3. Ce qui a été recalculé

Pour les 31 versets : text_clean, word_count, letter_count, E ordinal/standard, primalité et rang, EFP, radicales/serviles (sommes, comptes, primalité, rangs), séquences 1-3, plénitude, triangulaire/carré, facteurs premiers, mélodie (intervals, contour, sigma_abs), verse_et, sommes maqqef. Table words reconstruite (628 → 501 mots), puis :

  • load_oshb.py rejoué sur les 6 livres touchés → lemmes/Strong/morph/préfixes réalignés ;
  • backfill_maqqef_group.py rejoué → +149 mots correctement regroupés ;
  • fix_footnote_gloses.py --maqqef-sums → sommes maqqef par mot.

Vérifications de non-régression : Gn 1,1 = 329 ✓ · Ps 118,26 = 293 ✓ · 23 206 versets, 306 523 mots.

Reste à faire : les embedding de ces 31 versets ont été calculés sur le texte pollué et sont périmés. Sans effet sur la gématrie, mais la recherche sémantique les classe mal.

4. Audit corpus complet contre une seconde source

scripts/audit_verse_word_counts.py compare verset par verset le word_count de la base au Westminster Leningrad Codex morphologique (OpenScriptures morphhb).

23 206 versets comparés, 297 écarts (1,3 %) :

NaturenLecture
segmentation ou numérotation divergente268pas un bug
ketiv/qere : les deux formes conservées26voir § 5
métalangage massorétique suspect2faux positifs (גדולה = « grande »)
maqqef implicite MAM1pas un bug

Aucune glose résiduelle. Les 268 « segmentation » se décomposent ainsi :

  • 215 écarts à −1 : essentiellement les mam-kq-trivial (130 cas) où MAM n’imprime qu’une forme là où le WLC liste ketiv et qeré. Divergence d’édition, pas d’erreur.
  • Décalogue (Ex 20,13-21 · Dt 5,17-30) : MAM et le WLC ne coupent pas les versets au même endroit. Écarts jusqu’à +22. Numérotation, pas contenu.
  • Jos 21,36 et 21,37 : word_count = 0. Ces deux versets sont vides en base alors que le WLC en donne 10 mots chacun. Absents de l’édition MAM (ils manquent dans plusieurs manuscrits massorétiques), Sefaria a renvoyé des chaînes vides. À arbitrer : les laisser vides ou les ingérer depuis le WLC.

5. ⚠️ Trouvaille plus lourde que les gloses : ketiv / qeré comptés deux fois

942 versets contiennent, dans text_clean, les deux formes ketiv et qeré comme deux mots distincts. Leur E est donc la somme des deux lectures, ce qui n’est la valeur d’aucun texte réel.

VersetE en baseE (qeré seul)E (ketiv seul)
Gn 36,5680623627
Gn 36,14755698702
Jr 2,15696637636
Jr 2,16386304296

C’est 4 % du corpus dont le E de verset est faux — trente fois le périmètre des gloses. Le module analysis/integrity.py traite bien le ketiv/qeré, mais sur une liste manuelle de 15 variantes (data/ketiv_qere.json) : les 942 duplications en texte n’ont jamais été vues.

Ce n’est pas corrigé ici, et c’est délibéré : choisir le qeré (lecture reçue) ou le ketiv (lettres écrites) est une décision de méthode, pas un bug à trancher par le code. Elle déplacerait le E de 942 versets et invaliderait toute statistique publiée qui les traverse. Question pour le père et Desktop, avec une recommandation : retenir le ketiv — Bardet compte les lettres écrites, et c’est le principe même des lettres irrégulières et des nequdot.

Liens