Git --projet-boite-à-outils

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.

Installation sur OS X
L'installation n'est pas compliquée mais se fait en plusieurs étapes où il faut télécharger plusieurs archives tar.gz et ne pas les décompresser. C'est le script d'installation qui s'en charge. En outre, il faut télécharger plusieurs fichiers de configuration qui sont listés plus bas dans la page du logiciel.

Intégration à BOA2

Note
Le contenu de la partie suivante est obsolète. Il est néanmoins conservé car il n'est pas inintéressant.

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 :

  1. dans parcours.pl, si la variable d'environnement TREETAGGER_PATH existe, on passe un argument supplémentaire à la procédure main
  2. le fonction write_result est modifiée de façon à retourner le chemin du fichier texte généré
  3. 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.

Utilisation de treetagger (générique)
chemin_vers_treetagger/tree-tagger-french-utf8 < file_a_analyser > fichier_de_résultats
Utilisation de treetagger (dans mon cas)
/Users/Louis/Downloads/treetagger/cmd/tree-tagger-french-utf8 < sortie_23-May-0-10-34.txt > treetagger_output.txt

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.

TREETAGGER_PATH=chemin_vers_le_dossier_content_treetagger
export TREETAGGER_PATH
Création d'une variable d'environnement sous Bash
Fixer la variable d'environnement est simple, mais elle n'est pas immédiatement visible par les programmes, ce qu'on remarque par son absence dans la sortie de la commande env. Il ne faut pas oublier d'utiliser la commande export afin que ce soit le cas.
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.

TREETAGGER_PATH="rm * "
(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.

J'ai testé pour vous
Effectivement, avec une variable telle que TREETAGGER_PATH="rm * " le code supprime le contenu du répertoire courant.
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.

git patch format-patch -1 HEAD
La patch de cette (mauvaise) solution
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)