Prison et océrisation

Durant la semaine du 10 au 14 août 2020, j’ai eu la chance de participer à titre d’auxiliaire d’enseignement à l’école d’été Sherbrooke derrière les barreaux. Ce cours intensif était une initiative conjointe du Cégep de Sherbrooke et de l’Université de Sherbrooke, où 20 étudiants et étudiantes répartis équitablement entre les deux institutions, devaient s’immiscer dans les archives judiciaires de la vieille prison Winter à Sherbrooke.

© Michel Gagnon

Cinq équipes avec des mandats de recherches différents ont donc dû s’approprier les sources pour en extraire des données. La clientèle étudiante devait en définitive concevoir une vignette collective (par équipe) et une vignette individuelle à publier sur une plateforme web conçue par mes soins pour l’école d’été.

Le but de cet article n’est pas de parler du projet de la Prison Winter, même si je suis bien parti, mais plutôt de parler d’océrisation. Peut-être vous posez-vous alors deux questions, qu’est-ce que l’océrisation et quelle est son lien avec la Prison Winter?

Tout d’abord, par océrisation, j’entends les techniques de reconnaissance optique de caractères, donc les méthodes d’extraction de contenus textuels à partir d’ images. Autrement dit, il s’agit de convertir une matrice de pixels en des caractères « encodables » par l’ordinateur. Cela m’amène à la seconde question. Cette technique aurait grandement facilité le travail de nos étudiants, mais le corpus qu’ils ont traité ne le permettait pas ou très difficilement. Tout au long de la semaine, j’ai pu observer ces registres d’écrou et ces «day books» écrits à la main, ce qui m’a fait réaliser l’apport de l’océrisation dans l’étude des sources plus récentes.

Océriser mes sources

Dans le cadre de mon mémoire, j’utilise l’océrisation pour remplir la base de données des acteurs alimentaires, mais également pour plusieurs autres tableaux sur le prix des denrées. Initialement, je prévoyais utiliser EasyScreenOCR pour y parvenir, et ce, parce que le logiciel est peu dispendieux, permet de convertir des images ou des captures d’écran et fonctionne avec l’allemand et le français. Les résultats sont plutôt bons, mais étant donné la lourdeur du processus, je devrais probablement y passer plusieurs mois…

J’ai donc finalement pris la décision de programmer moi-même mon script pour océriser. Ce processus se fera en cinq étapes:

  1. Acquérir les documents au format PDF ou image.
  2. Éditer les images pour augmenter le contraste entre le texte et la page
  3. Extraire le texte en prenant en considération la structure de la page
  4. Nettoyer le résultat de l’océrisation, pour diminuer le bruit et corriger les possibles erreurs
  5. Convertir le texte en tableau de données (CSV)

Problèmes

Si j’ai déjà bien réfléchi à la manière dont je vais procéder à l’océrisation, quelques problèmes se révèlent. D’une part, choisir le langage de programmation le plus adapté à mes besoins. Naturellement, je serais porté d’aller vers le Python, puisque je connais bien le langage et que toutes les librairies nécessaires existent sur celui-ci. Malgré tout, j’ai décidé d’y aller avec son principal concurrent en sciences des données, soit le langage R.

J’ai choisi R, parce qu’il accélère à mon sens la programmation par sa syntaxe encore plus minimaliste que celle de Python, mais surtout parce que l’outil se spécialise dans les sciences des données, là où Python se veut plus généraliste. Dans les faits, j’aurais pu faire la même chose avec Python, mais je pense que j’ai le goût d’expérimenter, et, je dois avouer, j’aime beaucoup le fonctionnement de R malgré mon amour pour Python.

Le second problème, c’est l’acquisition des documents en PDF ou en image… Pour la plupart des documents, ce n’est pas un problème, puisque je les ai numérisés moi-même lors de ma visite dans les archives. Par contre, pour les annuaires d’adresses, je n’ai accès qu’à une version web qui rend difficile l’automatisation de l’océrisation. Avec EasyScreenOCR, j’aurais dû faire des captures d’écran de toutes les zones pertinentes, mais le processus est interminable…

J’ai donc décidé d’analyser l’application de visualisation des archives pour me rendre compte qu’ils utilisent des tuiles pour alléger le chargement des pages. Cela signifie que je ne peux pas télécharger l’image en haute résolution directement… MAIS, les tuiles possèdent des URLs logiques, puisque le dernier paramètre indique la place dans la matrice de tuiles d’une page. En faisant une double boucle, nous pouvons donc naviguer à travers toutes les tuiles d’une page, les fusionner pour ne faire qu’une image, puis enregistrer la page résultante.

Pour fusionner ces tuiles, j’ai utilisé la librairie EBImage

library("EBImage")

Puis j’ai défini certaines variables de base:

imgurl = "" #URL de la tuile active
resultat = list() #Tableau des tuiles d'une page
ligne = 0 #Ligne dans le tableau
colonne = 0 #Colonne dans le tableau
annee = 1921 #Choix de l'année
page = 500 #Page de début du processus
pageFin <- 500 #Page de fin du processus (le signe <- est équivalent à = en R)

Puis je fais trois boucles imbriquées. La première permet de faire toutes les pages de ma requête, la seconde de faire chaque ligne de la matrice de tuile, puis la troisième de faire chaque cellule de la matrice.

while (page <= pageFin) {
  ligne = 0
  resultat = list()
  while (ligne < 8) {
    colonne = 0
    while (colonne < 11) {
      imgurl = paste("URL DE BASE DU FICHIER",annee, "/NOM DU FICHIER DE BASE", annee, "_0", page, ".jpg/TileGroup0/4-" , colonne , "-" , ligne , ".jpg", sep="")
      img <- readImage(imgurl)
      x <- resize(img, 256, 256)
      resultat <- c(resultat, list(x))
      colonne = colonne + 1
    }
    ligne = ligne + 1
    print(paste("Image ", page, " (", ligne, " de 8)"))
  }
  print(paste("Enregistrement de ", page, " en cours"))
  resultat <- combine(resultat)
  resultat <- tile(resultat, 11, 0)
}

Bien évidemment, il faut remplacer les mots en majuscules par les bonnes valeurs. On pourrait également ajouter la ligne suivante pour enregistrer le résultat sur l’ordinateur:

writeImage(resultat, paste(annee, "_page", page, ".jpeg", sep=""), quality = 100)

Chaque image aurait un nom du genre 1921_page500.jpeg, 1921_page501.jpeg, etc. On pourrait également conserver les pages dans un autre tableau pour les fusionner au format PDF à la fin. De même, si je souhaite éditer et océriser mes images directement dans le script, je devrais le faire après resultat <- tile(resultat, 11, 0). Pour l’édition des images, j’ajouterai la libraire Image Magick, puis TesseractOCR pour l’océrisation. C’est un peu rapide, mais je ne souhaite pas en faire un tutoriel pour l’instant.

En raison du confinement, je risque de passer la plupart de mes vacances hivernales à travailler sur mon mémoire et sur la plateforme Historiamatica, donc, j’essayerai de donner suite à cet article le plus tôt possible! À bientôt!

0 commentaire sur “Prison et océrisationAjoutez le votre →

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *