boatouti.pl

#!/usr/bin/perl

# cf infra pour la documentation

use strict;

use warnings;

use diagnostics;

use utf8;

use utile; # des fonctions pratiques

use erreur; # pour gérer les erreurs de manière uniforme

my %localErreur=('analyseur' => "l'analyseur spécifié est inconnu");

erreur::maj(\%localErreur);

use Getopt::Long; # pour gérer les paramètres

use Pod::Usage; # génère l'usage à partir des commentaires pod

use tttDossier; # pour traiter toute une arborescence de fichier

use filtrage; # pour filtrer des balises xml avec &filtrageXML

use ttgFr; # pour analyser avec treeTagger

use cordial; # pour convertir une analyse de cordial en xml

use termino; # pour créer une liste de termes candidats à ârtir de pattrons

use candidat2graf; # pour faire un graphe au format pajek à partir d'une liste de candidats

my $headerXML=qq(<?xml version="1.0" encoding="utf-8"?>\n);

#***** acquisition des paramètres___________________________________

my $help=0;

my $input;

my $output;

my $is_xml=0; # format de sortie en xml

my $tag;

my $analyseur;

my $candi;

my $graphe;

my $keep=0;

my $is_verbose=0;

GetOptions ( 'help!' => \$help,

'input=s' => \$input,

'output=s' => \$output,

'xml!' => \$is_xml,

'filtrage=s' => \$tag,

'analyseur=s' => \$analyseur,

'candidat=s' => \$candi,

'graphe=s' => \$graphe,

'keep!' => \$keep,

'verbose!' => \$is_verbose,

)or pod2usage(-verbose => 2);

pod2usage(-verbose => 2) if $help;

#****** vérification des paramètres et calcule d'autres valeurs pour la suite

# pour les candidats et le graphe____________________

my $is_candi=defined($candi);

my $is_graphe=defined($graphe);

erreur::affiche('option',"incompatibilté candidat et graphe") if ($is_candi && $is_graphe);

my $pattrons;

if ($is_candi){

$pattrons=$candi;

}

elsif($is_graphe){

$pattrons=$graphe;

}

$is_candi=1 if $is_graphe; # il faut créer les candidats, si on fait le graphe

# vérifie l'entrée et la sortie_____________________

erreur::affiche('option',"input obligatoire") unless defined($input);

erreur::affiche('option',"output obligatoire") if ($is_candi && !defined($output));

my $fttt= $is_candi ? "tttTemp.txt" : $output; # fichier de sortie du traitement

# gestion analyseur ________________________

if ($analyseur eq "cordial"){

cordial::cnr2xml($input,$fttt);

}else{

my %fonctionAnalyseur=( treetagger =>\&ttgFr,

#english =>\&ttgEng,

#chasen =>\&chasen2french,

);

my @tttAnalyseur;

my $is_analyseur=0;

# on définit la fonction d'analyse s'il le faut

if (defined $analyseur){

if( exists($fonctionAnalyseur{$analyseur}) ){

$is_analyseur=1;

@tttAnalyseur=( $fonctionAnalyseur{$analyseur} );

}else {

erreur::affiche("analyseur",$analyseur);

}

}

# gestion filtrage____________________________

my @tttFiltre;

my $is_filtre=0;

# on définit la fonction filtrage et ses paramètres s'il le faut

if (defined $tag){

$is_filtre=1;

my @tags=split(/[,;]/,$tag);

@tttFiltre=(\&filtrageXML,\@tags);

push (@tttFiltre,$tttAnalyseur[0]) if $is_analyseur; # c'est le filtrage qui lance l'analyse

push @tttFiltre,"xml" if $is_xml;

}

#********** pre-traitement (filtrage et analyse)________________________________

my $is_preTTT=$is_filtre||$is_analyseur; # pour savoir s'il on fait un prétraitement

our @preTTT; # fonction et paramètres appelés par le traitement

our $refOut; #référence au flot de sortie

if ($is_preTTT){

@preTTT= $is_filtre ? @tttFiltre : @tttAnalyseur;

# gestion output _________________________

my $is_sdtout=0; # pour savoir si on utilise la sortie standard ou un fichier

if(defined $fttt){

open (OUT,">:utf8",$fttt) or erreur::affiche('ouvertureF',$fttt);

$refOut=\*OUT;

}else{ # sortie standard si pas de post traitement et pas de fichier sortie

$is_sdtout=1;

binmode(STDOUT,"utf8");

$refOut=\*STDOUT;

}

# traitement

print $refOut $headerXML.qq(parcours nom="$input">\n) if $is_xml;

tttArborescence($input,[\&traitement,@preTTT],"xml");

print $refOut "</parcours>\n" if $is_xml;

close $refOut unless $is_sdtout;

}

}

#********** post-traitement (candidats et graphe)_______________________________

if ($is_candi){

my $etikXML= $is_preTTT ? $fttt : $input;

my $candidats= $is_graphe ? "candidatTemp.txt" : $output;

listeCandidats($etikXML,$pattrons,$candidats);

unlink $etikXML if ($is_preTTT && !$keep);

if ($is_graphe){

candidat2pajek($candidats,$output);

unlink $candidats unless $keep;

}

}

exit;

# ******* fonction _________________

Définitions des fonctions

traitement


sub traitement{

my ($file,$fonc,@arg)=@_;

@arg=() unless @arg;

print STDERR "traitement $file\n" if $is_verbose;

print $refOut qq(<fichier nom="$file">\n") if $is_xml;

print $refOut (&$fonc($file,@arg));

print $refOut "n</fichier>\n" if $is_xml;

}

=head1 SCRIPT BOATOUTI.PL

=head2 AUTEUR : Schaeffer Raphael

=head2 DATE : JANVIER 2006

=head2 DESCRIPTIF

Ce script sert a exploiter les differents modules qui ont ete developpe au cours du projet boite a outils de plurital. C'est a dire du filtrage de documents xml, de l'analyse morpho-syntaxique, de la recheche de candidats termes par patrons morpho-syntaxiques et d'un affichage sous forme de graphe. Tous ces traitements peuvent etre combines grace aux options. Si l'argument en entree est un dossier, il sera parcouru recursivement.

=head2 EXEMPLE

boatouti -i arbo-fils -o graf.txt -f description -a treetagger -x -g patrons.txt -v

=head2 LISTE DES OPTIONS

=over

=item --help pour afficher cette documentation

=item --input (fichier/dossier)

=item --output (fichier)

=item --xml pour un format xml en sortie

=item --filtrage (tag1,ta2...) pour filtrer des balises xml

=item --analyseur (treetagger/cordial) pour analyser morpho-lexicalement (sauf avec cordial prend le texte etiquete en entree)

=item --candidat (fichierPatrons) pour creer la liste des candidtas termes

=item --graphe (fichierPattrons) pour un faire un graphe au format pajek des candidats termes

=item --keep pour conserver les fichiers crees a chaque etape

=item --verbose pour suivre les etapes

=back

=cut