Utilisation et intégration de TreeTagger
Installation
Il faut au préalable installer le logiciel TreeTagger sur sa machine. Le logiciel fonctionne sur Windows, OS X et Linux.
Intégration à BOA2
Le code ayant été organisé de manière relativement propre, l'intégration de TreeTagger au workflow existant est très simple. Conceptuellement, il s'agit de faire les 3 choses suivantes :
- dans parcours.pl, si la variable d'environnement TREETAGGER_PATH existe, on passe un argument supplémentaire à la procédure main
- le fonction write_result est modifiée de façon à retourner le chemin du fichier texte généré
- la fonction main se sert du chemin de treetagger et de celui du fichier généré pour invoquer une commande shell qui fait le travail
On traite donc le fichier texte écrit en sortie qui contient le contenu de toutes les rubriques et qui est converti en XML par la fonction treetagger2xml.
La variable TREETAGGER_PATH
J'ai décidé de faire reposer l'exécution, conditionnelle, du chemin de code utilisant TreeTagger à la présence ou non de la variable d'environnement TREETAGGER_PATH. Cette variable n'est pas créée lors d'une installation, il faut donc la fixer au moyen de la suite de commande suivantes.
export TREETAGGER_PATH
Notez qu'elle la variable ainsi définie n'est valable que pour la session de bash en cours.
Utilisation de TREETAGGER_PATH
Cette variable contient le chemin vers le programme à utiliser. Le chemin complet de treetagger est complété dans le code avec le nom tree-tagger-french-utf8 codé en dur. Puisqu'on utilise la fonction Perl system qui va exécuté la chaîne passée en paramètre, on s'expose à un risque de sécurité si on utilise la variable complète elle-même.
Par exemple, si on fixe dans le shell une commande malicieuse plutôt qu'un chemin, le code Perl va l'exécuter.
(puis dans le code perl)
system("$ENV{'TREETAGGER_PATH'} < inFile.txt > outFile.txt");
La première commande est à taper dans le shell, tandis que la troisième ligne représente l'appel à system dans le code. Notez la présente d'une espace après l'étoile dans la variable d'environnement. Si elle est absente, rm tentera de supprimer un fichier ayant pour nom */treetagger-french-utf8. Avec l'espace, rm supprime tous les fichiers du répertoire et tente également de supprimer un fichier nommé /treetagger-french-utf8.
Mon répertoire de code a fait les frais de l'expérimentation, heureusement que je travaille avec git et que j'avais un éditeur de code ouvert avec la plupart des fichiers non suivit.
Ce n'était donc pas la meilleure idée du monde... Donc j'ai changé d'avis. Mais je vous copie-colle quand même le patch généré grâce à git qui implémentait cette solution. Je pense que, comme moi, vous aurez probablement besoin d' apprendre à lire un fichier diff/patch.
From 53772d58c5553cb7f29c5043d68ec12bd3c8d04c Mon Sep 17 00:00:00 2001 From: Louis Lecailliez <louis.lecailliez@....fr> Date: Sat, 24 May 2014 20:26:26 +0200 Subject: [PATCH] =?UTF-8?q?Int=C3=A9gration=20de=20treetagger=20=C3=A0=20BAO?= =?UTF-8?q?1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bao1/lib-parcours-common.pl | 9 ++++++++- bao1/parcours.pl | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/bao1/lib-parcours-common.pl b/bao1/lib-parcours-common.pl index 364861b..bdb36e0 100644 --- a/bao1/lib-parcours-common.pl +++ b/bao1/lib-parcours-common.pl @@ -22,7 +22,12 @@ sub main $rep=~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine pas par un "/" parcours_arborescence_fichiers($rep, $proc); - write_result(\@out_list, $out_dir); + my $outfile = write_result(\@out_list, $out_dir); + + if($conf_ref->{'tgg_path'}) + { + system("$conf_ref->{'tgg_path'} < $outfile > $conf_ref->{'out_dir'}/tagger_result.txt"); + } my $end = time(); printf("Temps d'exécution : %.2f\n", $end - $start); @@ -75,6 +80,7 @@ sub parcours_arborescence_fichiers { # param $list_ref : référence vers la liste qui contient les couples "contenu/item" à imprimer dans les fichiers de sortie # param[opt] $output_dir : chemin de base du dossier qui contiendra les fichiers de sorties +# return : le chemin vers le fichier TXT de sortie nouvellement créé sub write_result { my ($list_ref, $output_dir) = @_; @@ -110,6 +116,7 @@ sub write_result } print "Fichier xml généré : $output_xml\n"; + return $output_txt; } # param $str : une chaîne à nettoyer diff --git a/bao1/parcours.pl b/bao1/parcours.pl index 7ac6daa..1cdf3a8 100644 --- a/bao1/parcours.pl +++ b/bao1/parcours.pl @@ -38,6 +39,12 @@ my %conf = 'use_xml' => $xml ); + +if(exists($ENV{'TREETAGGER_PATH'})) +{ + $conf{'tgg_path'} = "$ENV{'TREETAGGER_PATH'}/tree-tagger-french-utf8"; +} + if($help == 1) { print $help_text; -- 1.7.9.6 (Apple Git-31.1)