# /usr/bin/perl
use utf8; # Assigner l'encodage
use strict;
binmode(STDOUT, ":encoding(UTF-8)"); # Assigner l'encodage de sortie
#-----------------------------------------------------------
# Ce programme s'utilise ainsi :
# perl parcours-arborescence.pl 2021 3476
# Il prend en arguments 2 éléments : (1) le nom de l'arborescence 2021
# contenant les fils RSS de l'année 2021, (2) le nom de la rubrique à traiter
# ici 3208 pour A la une
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;}
my $rep="$ARGV[0]"; # Assigner le ARGV pour le script
my $RUBRIQUE="$ARGV[1]";
$rep=~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine pas par un "/"
# Ouverture de ficher TXT et XML pour la sorite
open my $outputtxt, ">:encoding(UTF-8)","corpusTitreDesc-$RUBRIQUE.txt";
open my $outputxml, ">:encoding(UTF-8)","preTitreDesc-$RUBRIQUE.xml";
print $outputxml "\n\n"; # Ouverture de balise XML corpus
&parcoursarborescencefichiers($rep); # Recurse!
print $outputxml "\n"; # Fermeture de balise XML corpus
close $outputtxt; # Fermeture des fichiers TXT et XML.
close $outputxml;
&etiquetageUP; # Annoter avec udpipe TXT
&etiquetageTT; #O Annoter avec TreeTagger
exit;
#-----------------------------------------------------------
# Etiquetage UDpipe
sub etiquetageUP {
# system(): permet d'écrire dans le terminal à partir d'un script Perl.
# Execution de UDpipe, Tokenization de texte, POS tagging, annotation syntaxique,
# On renvoie le résultat dans un fichier au format CoNLL nommé corpus-titre-description.udpipe.
system("./distrib-udpipe/udpipe-1.2.0-bin/bin-win32/udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ./distrib-udpipe/modeles/french-sequoia-ud-2.5-191206.udpipe corpusTitreDesc-$RUBRIQUE.txt > annotationUD-$RUBRIQUE.udpipe");
system("perl ./distrib-udpipe/udpipe2xml-version-sans-titrevsdescription-v2.pl annotationUD-$RUBRIQUE.udpipe");}
#-----------------------------------------------------------
# Etiqueetage TreeTagger
sub etiquetageTT {
# On répeat la processus de UDpipe for TreeTagger cette fois
system("./distrib-treetagger/tree-tagger.exe -lemma -token -no-unknown -sgml ./distrib-treetagger/french-utf8.par preTitreDesc-$RUBRIQUE.xml > annotationTT-$RUBRIQUE ");
system("perl ./distrib-treetagger/treetagger2xml-utf8.pl annotationTT-$RUBRIQUE UTF8");}
#----------------------------------------------
sub parcoursarborescencefichiers { # Parcourir le RSS
my $path = shift(@_);
# Ouverture de repertoire
opendir(DIR, $path) or die "Peut pas ouvrir $path: $!\n";
my @files = readdir(DIR); # Lire les fichers dans le dossier
closedir(DIR); # Fermeture de dossier
foreach my $file (@files) {
next if $file =~ /^\.\.?$/; # On ne traite pas ceux qui matchent . ou ..
$file = $path."/".$file;
if (-d $file) { # Verification de dossier
print "On entre dans le REPERTOIRE : $file \n";
&parcoursarborescencefichiers($file);
print "On sort du REPERTOIRE : $file \n";
}
if (-f $file) {
if ($file =~ /$RUBRIQUE.+\.xml$/) { # Fichier avec le numero de rubrique
print "Traitement du fichier $file \n";
open my $input, "<:encoding(UTF-8)",$file; # Ouverture de ficher en mode écriture
$/=undef; # Enlever la valeur de default de saut ligne
my $ligne=<$input> ; # Assigner le contenu au variable $ligne.
close($input); # Fermeture de fichier RSS.
while ($ligne=~/- (.+?)<\/title>.+?(.+?)<\/description>/gs) { # Extraction de titre et description
my $titre=&nettoyage($1); # Avoir le titre et description propre
my $description=&nettoyage($2);
print $outputtxt "$titre \n"; # Ecriture dans le fichier
print $outputtxt "$description \n";
print $outputtxt "#-------------------#\n";
my ($titreSEG,$descriptionSEG)=&segmentationTD($titre,$description);
print $outputxml "
- \n$titreSEG\n\n$descriptionSEG\n
\n";
}
}
}
}
}
#-----------------------------------------------------------
#On définit la fonction qui va permettre de segmenter le texte en un token par ligne. Ce résultat sera mis dans le fichier de pré-corpus XML qui sera utilisé ensuite pour l'annotation par TreeTagger.
sub segmentationTD {
my ($arg1,$arg2)=@_;
open my $tmp, ">:encoding(UTF-8)","resultat1.txt"; # Ecriture des données textuelles dans un fichier Résultat1
print $tmp $arg1; # Ecriture de titre dans le fichier Résultat1
close $tmp;
system("perl ./distrib-treetagger/tokenise-utf8.pl resultat1.txt > resultat2.txt");
undef $/;
open my $tmp2, "<:encoding(UTF-8)","resultat2.txt"; # Ouverture de ficher Resultat2
my $titresegmente=<$tmp2>;
close $tmp2;
open $tmp, ">:encoding(UTF-8)","resultat1.txt"; # Recuperation de description
print $tmp $arg2;
close $tmp;
system("perl ./distrib-treetagger/tokenise-utf8.pl resultat1.txt > resultat2.txt");
open $tmp2, "<:encoding(UTF-8)","resultat2.txt";
my $descriptionsegmente=<$tmp2>;
close $tmp2;
$/="\n";
return $titresegmente,$descriptionsegmente;
}
#-----------------------------------------------------------
# Nettoyage du texte
sub nettoyage {
my $texte=shift @_;
$texte=~s/(^$)//g; # Remplacement les balises CDATA par rien.
$texte.=".";
$texte=~s/\.+$/\./; # Remplacement des points par un seul.
return $texte; # Renvoie le texte propre.
}