#!/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 _________________
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