Étapes pour la numérisation de la flore DULAC par un OCR spécifique.
BINARISATION
Les documents sources sont particulièrement dégradés (voir ci contre).
Des taches d'humidité, de nombreux caractères brisés, des traces de la page au recto. Le passage en binaire de cette image est important.
Le meilleur résultat , après de nombreux essais, est fourni par le programme par défaut de Gamera.
L'algorithme Abutaleb disponible donne de meilleurs résultats sur quelques caractères brisés.
Il reste néammoins de nombreux 'petits points' ; j'ai éliminé tous les glyphs dont une dimension est inférieure à 5 pixels; sans cette
élimination le traitement du groupement
par Gamera prend un temps considérable...et laisse de côté de nombreuses combinaisons pertinentes.
J'ai également utilisé le redressement des images
rotation = onebit.rotation_angle_projections(-10,10)[0]
autre_format=onebit.rotate(rotation,core.RGBPixel(255,255, 255), 3)

SEGMENTATION
- La conversion en noir et blanc met en évidence des zones
noires sur les bords; la fonction fournie par Gamera pour la suppession des bords sombres ne donne pas un résultat suffisant.
J'ai contourné cette difficulté par l'algorithme suivant.(complété par un autre plus loin)
détection des glyphs représentant le numéro de page en haut et à gauche (ou à droite suivant que la page est paire ou impaire)
élimination des glyphs à gauche (ou à droite) de cette zone
élimination des glyphs au dessus de cette zone
réalisation d'un découpage par .runlength_smearing()
pour chaque élément de ce découpage,comptage des alternances de noir et de blanc en horizontal pour chaque ligne et somme sur l'ensemble des lignes .
si le nombre d'alternances divisé par demi périmètre est >3
vérification que le pourcentage de glyphs contenus dans le découpage et représentant surement un caractère (confiance>50%)
est faible
si oui ,
découpe de la zone image et stockage pour la restitution HTML, banchiment de la zone
- DETECTION DES PSEUDO-LIGNES
J'ai adapté le toolkit ocr disponible dans Gamera.(class MyPage(Page):) pour détecter les zones colonnes avec accolades; il n'est pas suffisant de faire confiance au classifier car beaucoup d'accolades sont rompues sur de grandes dimensions.
Dans le plugin pagesegmentation, modification de class bbox_merging pour faire varier la hauteur de bounding_box en fonction de la nature des glyphs fusionnés.La typographie fait en effet se chevaucher les lignes dans de nombreux cas.
En fait, le résultat correspond soit à une ligne, soit à une zone pouvant être décomposée en colonnes. D'où une passe recherche de colonnes.
Pour chaque pseudo-ligne, on regarde si il y a des zones blanches verticales significatives et si les zones verticales ainsi séparées sont des accolades ou des morceaux d'accolades. L'image du séparateur potentiel est enregistrée dans un fichier pour une analyse manuelle.Chaque zone ainsi constituée est à nouveau analysée pour séparer les lignes . order_lines
inchangé, lines_to_chars inchangé
- DETECTION DES MOTS (chars_to_words du module ocr_toolkit)
Pour chaque ligne, on cherche les mots.
La fin d'un mot est identifiée , soit par un caractère non alphabétique, soit par un espace entre deux glyphs successifs supérieur à une valeur limite. Cette valeur est fonction de la moyenne de la longueur en pixels des espaces sur la ligne(glyph_n+1.ur_x-glyph_n.ul_x), du nombre d'espaces sur la ligne (de 1,6 à 2*moyenne) .
SENS DES MOTS (processus itératif)
Il faut faire appel à un dictionnaire;j'ai choisi Hunspell,installé sous cygwin; (
http://www.dicollecte.org/download/fr/hunspell_fr_3-4-1.zip);
compte tenu de la nature du livre, j'ai construit des dictionnaires complémentaires , pour les noms de lieux, pour les abréviations et pour les mots latins; les autres mots (noms de genres, de familles...) sont ajoutés au dictionnaire français standard de Hunspell ; environ 900 mots ajoutés.
Chaque mot est envoyé au dictionnaire et on analyse la réponse du dictionnaire.
spell_prog ='hunspell -d/cygdrive/chemin/fr,/cygdrive/chemin/noms_latins,/cygdrive/chemin/abrev,/cygdrive/chemin/communes -a -i utf-8'
proc =
subprocess.Popen(spell_prog, shell=True, stdin = subprocess.PIPE,
stdout = subprocess.PIPE,stderr=subprocess.PIPE)
proc.stdin.write('%s' % word.encode('utf-8'))
resultat,erreur=proc.communicate()
Le fichier .
aff
de Hunspell est modifié pour que les confusions fréquentes (u,n),(l,i) issues du classifier soient prises en compte dans les suggestions.
Si le dictionnaire propose une liste de mots , on calcule la distance de Levenshtein entre le mot envoyé au dictionnaire et chaque mot
reçu. Cette distance est corrigée pour tenir compte des erreurs fréquentes du classifier (
si les mots ne diffèrent que par le remplacement de "u" par "n", la distance est définie nulle) et on garde le meilleur résultat inférieur à 2.
Les mots pour lesquels le dictionnaire ne propose pas de mot acceptable sont enregistrés dans un fichier .csv qui sera traité
ensuite (dans Access) pour enrichir les dictionnaires.
Le mot retenu est enregistré dans un attribut que j'ai ajouté à textline (
class Textline:) du module
classes dans le toolkit Ocr de Gamera
- Traitement de la césure (pour une même page)
Si la ligne se termine par un signe de césure ("-"), on envoie au dictionnaire la concaténation du début du mot (fin de ligne n) et de la fin du mot (début de ligne n+1); le mot retenu est découpé pour reconstituer la césure.
RESTITUTION format html
J'ai souhaité conserver une présentation aussi proche de l'original que possible.
Les mots ou les signes sont positionnés en absolu , à la position du groupe de glyphs sur la page source.
Des polices courantes (mais taille imposée) conviennent , sauf pour la police utilisée pour les espèces (exemple: ).

J'ai créé pour la restituer approximativement une police spécifique , elle comporte aussi les caractères spéciaux utilisés par le typographe (exemple: )
exemple restitution
J'ai utilisé le programme Fontforge (
http://fontforge.sourceforge.net) pour créer cette police à partir des glyphs d'origine.
Cette police est "embedded" dans les pages HTML.
Les images repérées dans les phases précédentes et mises à l'écart pour la mise en texte sont remises à leur position exacte.
- VERIFICATIONS ET CORRECTIONS MANUELLES
J'ai procédé à de nombreuse corrections 'semi manuelles'; par exemple pour "c" (souvent confondu avec "e"), pour "u" (confondu avec "n"), "m" (confondu avec 'ni') etc..
J'ai collecté et visualisé dans une fenêtre multi image les glyphs classées comme "c" (par exemple) à faible confiance (programme python), et changé leur désignation (manuel), puis remplacé le glyph d'origine dans sa page (programme Python).
La disposition régulière des genres et espèces permet une vérification (suite cohérente de nombres pour la police considérée);Ces contrôles ont été faits en VBA Access et ont permis l'établissement de la table des matières.
Le couplage avec la base de données BDNF a permis d'établir une correspondance probable entre les désignations de la flore et une désignation plus moderne
RESULTAT:
Il reste encore quelques anomalies:
Césure entre une page et la suivante
Espaces entre deux parties d'un mot
Restitution chevauchant deux zônes de texte contigües
Peut être images incomplètes ou texte incomplet
Abscence (volontaire) de l'introduction, de la table des matières d'origine (nombreux caractères grecs!!).
Cependant le texte est accessible et des recherches de caractères sont possibles pour des exploitations automatiques.
Avis aux amateurs!!!
La suite page suivante....