jeudi 29 juin 2023

ALEXI, EXtracteur d'Information

Ce billet présente une module d’extraction d’information pour les règlements municipaux en format PDF, qui sert à alimenter un moteur de récherche. Il est la première partie d’une série de billets qui détailleront la conception et implémentation de celle-là.

Justification

Bien qu’il existe des solutions commerciales et en logiciel libre qui semblerait à première vue posséder cette fonctionnalité, j’ai choisi de l’implémenter au complet, pour quelques raisons à la fois pédagogiques et pratiques:

  1. Il est d’abord hors de question pour une petite municipalité de payer un GAFAM pour ce service, qui implique aussi une configuration infonuagique parfois très lourde et alambiquée, hors de la portée d’un organisme sans personnel dédié en TI.
  2. Les logiciels libres sont performants, et servent bien à certains cas d’usage communs sans trop de configuration. Par contre, lorsqu’il sera question de prendre en charge la structure des documents, cela nécessitera quand même un effort de programmation identique à ce qui sera détaillé ci-dessous.
  3. Les SoLR, ElasticSearch, etc, de ce monde sont aussi assez lourds par rapport à l’installation et la configuration, et fonctionnent en mode client-serveur, alors que mon objectif est de bâtir une fonctionalité très légère qui peut rouler hors connexion et être téléchargée sur un téléphone.
  4. Tout ce travail d’extraction d’information sera encore utile au moment où il sera question de passer à un système plus robuste.

Ici il sera question de parler uniquement de cette phase d’extraction, prise en charge par ALEXI, alors que l’application de recherche (qui s’appelle, bien sûr, SÈRAFIM) sera détaillée plus tard.

Pour le moment, nous allons utiliser Whoosh comme moteur de recherche étant donné qu’il est bien documenté et performe bien avec un minimum de codage superflu. L’aboutissement de ce document sera un petit API REST qui répondra à des requêtes au sujet des règlements d’urbanisme de la ville de Sainte-Adèle.

Problématique

Pour faciliter l’accès du citoyen aux informations contenues dans les règlements municipaux, il est important de pouvoir le diriger non seulement vers le document en soi mais vers la section ou article spécifique qui répond à sa question. Dans le cas d’exemple des règlements d’urbanisme, un seul document peut contenir des centaines de pages et d’articles. Même si on permettait une recherche sur les alinéas individuels, ceux-ci ont besoin d’être présentés avec leur contexte de chapitre, section, etc, pour être compris. Il est alors obligatoire de prendre en charge non seulement le texte du règlement mais également sa structure.

Cette structure est représentée dans le schéma d’un moteur de recherche, qui est généralement composé de champs qui correspondent aux composants et informations auxiliaires d’un document.

Dans le cas des règlements d’urbanisme, il existe heureusement une structure bien définie, plutôt respectée dans la rédaction desdits règlements. Pour faciliter la génération d’un API REST avec FastAPI, nous allons définir cette structure avec des types Pydantic, comme vous pouvez voir dans le module alexi.types.

La tâche alors se résume à:

  1. Extraire le texte des documents de la ville. Idéalement ceux-là viendrait dans un format, comme HTML ou même DOCX, qui conserve des aspects structurels, mais la plupart du temps ces versions sources ne sont accessibles que par les employés de la ville, ou résident même sur des ordinateurs individuels. Alors, il est nécessaire de prendre en charge les documents en format PDF.
  2. Extraire aussi des aspects pertinents de la mise en page des documents. En absence de structure explicite, des éléments comme la taille de police, l’interligne, et la couleur du texte peuvent être très utile pour reconstruire cette structure.
  3. Extraire et traiter les tableaux séparément du texte. Ceux-ci ont une linéarisation qui les rend au mieux incompréhensible, au pire incorrects, lorsqu’ils sont traité comme des lignes de texte.
  4. Induire la structure du texte (alinéas, énumérations, définitions, articles, sections, chapitres).
  5. Conserver les positions des éléments pertinents dans le PDF pour que l’utilisateur puisse les retrouver et consulter dans leur forme originale.

Étapes

Dans les prochains textes de cette série nous allons examiner de plus près les étapes pour faire cette extraction d’information, avec quelques approches qui pourraient être adaptées à d’autres villes ou domaines.