Boîtes à outils
Présentation
Le but de ce travail est de créer des petits scripts qui pourront être réutilisables plus tard dans d'autres projets. Ces scripts se focalisent pour l'instant sur l'extraction de données depuis des fichiers XML stockés sur disque. Les donnée extraites sont dans le cas du premier outil simplement replacées dans un autre document XML, tandis que dans le cas du second outil, on analyse ces donnée avec TreeTagger ou Cordial.
Boîte à outils 1
La première partie du travail consiste simplement à analyser un répertoire, à y trouver éventuellement d'autres répertoires à analyser et surtout des fichiers normaux. On présume que tous les fichiers normaux
sont ici des fichiers XML qu'il faudra parser. Ce sont en fait tous des flux RSS, et ils ont donc un schéma commun, ce qui simplifie leur analyse.
Comme on peut le voir, le script a été conçu de manière à être utilisé dans les deux cas de figures. La partie qui nous intéresse pour ce premier exercice correspond principalement aux fonctions goThroughDir()
et filter()
. Le fichier étant ouvert en UTF-8 directement dans Perl, la plupart des problèmes de codage de caractères disparaissent. Il faut toutefois supprimer via la fonction treatEntities()
quelques entités XML restantes.
Une fois le traitement fait, le contenu des balises description
est placé dans un fichier XML. Voici à quoi il ressemble. Une version plus lisible, grâce à une feuille XSLT, est visible par ici.
Boîte à outils 2
TreeTagger
Deuxième partie du travail : adapter le script pour que le contenu des balises description
ne soit plus simplement placé dans un fichier XML, mais soit avant ça analysé par TreeTagger. Première limitation : les binaires Windows de TreeTagger, que l'on utilise ici (y compris sous Cygwin), limitent l'analyse à des blocs de 200 mots. Par chance, aucune balise description
ne contient plus, mais cela signifie tout de même qu'il faudra faire un appel à TreeTagger par balise. De plus, TreeTagger prend en entrée un fichier texte, qu'il faudra donc créer de manière temporaire avant de le passer au programme.
La majeure partie du travail consiste en fait ici découper la chaîne issue des balises description
, afin d'en améliorer l'analyse par TreeTagger. Il faut ensuite créer le fichier temporaire et le passer à TreeTagger. Celui-ci produit un nouveau fichier temporaire en sortie. On peut l'analyser soit avec une expression rationnelle, soit simplement en explosant la chaîne avec un split()
. C'est la seconde solution, un peu plus lente mais nettement plus facile à relire, qui a été choisie. Il n'y a plus qu'à replacer le résultat dans notre fichier XML.
Dans le script, c'est la fonction treetagger()
qui assure toute cette partie du traitement, le reste étant déjà réalisé pour la première partie de la boîte à outils.
Voici à quoi ressemble le fichier XML au final. Une version HTML (générée par XSLT) se trouve par ici.
À noter que la sortie XML et donc la transformation XSL ne fonctionnent pas sous Internet Explorer (testé sous IE6+ et IE7b2p) à cause d'un problème de codage de caractères : certains caractères non-ASCII (mais pas tous) issus de TreeTagger dans la catégorie lemme
ne sont pas transformés en UTF-8, ce qui stoppe l'analyse du fichier dans MSIE. Cela fonctionne néanmoins sous Mozilla Firefox et Opera. Les fonctions d'encodage internes à Perl n'ont pas permis pour l'instant de résoudre le problème, lié au jeu de caractère utilisé dans le fichier french.par (compilé, donc non modifiable) utilisé par TreeTagger.
Cordial
Vient ensuite la dernière partie de la deuxième boîte à outils : l'adaptation du script à Cordial, un analyseur plus complet que TreeTagger mais non disponible en ligne de commande. Après avoir songé à diverses solutions, j'ai finalement choisi de conserver un seul script pour effectuer l'ensemble des tâches : on commence par extraire le texte de chaque fichier XML et on crée un fichier .txt pour chacun de ces fichiers. Le script se met ensuite en pause le temps que l'utilisateur étiquette ses fichiers avec Cordial. Une fois qu'il a terminé, il a simplement à indiquer au programme dans quel répertoire ont été placés les fichiers étiquetés. Le programme reprend alors son cours et produit un fichier XML au format similaire au précédent (c'est donc la même feuille XSL qui se chargera de la transformation). Pour des raisons pratiques (le script a été développé sur ma machine de travail et non pas dans les salles de l'INaLCO, où l'on peut trouver Cordial), cette partie reste encore expérimentale puisque non encore testée avec Cordial.
Retour au sommetBoîte à outils 3
La troisième partie de la boîte à outils est en fait juste débutée : j'ai écrit un analyseur de patrons morphosyntaxiques assez sommaire, qu'il convient d'améliorer avant de pouvoir l'intégrer aux boîtes à outils précédentes. Le but est de pouvoir rechercher dans les résultats produits par TreeTagger et Cordial un ou plusieurs patrons morphosyntaxiques.
Avant de pouvoir l'intégrer à la chaîne de traitement, il faut faire en sorte qu'il ne renvoie pas les résultats directement, mais qu'il les place plutôt dans une variable ou un tableau qui sera retourné par la fonction. Il faut également prévoir de gérer plusieurs patrons morphosyntaxiques, avec ici deux solutions possibles (soit faire plusieurs passages de l'analyseur pour chaque token, ce qui est pratiquement faisable en l'état, soit boucler dans l'analyseur sur les patrons dans l'analyseur, ce qui demande quelques modifications). Il faudra également modifier les fonctions treetagger()
et cordialXml()
afin qu'elles placent le contenu à analyser dans un tableau plutôt que de le transformer directement en XML. Et évidemment, il faudra rajouter de quoi gérer des options supplémentaires pour indiquer un patron morphosyntaxique en ligne de commande (ou un fichier en contenant).