# /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>(.+?)<\/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 "<item><titre>\n$titreSEG\n</titre><description>\n$descriptionSEG\n</description></item>\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/(^<!\[CDATA\[)|(\]\]>$)//g; # Remplacement les balises CDATA par rien. $texte.="."; $texte=~s/\.+$/\./; # Remplacement des points par un seul. return $texte; # Renvoie le texte propre. }