Après avoir réalisé l'extraction des balises titres et descriptions à l'aide l'algorithme de la Boîte à Outils 1, des rubriques Culture, Europe et Société nous arrivons donc à la Boîte à Outils 2. La deuxième boîte à outils permet d'étiquetter les fichiers produits par la BAO1. Cette partie de code est à ajouter sous la fonction de nettoyage de la boîte à outils 1.
Pour ce faire, nous utilisons deux techniques, Treetagger et Cordial. Cordial produit en sortie un fichier texte avec 3 colonnes (forme, lemme, catégorie). Treetagger produit en sortie un fichier XML et permet d'étiqueter les contenus textuels des fils RSS juste après leur extraction
Voici le code pour la fonction d'étiquettage ajouté sous la fonction nettoyage :
------------------------- TREETAGGER EN PERL ---------------------------
#/usr/bin/perl
<<DOC;
JANVIER 2018
usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
Par exemple : perl parcours-arborescence-fichiers-2018.pl 2017 3208
Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter et le "nom" de la rubrique à traiter
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
my%dico;
open(FILEOUT, ">:encoding(utf8)", "sortie_$rubrique.txt");
open(FILEOUT2, ">:encoding(utf8)", "sortie_$rubrique.xml");
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
my $codage="utf-8";
print FILEOUT2 "<?xml version=\"1.0\" encoding=\"$codage\" ?>\n";
print FILEOUT2 "<PARCOURS>\n";
print FILEOUT2 "<NOM> Audrey GOMBAULT, 2017-2018</NOM>\n";
print FILEOUT2 "<FILTRAGE>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep); # on lance la récursion.... et elle se terminera après examen de toute l'arborescence
print FILEOUT2 "</FILTRAGE>\n";
print FILEOUT2 "</PARCOURS>\n";
close(FILEOUT2);
#----------------------------------------
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
my $path = shift(@_);
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
&parcoursarborescencefichiers($file); #recurse!
print "<FIN REPERTOIRE> ==> ",$file,"\n";
}
if (-f $file) {
if ($file =~ m/$rubrique.+\.xml$/) {
print "<",$i++,"> ==> ",$file,"\n";
my $texte="";
open(FILEIN, "<:encoding($codage)", $file);
while (my $ligne=<FILEIN>) {
chomp $ligne;
$ligne =~ s/\r//g;
$texte = $texte . $ligne ;
#print $ligne;
}
$texte =~ s/> +</></g;
$texte =~ s/&#39;/'/g;
while ($texte =~ m/<item>.*?<title>(.+?)<\/title>.*?<description>(.+?)<\/description>.*?<\/item>/g){
my $titre = $1;
my $description=$2;
#print $titre;
#$description =~ s/<.+?>$//g;
if (!(exists $dico{$titre})){
my ($titre_propre,$description_propre) = &nettoyage($titre,$description);
print FILEOUT "§$titre_propre\n$description_propre\n\n";
$compteurItem++; #va nous permettre de savoir combien d'item nous avons
my ($xmltitre, $xmldescription) = &etiquette($titre_propre,$description_propre);
#on attribue au valeurs xml_titre et xml_description le résultat du passage de titre_propre et description_propre
print FILEOUT2 "<item id=\"$compteurItem\"><titre>$xmltitre</titre>\n<description>$xmldescription</description></item>";
$dico{$titre}=1;
}
}
close FILEIN;
}
}
}
}
#----------------------------------------------
sub nettoyage {
my $var1 = shift(@_);
my $var2 = shift(@_);
$var1=~s/<.+?>//g;
$var1.=".";# nettoyage à compléter...
$var2=~s/<.+?>//g; # nettoyage à compléter...
return $var1,$var2 ;
}
sub etiquette {
my $var3 = shift(@_); #$_[0] # on indique que la fonction va prendre deux variables qu'on appelera entre paranthèses dans le script plus haut
my $var4 = shift(@_); #$_[1]
open my $f1, ">:encoding(utf8)", "titre.txt" ;
open my $f2, ">:encoding(utf8)", "description.txt" ;
print $f1 $var3;
print $f2 $var4;
close $f1;
close $f2;
# On appelle les programmes que l'on souhaite appliqué sur les fichiers qui seront créés par la fonction "arborescence fichier"
# Préparation
system("perl tokenise-utf8.pl titre.txt | ./tree-tagger-MacOSX-3.2/bin/tree-tagger -token -lemma -no-unknown french-utf8.par > titre_etiquete.txt");
#on découpe en token le fichier de titre et on ajoute le résultat à titre_etiquete.txt qui est vide actuellement
system ("perl treetagger2xml-utf8.pl titre_etiquete.txt utf8"); #FICHIER CREE, le fichier de titre etiquete est maintenant etiquete
open my $f1, "<:encoding(utf8)", "titre_etiquete.txt.xml"; # $f1 est le fichier d'entree
my $concat=""; # concat est le fichier de sortie
my $ligne = <$f1>;
while (my $ligne = <$f1>) {
$concat = $concat . $ligne ; # on ajoute à chaque fois le contenu de du nouveau passage dans le programme
}
close $f1;
# Préparation
system("perl tokenise-utf8.pl description.txt | ./tree-tagger-MacOSX-3.2/bin/tree-tagger -token -lemma -no-unknown french-utf8.par > description_etiquete.txt");
# on fait pareil pour la description
system ("perl treetagger2xml-utf8.pl description_etiquete.txt utf8"); #FICHIER CREE
open my $f2, "<:encoding($codage)", "description_etiquete.txt.xml";
my $concat2="";
my $ligne = <$f2>;
while (my $ligne = <$f2>) {
$concat2 = $concat2 . $ligne ;
}
close $f2;
return $concat, $concat2;
}
# segmenter le fichier avant de l'envoyer à cordial, d'où l'utilité de tokenizer
#perl tokenise-utf8.pl texteaetiqueter.txt | ./tree-tagger.exe(mac) french-utf8.par -lemma -token -no-unknown > resultat-token.txt
# attention aux quotes dans le programme de tokenisation
# perl treetagger2xml-utf8.pl resultat-token.txt "utf8"
# nécessité de unicode string library
les fichiers XML produits contiennent des lignes vides qu'il a fallut retirer. Pour ce faire, nous avons utilisé le "find and replace" d'Oxygen, en remplaçant les occurrences de (\n)* par \n (! attention à bien cocher "expressions régulières" et décocher "boucler la recherche" !)
Il faut également remplacer les "&" en "&" !!
Une fois cela fait, nos fichiers sont prêts pour la BAO 3 !!
Avec le résultat .txt de l'extraction des titres et descriptions nous allons procéder à leur étiquetage via le logiciel Cordial qui étiquette différemment de Treetagger. Cordial ne prenant que des entrées en ISO ils nous a fallut convertir les fichiers d'abord et une fois obtenu les rebasculer en UTF8.
Voici les résultats :