BAO 1 - Script






Etape 1- Expressions régulières


Nous avons amélioré ici le script de départ qui ne faisait que parcourir l'arborescenece de travail. Il s'agit de filtrer les éléments de notre corpus qui nous interessent et de faire un nettoyage. Le nettoyage consiste à:
-Supprimer les blancs entre les balises pour faciliter la récupération des items.
-Remplacer les "'" par des """ "
-Remplacer les caractères accentués qui apparaissaient dans la corpus sous une autre forme par leur graphie normale .
-Supprimer les balises qui ne sont pas des balises titres ou description pour pouvoir garder la scructure que nous voulons récuperer plus tard. Ci dessous, des capture du script qui nous a permis de faire ce nettoyage et également un lien vers le script perl.


1- Lien vers le script perl
2- Allure du script script


#/usr/bin/perl
<<DOC;
Nom :Princesse Andria
2014-2015
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
#-----------------------------------------------------------
use Data::Dumper;
use XML::RSS;

my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

#----------------------------------------
my $output1="SORTIE.txt";
if (!open (OUT1,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print "fichier output1 : ".$output1."\n";

my $output2="SORTIE.xml";
if (!open (OUT2,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print "fichier output2 : ".$output2."\n";

print OUT2 "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print OUT2 "<PARCOURS>\n";
print OUT2 "<NOM>RAJAONARIVELO</NOM>\n";
print OUT2 "<FILTRAGE>";
#----------------------------------------
&parcoursarborescencefichiers($rep); #recurse!
#----------------------------------------
print OUT2 "</FILTRAGE>\n";
print OUT2 "</PARCOURS>\n";
close(OUT2);

#----------------------------------------------
sub parcoursarborescencefichiers {
my $path = shift(@_);
# print "chemin : ".$path."\n"; #debug
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
# print Dumper @files; #debug
closedir(DIR);
foreach my $file (@files) {

next if $file =~ /^\.\.?$/; #passe à l'instruction suivante si la $file est un répertoire ne contenant que des répertoires
$file = $path."/".$file; #reconstitue l'arborescence des fichiers
print "hhh $file \n"; #debugage
if (-d $file) { #si c'est un répertoire
&parcoursarborescencefichiers($file); #alors on redescend dans l'arborescence
}
#recurse!
if (-f $file) { # si c'est un fichier
print $file,"\n"; #debugage
if ($file =~ /\.xml$/) #on ne traite que les fichier de type xml
{
#insertion sauvage du script de traitement
$encodage = `file -i $file` ;#passage d'une commande unix via perl
open(FILE,"<:encoding($encodage)", $file);
#préparation du fichier d'entrée, en supprimant tous les retours à la ligne
print "encodage : $encodage\n";
my $chainecomplete=();
while ($ligne=<FILE>) {
chomp $ligne;
$chainecomplete = $chainecomplete." ".$ligne;
}
#on va supprimer dans $chainecomplete tous les blancs présents entre une fin de balise quelqconque et un début de balise
$chainecomplete =~ s/> +</></g ; #s = substitute >epsace< par ><
#on va maintenant chercher le tire suivi de sa description = on regarde dans une balise de niveau supérieur, ici, item, pour que titre et description restent ensemble
#----------------------------------------------------------
$i = 0;
#l'expression.*? le force à s'arrêter à la première balise description, sinon c'est greedy et ça prend le premier titre et la dernière desc
while ($chainecomplete =~ /<item><title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>/g) {
$i++;

$titre=$1;
$description=$2;
$titre = &nettoyage($titre);
$description=&nettoyage($description);
print OUT1 "titre: ".$titre."."."\n"."description: ".$description.".£"."\n";#on insère un point après le titre et aussi à la fin de description avec un £ marquer de fin de paragraphe
print OUT2 "<item><titre>$titre</titre><description>$description</description></item>";
}
}
close(FILE);

print $i++,"\n";
}
}

}
#----------------------------------------------
#&nettpyage ($chainetruvee); creates @_ which is a special table containing
#all the arguments passed at procedure
sub nettoyage {

#remplacer &#38;#39; par ', &#38;#34; par "
my $chainetrouvee=shift (@_); #or shift @_ #here $chainetrovee is not the same as beforehand
$chainetrouvee =~ s/<a href[^>]+>//g;
$chainetrouvee =~ s/&#38;#39;/'/g;
$chainetrouvee =~ s/&#38;#34;/"/g;
$chainetrouvee=~s/&#39;/'/g;
$chainetrouvee=~s/&#34;/"/g;
$chainetrouvee=~s/&#233;/é/g;
$chainetrouvee=~s/&#234;/è/g;
$chainetrouvee =~ s/&lt;/</g;
$chainetrouvee =~ s/&gt;/>/g;
$chainetrouvee =~ s/<img[^>]+>//g;
$chainetrouvee =~ s/<\/a>//g;
$chainetrouvee =~ s/<[^>]+>//g;
$chainetrouvee=~s/&nbsp/ /g;
$chainetrouvee=~s/&/and/g;
$chainetrouvee =~ s/Le Monde.fr : .+//g;
$chainetrouvee =~ s/Le Monde.fr//g;
$chainetrouvee=~s/£//g;
return $chainetrouvee;
}

}



Etape 2- XML::RSS

Pour cette version, la lecture du fichier se fait de la même façon que pour la version avec les expressions régulières. La différence se situe dans le traitement du contenu des fichiers. La procèdure de traitement des contenus des balises se fait grâce au module XML::RSS qui identife la structure arborescente d'un document XML issu d'un flux RSS. Nous montrons, dans la suite, le script qui récupère le contenu textuel des titres et descriptions d'un fichier RSS:
#!/usr/bin/perl
use XML::RSS;
my $file="$ARGV[0]";
my $rss=new XML::RSS;
#-----------------------------------------------------------
my $TEXTEDUFIL="";
$TEXTEDUFIL.="<FILE=\"$file\">\n";
#-----------------------------------------------------------
$rss->parsefile($file);
my $nombredechampdescription=0;
foreach my $item (@{$rss->{'items'}}) {
$nombredechampdescription++;
$TEXTEDUFIL.="<article=\"$nombredechampdescription\">\n";
my $description=$item->{'description'};
$TEXTEDUFIL.="§ ".$description."\n";
my $titre=$item->{'title'};
$TEXTEDUFIL2.="§ ".$titre."\n";
}
#----------------------------------------------------------
print $TEXTEDUFIL;

Corpus
    Notre corpus est constitué de fils RSS du journal "Le Monde". Nous avons démarré notre projet avec le fichier 2008 constitué de fils RSS des journaux de 15 jours car le fichier 2014 étant lourd prenait un temps considérable pour tester les traitements.


BLOG BAO 1 et 2