En utilisant comme données d'entrée les fichiers XML et TXT générés contenant les titres et les descriptions par la BAO 1, nous avons utilisé les logiciels Cordial et Treetagger afin d'obtenir des fichiers de sortie tokénisés et étiquetés.
Cordial n'étant pas un logiciel open source et puisqu'il est payant nous l'avons dû utilisé à l'ILPGA afin de produire les fichiers attendus.
Pour étiqueter l'ensemble de notre corpus, contenant nos quatre rubriques, le programme a tourné toute une nuit.
En utilisant le logiciel Cordial, nous obtenons les fichiers résultats suivant:
Le logiciel Treetagger est, quant à lui, un logiciel open source et, bien qu'il soit, a priori, moins efficace que Cordial pour certains points, il permet tout de même de tokéniser et d'étiqueter avec suffisamment de précision pour que nous puissions analyser les fichiers résultats. Qui plus est, le logiciel Treetagger permet d'être incorporé à notre script afin de produire le fichier de la BAO1 et la BAO2 simultanément.
#/usr/bin/perl
use warnings;
use strict;
<<DOC;
Votre Nom : COLLOMB-ALFONSO
JANVIER 2016
usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
Le programme prend en entrée le nom du répertoire contenant les fichiers
à traiter
Le programme construit en sortie un fichier structuré contenant sur chaque
ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#----------------START-Arguments-Entree-(input)----------------
my $rep="$ARGV[0]";
my $rubrique = "3246|651865|3476|3260";
my %dico;
$rep=~ s/[\/]$//;
#----------------END-Arguments-Entree-(input)----------------
#----------------START-Declaration-Variables---------------
my $output1="2015-3246.xml";
my $output2="2015-651865.xml";
my $output3="2015-3476.xml";
my $output4="2015-3260.xml";
#----------------END-Declaration-Variables----------------
#----------------START-Enregistrement-Texte-Entete---------------
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output3")) { die "Pb a l'ouverture du fichier $output3"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output4")) { die "Pb a l'ouverture du fichier $output4"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
#----------------END-Enregistrement-Texte-Entete----------------
#----------------START-Appel-Fonction---------------
&parcoursarborescencefichiers($rep);
#----------------END-Appel-Fonction----------------
#----------------START-Enregistrement-Texte-Fil-RSS---------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output2);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output3);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output4);
print FILEOUT "</PARCOURS>\n";
close (FILEOUT);
exit ;
#----------------END-Enregistrement-Texte-Fil-RSS----------------
#----------------START-Definition-Fonction---------------
sub parcoursarborescencefichiers
{
#definition du repertoire de lecture comme l'element passe en argument
my $path= shift(@_);
opendir (DIR, $path) or die "can't open $path: $!\n";
#definition d'une liste contenant le nom de chaque fichier du repertoire
my @files = readdir(DIR);
closedir (DIR);
#boucle permettant de parcourir la liste contenant le nom des fichiers
foreach my $file (@files)
{
#reconnaissance des lignes porteuses des informations pertinentes
next if $file =~ /^\.\.?$/;
#definition du chemin du fichier un par un
$file = $path."/".$file;
#condition verifiant si le repertoire existe et enregistrant des
#balises dans le fichier de résultat en début et en fin
if (-d $file)
{
print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
&parcoursarborescencefichiers ($file);
print "<FIN REPERTOIRE> ==> ",$file,"\n";
}
#condition verifiant si le fichier existe
if (-f $file)
{
#condition verifiant si le fichier correspond au numero de rubrique
if ($file =~ /($rubrique).+\.xml$/)
{
#implementation d'un compteur
my $numeroDerniereRubrique = $1;
print "<",$i++,"> ==> ",$file,"\n\n\n";
#definition de variables ouvrant des fichiers en mode d'ecriture
#dans un encodage UTF-8
$codage = "utf-8";
open (FIC, "<:encoding($codage)", $file);
open (OUT, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.txt");
open (OUT2, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.xml");
#definition de variable afin d'y ajouter le texte ligne par ligne
my $texte="";
#boucle parcourant chaque ligne de texte du fichier
while (my $ligne = )
{
#mise en forme de la ligne de texte
chomp $ligne;
$ligne =~ s/\r//g;
$texte = $texte . $ligne;
}
#fermeture du fichier
close FIC;
#mise en forme de la variable
$texte =~ s/>\s+</></g;
#definition de compteur et boucle recherchant les
#elements titre et description dans le texte
my $compteurArticle = 1 ;
while ($texte =~m/<item>< title>([^<]+?)<\/ title>< link>(?:[^<]+?)<\/ link><description>([^<]+?)<\/description>/g)
{
#definition des variables et mise en forme des elements tite et description
my $titre = $1;
my $description = $2;
$titre=~s/<.+?>.+&.//g;
$titre.=".";
$titre=~s/\?\.$/\?/;
$description=~s/<.+?>//g;
#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
#le fichier resultat les balises et le contenu du compteur d'articles, du
#titre et de la description
if (!(exists $dico{$titre}))
{
$dico{$titre} = 1;
my $compteurArticle = $compteurArticle++;
print OUT "$titre\n";
print OUT "$description\n\n";
print OUT2 "<item num=\"$compteurArticle\" >\n< title>$titre</ title>\n<description>$description</description>\n</item>\n\n";
#######################################################################################
#START - SECTION DU SCRIPT EXCLUSIVE DE BAO2 1/2
#######################################################################################
&etiquetage($titre, $description, $numeroDerniereRubrique);
#######################################################################################
#END - SECTION DU SCRIPT EXCLUSIVE DE BAO2 1/2
#######################################################################################
}
}
#fermeture des fichiers
close OUT;
close OUT2;
# fin de traitement du fichier
}
#condition appelant le fichier TXT
if ($file =~ /($rubrique).+\.txt$/)
{
my $rubriquereconnnue=$1;
print "< PPPPPP",$i++,"> ==> ",$file,"\n\n\n";
#definition de variables ouvrant des fichiers en mode d'ecriture
#dans un encodage UTF-8
$codage = "utf-8";
open (FIC2, "<:encoding($codage)", $file);
open (OUT3, ">>:encoding($codage)", "Profond$rubriquereconnnue.txt");
#definition de variable afin d'y ajouter le texte ligne par ligne
my $texteProfond="";
#boucle parcourant chaque ligne de texte du fichier
while (my $ligne=)
{
#condition excluant des éléments présentas dans les lignes de texte
if (($ligne!~/[<>\|]/))
{
#condition excluant des éléments présentas dans les lignes de texte
if (($ligne!~/^(\s|\n|Le Monde|Journaliste|Suivre|Aller|Lire|Suivre|\d\d.\d\d.\d\d\d\d|\/|\]|\}|\{|\\|require|Découvrir|Article sélectionné| la matinale|La sélection du|Voir aussi|Photo(s)?|Texte|(\()?function.|sdk.|Image|Rejouer|Accédez|GMURZYNSKA.|stall.|\"|\'|initCharts\)|\$.|if|Highcharts.|Réagir|Classer|Email|Partager)/))
{
#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
#le fichier resultat les balises et le contenu du compteur d'articles, du
#titre et de la description
if (!(exists $dico2{$ligne}))
{
$dico2{$ligne} = 1;
print OUT3 "$ligne\n";
}
}
}
}
#fermeture des fichiers
print OUT3 "\n*************************************************************\n";
close FIC2;
close OUT3;
}
}
}
}
#######################################################################################
#SECTION DU SCRIPT EXCLUSIVE DE BAO2 2/2
#######################################################################################
#fonction pour obtenir le fichier etiqueté
sub etiquetage
{
#appel des arguments donnés à la fonction
my ($titr, $descript, $numeroDerniereRubriq) = @_;
#section pour le TITRE
open(TMP, ">:encoding(utf8)", "TEMPtitre.txt");
#enregistrement dans un fichier temporaire du contenu de la variable
print(TMP $titr);
close(TMP);
#appel du logiciel Treetagger
system("perl tokenise-utf8.pl TEMPtitre.txt | treetagger/cmd/tree-tagger-french >> articlesEtiquettes/$numeroDerniereRubriq-titre.txt");#system est une fonction dans perl qui permet d'appeller un autre programme que perl; ATTENTION, le prog appelle est .exe sous win mais pas sous linux
# -token -lemma -no-unknown french.par
system("perl treetagger2xml-utf8.pl articlesEtiquettes/$numeroDerniereRubriq-titre.txt utf-8");
#par défaut le prog treetagger2xml-utf8.pl enregistre le résultat dans un fichier 017titre_tag.txt.xml
open (TMP2, "<:encoding(utf8)", "articlesEtiquettes/$numeroDerniereRubriq-titre.txt.xml");
my $titr_tag="";
#on lit la premiere ligne de meta xml pour du beurre car elle ne nous interesse pas
my $ligne = ;
#on lit le fichier et a chaque fois qu'on rencontre une ligne on l'ajoute a la variable $titr_tag
while(my $ligne = <TMP2>)
{
$titr_tag = $titr_tag.$ligne;
}
close TMP2;
#section pour la DESCRIPTION
open(TMP, ">:encoding(utf8)", "TEMPdescription.txt");
print(TMP $descript);
#enregistrement dans un fichier temporaire du contenu de la variable
close(TMP);
#appel du logiciel Treetagger
system("perl tokenise-utf8.pl TEMPdescription.txt | treetagger/cmd/tree-tagger-french >> articlesEtiquettes/$numeroDerniereRubriq-description.txt") ;#system est une fonction dans perl qui permet d'appeller un autre programme que perl; ATTENTION, le prog appelle est .exe sous win mais pas sous linux
system("perl treetagger2xml-utf8.pl articlesEtiquettes/$numeroDerniereRubriq-description.txt utf8"); #par défaut le prog treetagger2xml-utf8.pl enregistre le résultat dans un fichier 017titre_tag.txt.xml
open (TMP2,"<:encoding(utf8)", "articlesEtiquettes/$numeroDerniereRubriq-description.txt.xml");
my $descript_tag="";
#on lit la premiere ligne de meta xml pour du beurre car elle ne nous interesse pas
my $ligne = <TMP2>;
#on lit le fichier et a chaque fois qu'on rencontre une ligne on l'ajoute a la variable $descript_tag
while(my $ligne = <TMP2>)
{
#on prend pas en compte les sauts de ligne
$descript_tag = $descript_tag.$ligne;
}
close TMP2;
return($titr_tag, $descript_tag);
}
#----------------END-Definition-Fonction---------------
En utilisant le logiciel Treetagger dans notre script nous obtenons les fichiers résultats suivants: