La première boîte à outils permet d'extraire les titres et descriptions des différents articles issus des différentes rubriques. Nous nous sommes intéressés aux rubriques: "Europe" "Culture" et "Société" de l'année 2017.
#/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 entree le nom du repertoire contenant les fichiers a traiter et le "nom" de la rubrique a traiter
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";
# On affecte la valeur de premier argument à entrer pour appeler le programme à $rep, il faudra entrer un répertoire
my $rubrique="$ARGV[1]";
# On affecte la valeur de deuxième argument à la rubrique, cette variable nous servira à ne sélectionner que certains fichiers de notre répertoire
my%dico;
open(FILEOUT, ">:encoding(utf8)", "$rubrique.txt"); #le premier fichier de sortie est en utf-8, et au format txt
open(FILEOUT2, ">:encoding(utf8)", "$rubrique.xml"); #le deuxième fichier de sortie est lui au format xml
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//; # le répertoire peut avoir n'importe quel nom
my $codage="utf-8"; #on entre le codage dans une variable pour pouvoir l'appeler dans le fichier xml que nous créons ensuite
print FILEOUT2 "<?xml version=\"1.0\" encoding=\"$codage\" ?>\n";
# première ligne d'un fichier xml bien formé avec la version et l'encodage
print FILEOUT2 "<PARCOURS>\n"; # balise racine du fichier xml
print FILEOUT2 "<NOM> Audrey GOMBAULT et Léo DE SOUSA, 2017-2018</NOM>\n"; # balise d'information
print FILEOUT2 "<FILTRAGE>\n"; # annonce du début de extraction
#----------------------------------------
&parcoursarborescencefichiers($rep); # on lance la recursion.... et elle se terminera après examen de toute l'arborescence
# la fonction est décrite plus bas, le bloc ci-dessous ne sera parcouru qu'une fois que nos fichiers textes et xml seront pleins
print FILEOUT2 "</FILTRAGE>\n"; #on referme les balises
print FILEOUT2 "</PARCOURS>\n";
close(FILEOUT2); # on ferme le fichier de sortie xml
#----------------------------------------
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
my $path = shift(@_);
# on sélectionne tout
opendir(DIR, $path) or die "can't open $path: $!\n"; # si on peut ouvrir le chemin on continue, sinon message d'erreur
my @files = readdir(DIR); # variable file reçoit la direction
closedir(DIR);
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n"; #pour tout nouveau fichier trouvé, on indique où l'on se trouve
&parcoursarborescencefichiers($file); #recurse!
print "<FIN REPERTOIRE> ==> ",$file,"\n";
}
if (-f $file) {
if ($file =~ /$rubrique.+\.xml$/) { # si le fichier trouvé appartient à la rubrique recherchée on continue
print "<",$i++,"> ==> ",$file,"\n"; # le compteur i est le nombre de jours extraits
my $texte="";
open(FILEIN, "<:encoding($codage)", $file);
while (my $ligne=<FILEIN>) {
chomp $ligne;
$ligne =~ s/\r//g;
$texte = $texte . $ligne ;
}
$texte =~ s/> +</></g;
$texte =~ s/&#39;/'/g; # on nettoie une première fois de caractères non désirés
while ($texte =~ m/<item>.*?<title>(.+?)<\/title>.*?<description>(.+?)<\/description>.*?<\/item>/g){
#on parcourt le fichier xml pour retrouver le motif
my $titre = $1;
my $description=$2;
#print $titre;
#$description =~ s/<.+?>$//g;
if (!(exists $dico{$titre})){
my ($titre_propre,$description_propre) = &nettoyage($titre,$description);
# on affecte aux variables "propre" le résultat d'un passage par la fonction nettoyage définie plus bas
print FILEOUT "$file\n$titre_propre\n$description_propre\n\n";
# on écrit le nom de fichier, le titre nettoyé et la description nettoyée dans le document texte
print FILEOUT2 "<item id=\"$file\"><titre>$titre_propre</titre>\n<description>$description_propre</description></item>\n";
# on insère les mêmes données entre balises pour former le document XML
$dico{$titre}=1;
# il faut aussi creer le fichier XML...
}
}
close FILEIN;
}
}
}
}
#----------------------------------------------
sub nettoyage {
my $var1 = shift(@_);
my $var2 = shift(@_);
$var1=~s/<.+?>//g;
$var1.=".";# nettoyage a completer...
$var2=~s/<.+?>//g; # nettoyage a completer...
return $var1,$var2 ;
}
# segmenter le fichier avant de l'envoyer a cordial, d'où l'utilite 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"
# necessite de unicode string library
Les documents texte des rubriques 3214 (Europe), 3246 (Culture) et 3224 (Société) sont constitués du nom du fichier dont les titres et descriptions sont extraits, du titre et de la description. Le nom du fichier est ici en option, seulement pour faire beau, nous ne le mettons pas dans la Boîte à Outils 2 pour ne pas brusquer Cordial.
Les documents texte des rubriques 3214 (Europe), 3246 (Culture) et 3210 (Société) sont constitués du nom du fichier dont les titres et descriptions sont extraits dans la balise item, en "id", du titre et de la description entre balises propres. Le nom du fichier sera remplacé par un compteur de fichier dans la Boîte à Outils 2 pour afficher dans le tableau en Boîte à Outils 4.