Travaux pratiques 1: expressions régulières

L’objectif de ces travaux pratiques est d’utiliser des expressions régulières en Python pour transformer des documents en format texte issus de documents PDF.

Ces travaux pratiques ont plusieurs objectifs pédagogiques, notamment:

  • savoir utiliser Docker et savoir créer des Dockerfiles, dans le but à moyen terme de vous permettre de créer des jobs de NLP

  • savoir créer et utiliser des expressions régulières, notamment en Python, pour réaliser des traitements avec des automates finis

  • savoir utiliser Github/Gitlab pour stocker votre code et créer des Pull request/Merge requests

Prérequis techniques: installation des outils nécessaires

La réalisation de ces travaux pratiques nécessite d’avoir sur votre poste de travail les outils Git, Docker Desktop et Python. En fonction de votre système d’exploitation, il y a plusieurs manières d’installer ces outils.

Linux et macOS

Sur ces deux systèmes, les trois outils ci-dessus s’installent facilement et ne nécessitent pas de configuration avancée. Sur macOS, Python et Git sont normalement installés par défaut.

Windows 11/10

Sous Windows, il y a deux possibilités, soit travailler directement sous Windows en mode « natif » dans un environnement de commande de type Powershell, soit travailler dans une machine virtuelle Linux via WSL.

Docker Desktop peut fonctionner directement en mode natif sous Windows ou à l’intérieur de WSL: je recommande fortement cette deuxième solution. Voici donc les deux premières étapes recommandées, que vous choisissiez de travailler en Windows « natif » ou sous WSL2:

Ensuite, pour installer Git et Python, il a deux options, selon que vous souhaitiez utiliser le mode Windows « natif » ou WSL2.

Windows natif

Il faut installer les versions de Python et de Git fournies ici:

WSL2

Pour l’utilisation de WSL2, vous devez lancer une machine virtuelle Linux: via le menu Démarrer sous Windows, vous devriez avoir une commande « Ubuntu » que vous pouvez utiliser pour lancer un terminal. Une fois votre machine virtuelle lancée, vous pouvez installer Git et Python ainsi:

sudo apt-get install git python3.11

Pour utiliser la commande docker depuis WSL2, il faut que « Docker Desktop » soit lancé côté Windows. Pour vérifier que tout fonctionne correctement, vous pouvez lancer la commande docker --version qui doit vous renvoyer quelque chose comme:

gasilber@toupatou:~$ docker --version
Docker version 24.0.6, build ed223bc

Cloner le dépôt Git depuis Github ou Gitlab

Le point de départ de votre travail se trouve dans un dépot Git sous Github ou Gitlab (vous pouvez partir de l’un ou de l’autre, le contenu est identique).

Il faut cloner le contenu de ce dépôt sur votre machine afin de pouvoir effectuer des modifications sur le code. Si vous avez un compte Github ou Gitlab, vous pouvez d’abord faire un fork du dépôt dans votre espace sur Github ou Gitlab et ensuite cloner ce dépôt forké. L’avantage de cette dernière approche est que vous pourrez proposer une pull-request (Github) ou une merge-request (Gitlab) au dépôt principal. Vous pouvez également opter pour une option plus simple et cloner le dépôt principal: dans ce cas le travail sera à me rendre sous la forme d’un patch (voir la fin de ce document).

Après vous être positionné dans Powershell (Windows) ou Bash/zsh (WSL, macOS ou Linux) dans le répertoire où vous souhaitez travailler, la commande permettant de cloner le dépôt Git est la suivante:

git clone https://github.com/legistix/pdfextract

où l’URL https://github.com/legistix/pdfextract est à adapter en fonction de vos choix (Github, Gitlab, fork du dépôt chez vous ou non).

Travail à faire: transformer le contenu d’un PDF en un fichier XML structuré

Le fichier README liste les différentes commandes nécessaires à la transformation en utilisant Docker.

En résumé, sous Windows WSL2, macOS ou Linux, après avoir modifié le code Python lors de l’exercice, vous devrez lancer les commandes suivante, en étant positionné à la racine du dépôt Git (là où se trouve le fichier Dockerfile):

# Commandes sous WSL2, macOS ou Linux
# Reconstruction du conteneur (facultatif si le code Python n'a pas changé)
docker build -t pdftools .
# PDF vers texte (à ne faire qu'une seule fois)
docker run -v ./exemples:/data -it pdftools /usr/bin/pdftotext -layout /data/pourvoi_n_21-24.923_30_11_2023.pdf
# Texte vers Markdown 
docker run -v ./exemples:/data -it pdftools /venvs/pdftools/bin/text2md /data/pourvoi_n_21-24.923_30_11_2023.txt /data/pourvoi_n_21-24.923_30_11_2023.md
# Markdown vers XML
docker run -v ./exemples:/data -it pdftools /venvs/pdftools/bin/md2xml /data/pourvoi_n_21-24.923_30_11_2023.md /data/pourvoi_n_21-24.923_30_11_2023.xml

Sous Windows natif en Powershell, vous devrez remplacer dans toutes les commandes ci-dessus ./exemples par .\exemples.

En suivant ces différentes étapes, vous devez maintenant être en mesure d’extraire le texte d’un PDF du répertoire exemples, de transformer ce texte en Markdown et de transformer le Markdown en XML.

Transformer le texte en Markdown avec des expressions régulières

L’ojectif est d’obtenir un document texte « normalisé » en Markdown à partir du fichier texte issu d’un PDF de la cours de cassation. Pour cela, vous devrez modifier le fichier pdfextract/scripts/text2md.py.

Cette normalisation se fera avec des expressions régulières du module Python re.

Cet outil doit notamment ajouter un titre au document Markdown de la forme Pourvoi NUM du DATE.

Supprimer les sauts de page, entêtes et autres. Exemple:

rapporteur, Mme Chauve, conseiller, et Mme Cathala, greffier de chambre,
                                           Page 1 / 2
  Pourvoi N°21-24.923-Deuxième chambre civile                        30 novembre 2023
la deuxième chambre civile de la Cour de cassation, composée des président et conseillers précités, après en avoir
délibéré conformément à la loi, a rendu la présente décision.

sera transformé en:

rapporteur, Mme Chauve, conseiller, et Mme Cathala, greffier de chambre,



la deuxième chambre civile de la Cour de cassation, composée des président et conseillers précités, après en avoir
délibéré conformément à la loi, a rendu la présente décision.

reconstruire des paragraphes continus, sans saut de ligne au milieu d'un paragraphe. Exemple:

rapporteur, Mme Chauve, conseiller, et Mme Cathala, greffier de chambre,

la deuxième chambre civile de la Cour de cassation, composée des président et conseillers précités, après en avoir
délibéré conformément à la loi, a rendu la présente décision.

doit être transformé en:

rapporteur, Mme Chauve, conseiller, et Mme Cathala, greffier de chambre,
la deuxième chambre civile de la Cour de cassation, composée des président et conseillers précités, après en avoir
délibéré conformément à la loi, a rendu la présente décision.

Supprimer tous les retours chariot dans un paragraphe. Exemple:

rapporteur, Mme Chauve, conseiller, et Mme Cathala, greffier de chambre, la deuxième chambre civile de la Cour de cassation, composée des président et conseillers précités, après en avoir délibéré conformément à la loi, a rendu la présente décision.

Ne garder qu’une seule ligne vide entre deux paragraphes

Vous pouvez ajouter toute amélioration que vous jugerez utile à cette liste de transformations.

Transformer le Markdown en XML avec zonage des différentes parties du document

L’objectif ici est de transformer le document Markdown obtenu à l’étape précédente en un document XML plus structuré, et découpé en zones comme les PDF fournis par le site de la Cour de cassation Judilibre.

Pour cela, vous devrez modifier le fichier pdfextract/scripts/text2md.py.

Les zones sont notamment:

  • Entête

  • Exposé du litige

  • Motivation

  • Moyens

  • Dispositif

Le XML généré doit transformer chaque paragraphe markdown en éléments <p>.

Chaque zone doit être de la forme <div class="NOM-ZONE">...</div>. L’élément racine sera appelé <decision>.

Ce zonage se fera avec des expressions régulières du module Python re. Vous pouvez également utiliser des outils complémentaires si vous le jugez utile.

Livrable de ces travaux pratiques

Trois possibilités:

  • la création d’un patch (fichier texte) obtenu en lançant la commande: git diff > nom_de_votre_patch.txt à la racine du dépôt Git. Ce fichier texte sera à m’envoyer par email.

  • création d’une pull request Github de ce dépôt après avoir fait un « fork » dans votre propre espace Github

  • création d’une merge request Gitlab de ce dépôt après avoir fait un « fork » dans votre propre espace Gitlab