site de Fabien Torre


Programmation et Linux pour les textes : une introduction

Ce support constitue une introduction à la programmation dédiée aux textes. Nous évoquons les applications possibles et présentons deux langages de programmation candidats. Ensuite nous discutons des formats des fichiers traités. Enfin, nous décrivons l'environnement dans lequel nous allons travailler (Linux) et défendons l'idée qu'il est particulièrement pertinent pour automatiser le travail sur les fichiers et les textes.

Un objectif est d'être capable d'exploiter des corpus de textes non structurés (des textes purs) ou semi-structurés (des textes balisés). En particulier, nous voulons pouvoir réaliser des extractions d'informations depuis ces textes et cela automatiquement. Il pourra par exemple s'agir de découverte d'informations linguistiques (co-occurrences, concordancier, reconnaissance d'entités, etc.). Enfin, nous considérerons que les textes sources peuvent se trouver sur le Web.

Un second but est de produire automatiquement des textes et des documents. Ce sera par exemple l'édition numérique d'un ouvrage, la bascule d'un contenu d'un format à un autre ou encore la mise en forme du résultat d'une tâche d'extraction. Dans ce dernier cas, nous avons donc à traiter des fichiers textuels en entrée et en sortie.

Ces traitements sont envisagés pour de grands volumes de documents/fichiers/textes : cela justifie de devoir programmer pour automatiser ces tâches, mais aussi de nous détacher des outils imposant une interface graphique et des actions manuelles.

Langages de programmation pour les textes

Une première étape est donc le choix d'un langage de programmation pour traiter des documents/fichiers/textes. Outre cet objectif, nous souhaitons de plus nous appuyer sur les principes définis durant le cours d'algorithmique. Autrement dit, nous cherchons un langage doté d'opérations élémentaires sur les textes et qui soit intuitif pour tous, lisible, non ambiguë.

Le langage Python

Python nous fournit sa philosophie, voici le début de son Zen :

Préfère :
      la beauté à la laideur,
      l'explicite à l'implicite,
      le simple au complexe
      et le complexe au compliqué,
      le déroulé à l'imbriqué,
      l'aéré au compact.
Prends en compte la lisibilité.
Les cas particuliers ne le sont jamais assez pour violer les règles.
Mais, à la pureté, privilégie l'aspect pratique.
Ne passe pas les erreurs sous silence,
... ou bâillonne-les explicitement.
Face à l'ambiguïté, à deviner ne te laisse pas aller.
Sache qu'il ne devrait y avoir qu'une et une seule façon de procéder
[...]

Nous y trouvons des principes compatibles avec notre pratique de l'algorithmique. En revanche, nous n'y voyons aucune mention des fichiers ou des textes. Ajoutons quelques caractéristiques à retenir de Python :

  1. Langage généraliste, initialement apprécié pour l'enseignement,
  2. pas de déclaration de variables,
  3. pas de déclaration des types,
  4. conversions de types à expliciter,
  5. utf8 par défaut, flux et encodages cachés,
  6. console interactive,
  7. librairie et notation objet nécessaires pour les expressions régulières, pour les interactions avec le système d'exploitation, etc.
  8. des algorithmes et des librairies à succès déjà disponibles.

Les programmeurs de Python en font différents usages :

  • Programmation « algorithmique »,
  • usage de librairies réputées,
  • concours de programmation et coaching.

Le langage Perl

Plusieurs caractéristiques semblent pertinentes pour le travail sur les textes :

  • Langage glu pour passer d'un format à un autre et interfacer différentes applications,
  • syntaxe simple pour les fichiers,
  • facile pour les expressions régulières.

Malgré ces points répondant à nos attentes sur les textes, d'autres points propriétés de Perl : Perl a été voulu proche du langage naturel, il permet de dire une même chose de plusieurs manières différentes, il permet également des non-dits, et la sémantique d'une expression dépend du contexte... Ces idées sont clairement contraires à nos principes algorithmiques.

Finalement, ce qu'il nous faut retenir de Perl :

  1. Pensé pour les textes,
  2. déclaration obligatoire des variables en mode strict,
  3. pas de déclaration des types mais trois types « visibles »,
  4. conversions de types implicites,
  5. nécessité d'expliciter les flux et les codages,
  6. intrinsèquement lié à Unix/Linux,
  7. interfaçage facile avec d'autres outils,
  8. fichiers, expressions régulières : aucune librairie nécessaire.

Et différents usages que l'on peut observer de Perl :

  • Programmation « algorithmique »,
  • écriture de poèmes en Perl... ou de programmes d'une seule ligne...
  • recherche des programmes les plus courts, sur une seule ligne.

Bilan sur les langages

Python est plus proche de l'algorithmique mais généraliste et pas dédié aux textes. Perl est pensé pour les textes mais plus éloigné de nos préoccupations algorithmiques.

Quel que soit le langage choisi, nous en ferons une utilisation la plus proche possible de nos algorithmes et en restreignant au minimum l'utilisation de modules développés par d'autres. Une idée clef est qu'il doit être facile de basculer d'un langage de programmation à un autre, si l'algorithme à implémenter est clairement défini.

Évoquons enfin le langage JavaScript qui peut servir à exploiter les textes de documents Web au sein d'un navigateur.

Formats des corpus et des productions

Commençons par les formats qui ne vont pas nous intéresser, ils sont dits fermés, binaires ou propriétaires. Ils sont reconnaissables aux caractéristiques suivantes :

  • obligation d'utiliser le logiciel qui a créé le document,
  • sensible au changement de version du logiciel,
  • interopérabilité nulle ou limitée aux logiciels du même éditeur,
  • pérennité liée à celle du logiciel,
  • mélange du contenu et de la mise en forme,
  • sémantique difficilement appréhendable,
  • taille importante des fichiers.

Nous en déduisons que ces formats ne sont pas appropriés aux traitements que nous visons. Par opposition, il nous faut des formats ouverts, basés sur des fichiers textuels.

Un premier exemple d'un tel format est le format CSV (Comma-separated values). Il est issu de tableurs, il représente des cases dans un fichier texte, les cases étant délimitées par un symbole convenu, la virgule par exemple.

Le langage html, dédié au Web, est lui aussi ouvert (le formalisme est connu de tous). Les documents html prennent la forme fichiers textes modifiables avec n'importe quel éditeur, ils sont composés essentiellement de texte, parsemé de balises. Cependant, un document html contenant des éléments de mise en forme ne facilitera pas l'extraction d'éléments sémantiques. Nous préférerons donc des corpus de documents Web purement sémantiques, éventuellement avec du code CSS associé pour la mise en forme.

Le format Markdown propose une syntaxe plus simple que le html pour décorer du texte. Des outils disponibles pour tous permettent ensuite de passer automatiquement du format markdown à d'autres formats comme html, epub, LaTeX, etc.

LaTeX est un format basé sur du texte et des instructions, il est ouvert. Les instructions LaTeX permettent de structurer le document. LaTeX est plus ancien que HTML et est lui destiné à l'édition papier. LaTeX désigne aussi le programme qui transforme un fichier LaTeX en un fichier pdf. Un intérêt évident pour nous serait de produire automatiquement du code LaTeX, pour finalement obtenir des pdf de qualité.

En conclusion de cette section, nous devons être capables de produire automatiquement ces formats et ainsi bénéficier des outils développés par ailleurs pour chaque format. En entrée, il faudrait également être capables de lire certains de ces formats : du texte seul ou du CSV. Exemples d'applications :

  • extraire les informations contenues dans un fichier CSV, les produire en html/css et les visualiser à l'aide d'un navigateur Web,
  • compter les mots utilisés dans une œuvre au format texte et produire les compteurs obtenus dans un fichier CSV,
  • récupérer automatiquement des données depuis le Web et produire un rapport au format pdf.

L'environnement : GNU/Linux

Travaillant avec des formats ouverts, il nous semble cohérent de travailler avec des logiciels libres et, en particulier, avec le système d'exploitation Linux. Peu importe pour nous qu'il existe différentes versions de Linux (on parle de distributions Linux : Ubuntu, Mint, Debian, Mandriva, Gentoo, Fedora, etc.). Toutes disposent nativement de Perl, de Python et des autres outils dont nous aurons besoin : la console, un éditeur de textes, un navigateur Web. À noter que Linux peut cohabiter avec Windows sur une même machine et que MacOS est un système d'exploitation appartenant à la même famille que Linux.

De plus, Linux présente de réels avantages pour le traitement des textes : sa gestion des fichiers, son terminal pour exécuter des instructions sans interface graphique et des outils puissants pour opérer sur les fichiers textuels. Linux permet un premier pas facile et naturel vers le traitement par lot et la programmation sur de grands volumes de documents.

Les fichiers sous Linux

Le système de fichiers de Linux est, sans surprise, organisé en une hiérarchie de répertoires et de fichiers. Le premier point est de maîtriser ces deux notions : fichiers et dossiers. Le deuxième point est de savoir à chaque instant où vous vous trouvez dans cette arborescence, et où sont les fichiers qui vous intéressent.

Notations principales :

  • les deux points .. désigne le dossier parent du dossier dans lequel nous nous trouvons,
  • l'étoile * désigne tous les fichiers du dossier courant.

Commandes Linux

Commandes pour la navigation dans l'arborescence de fichiers :

  • cd : permet de changer de dossier,
  • ls : affiche le contenu d'un dossier.

Commandes pour le traitement de fichiers textuels :

  • wc  : affiche les nombres de lignes, de mots et de caractères d'un fichier texte,
  • grep : recherche une chaîne de caractères dans du contenu textuel,
  • cut  : extrait des colonnes depuis un fichier texte de type CSV,
  • sort : trie les lignes d'un fichier par ordre alphabétique,
  • uniq : supprime les lignes successives identiques dans un fichier texte.

Notons également la commande find qui effectue une recherche sur les noms des fichiers (et pas sur leurs contenus comme le fait grep).

Peuvent aussi nous être utiles, des outils d'extraction de texte depuis des documents non textuels :

  • pdftotext : extrait le texte d'un fichier pdf,
  • tesseract : OCRise une une image.

Enfin, les interpréteurs de programmes auxquels nous confierons notre code : python3 et perl.

Syntaxe des instructions Linux et exemples

Passons en revue les syntaxes possibles pour une commande Linux. La syntaxe plus simple se réduit au nom de la commande.

ls # montre le contenu du dossier où l'on se trouve

Il est possible de passer des paramètres sur lesquels va opérer la commande. Typiquement, nous aurons souvent un seul paramètre correspondant au nom d'un fichier ou d'un dossier à traiter.

ls Documents    # montre le contenu du dossier 'Documents'

cd Documents    # nous déplace dans le dossier 'Documents'
cd ..           # remonte au niveau immédiatement supérieur

wc document.txt # effectue des comptages dans le fichier 'document.txt'

grep coucou document.txt # affiche les lignes du fichier 'document.txt' contenant le mot 'coucou'
grep coucou *            # affiche les lignes contenant le mot 'coucou' dans les fichiers du dossier courant

pdftotext document.pdf   # extrait le texte du fichier 'document.pdf'

# applique une reconnaissance de caractères à l'image 'scan.png' et place le texte dans le fichier 'résultat.txt'
tesseract scan.png résultat

perl premier.pl   # exécute le programme Perl   'premier.pl'
python premier.py # exécute le programme Python 'premier.py'

Outre les paramètres à traiter, le comportement de chaque commande peut-être modifié par des options.

ls -l     # affiche le contenu du dossier avec plus de détails
ls -l -h  # ... et propose un affichage plus lisible des tailles des fichiers
ls -lh    # idem en plus court

wc -l document.txt # affiche le nombre de lignes     dans le fichier 'document.txt'
wc -w document.txt # affiche le nombre de mots       dans le fichier 'document.txt'
wc -c document.txt # affiche le nombre de caractères dans le fichier 'document.txt'

# recherche dans les fichiers et les sous-dossiers, du mot exact, minuscules ou majuscules
grep -rwi coucou *

# découpe selon les virgules et extrait la deuxième colonne d'un fichier CSV
cut -d, -f2 tableau.csv

find -name "*.html" # affiche les emplacements des fichiers html

pdftotext -layout document.pdf     # extrait le texte du fichier pdf en préservant la mise en page
tesseract -l fra scan.png résultat # OCRrise l'image 'scan.png' sachant que le contenu est en français

Les options ont souvent des dénominations alternatives longues, plus lisibles.

# comptages avec wc
wc --lines document.txt
wc --words document.txt
wc --chars document.txt

# recherche avec grep
grep --recursive --word-regexp --ignore-case coucou *

# découpage et extraction avec cut
cut --delimiter=, --fields=2 tableau.csv

Enfin, deux commandes peuvent être enchaînées : le résultat textuel de la première est transmis à la deuxième comme entrée à traiter. Cela se matérialise par le symbole pipe (|).

# compte le nombre de lignes contenant le mot 'coucou' dans le fichier 'document.txt'
grep coucou document.txt | wc -l

# affiche la deuxième colonne d'un fichier CSV par ordre alphabétique, sans doublon
cut -d, -f2 tableau.csv | sort | uniq

# affiche le nombre de fichiers html présents dans la sous-arborescence
find -name "*.html" | wc -l

Accueil > Enseignement > Cours > Programmation > Textes et Linux
(contenu mis à jour )
site de Fabien Torre, université de Lille

Description

Survoler un lien de navigation pour lire sa description ici...