BAO 2 : Intégration de la bibliothèque xml::rss
Nous avons décidé d'intégrer la bibliothèque xml::rss dans nos scripts car elle permet de prendre en compte toutes les balises 'description', en particulier celles qui sont sur plusieurs lignes.
Voici le script pour TreeTagger avec dedans les modifications liées à la bibliothèque (lignes en gras) :
#/usr/bin/perl
<<DOC;
Votre Nom : Marion ICHE et Sophie PAPAZOGLOU
JANVIER 2008
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 XML::RSS; #on appelle la bibliothèque XML
my $rep="$ARGV[0]";
my $rss=new XML::RSS; #on affecte à la variable rss la bibliothèque RSS
my $DUMPFULL1=""; #on initialise DUMPFULL à vide
#-----------------------------------------------------------
# on s'assure que le nom du répertoire ne se termine pas par un "/" si ça se termine par / on remplace par rien
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie
my %tableaudestextes=(); # pour mémoriser ce qu'on a déjà imprimé, pour éviter les doublons
#----------------------------------------
my $output1="SORTIEbibliotreetagger.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
&parcoursarborescencefichiers($rep); # on appelle le sous programme
#----------------------------------------
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<texte>\n";
print FILEOUT "$DUMPFULL1";
print FILEOUT "</texte>";
close(FILEOUT);
exit;
#----------------------------------------------
sub parcoursarborescencefichiers { # on entre dans le sous programme
my $path = shift(@_); # on met dans la variable $path le contenu de la variable mise en argument
opendir(DIR, $path) or die "can't open $path: $!\n"; # opendir : ouvre un rep - si on arrive pas : le pgm s'arrete et on envoie un message d'erreur
my @files = readdir(DIR); # on lit le contenu du répertoire et on renvoie une liste qu'on stocke dans @files
closedir(DIR);
foreach my $file (@files) { # pour chaque ressource dans @files,on crèe $files
next if $file =~ /^\.\.?$/; # on passe au suivant si on trouve . ou .. car on risque une boicle infinie
$file = $path."/".$file; # on réécrit tout le chemin du fichier - le point permet la concaténation
if (-d $file) { # on entre dans cette boucle si il y a dans $file un répertoire (-d vérifie que l'argument est un répertoire)
&parcoursarborescencefichiers($file); #recurse!
}
if (-f $file) { # on entre dans cette boucle si il y a dans $file un fichier (-f vérifie que l'argument est un fichier)
if ($file=~/0,2-3208,1-0,0.xml/){ # parcourt toute l'arborescence pour ne garder que les fichiers .xml
open(FILEIN,$file); # on ouvre le fichier qu'on va lire
$i=1; # compteur
printf "$file\n"; # on voit si ça travaille
while ($ligne = <FILEIN>){ # tant qu'il y a qqch à lire, on rentre dans la boucle
$rss->parsefile($file);
my $nombredechampdescription=0; #incrémente le numéro de la balise article
foreach my $item (@{$rss->{'items'}}) { #item récupère le nom de toutes les balises dans un tableau
$nombredechampdescription++; #on incrémente le numéro de la balise article
my $aa=$item->{'description'}; #description est le nom de la balise que l'on cherche, dans $aa, on met le contenu des balises description
if (($aa!~/Retrouvez *l.*ensemble *des/) && ($aa!~/Lisez *l.*int.*gralit.* *de *l.*article *pour *plus *d.*information./) && ($aa!~/Toute *l.*actualit.* *au *moment *de *la *connexion/)) {
my $propre=$aa;# on prend le motif et on le met dans $propre
if ($propre=~/^(.+)<img width='1' height='1'.*$/) {$propre=$aa}; #permet de supprimer les balises images contenues dans description
$propre=~s/&#39;/\'/g;# nettoie
$propre=~s/&#34;/\"/g;# nettoie
$propre=~s/é/é/g;# nettoie
$propre=~s/ê/ê/g;# nettoie
$propre=~s/&eacute;/é/g;# nettoie
$propre=~s/&egrave;/è/g;# nettoie
$propre=~s/&icirc;/\î/g;# nettoie
$propre=~s/&ocirc;/\ô/g;# nettoie
$propre=~s/&ccedil;/\ç/g;# nettoie
$propre=~s/&agrave;/\à/g;# nettoie
$propre=~s/&/&/g;# nettoie
$propre=~s/</\</g;# nettoie
$propre=~s/>/\</g;# nettoie
if (exists($tableaudestextes{$propre})) { # on mémorise $propre
$tableaudestextes{$propre}++; # on incrémente la valeur de $propre FACULTATIF (pour faire plaisir à M. FLEURY)
} # mais on ne la réimprime pas afin de supprimer les doublons si il existe déjà
else { # on entre dans cette boucle si il n'existe pas encore-
$DUMPFULL1.="<article=\"$nombredechampdescription\">\n";
open (FILE, ">tmp.txt");#on ouvre un fichier temporaire
print FILE $propre;#on met le contenu de $propre dans tmp.txt
close FILE;# on ferme le fichier temporaire
print "ETIQUETAGE \n"; #on commence l'étiquetage
system ("perl \"./TreeTagger/cmd/tokenise-fr.pl\" tmp.txt > resultat-tokenize.txt");#on lance tokenise
system ("tree-tagger.exe french.par -lemma -token -no-unknown resultat-tokenize.txt > resultat-etiquetage.txt");#on lance treetagger sur le résultat de tokenise
system ("perl \"./TreeTagger/cmd/treetagger2xml.pl\" resultat-etiquetage.txt");# on convertit au format xml ce qui était au format txt
print "FIN ETIQUETAGE \n";# on a fini l'étiquetage
open(FILE, "resultat-etiquetage.txt.xml");# on ouvre le résultat de l'étiquetage qui est au format xml
my $tmp=<FILE>; #on met la première ligne car on ne veut pas avoir plusieurs fois l'en-tête
my $resultat="";# on initialise la variable résultat
while(my $lignetmp=<FILE>) {# on lit toutes les lignes de resultat-etiquetage.txt.xml
$resultat.=$lignetmp;#on concatène chaque ligne dans $resultat
}
close(FILE);#on ferme le fichier
# fichier treetagger2.xml sera ds un fichier -> $resultat a concatener dans DUMPFULL
$DUMPFULL1.=$resultat; # on concatène le contenu de $propre obtenu dans chaque boucle
$i++; # on incrémente le compteur
$tableaudestextes{$propre}++; # on incrémente pour dire qu'on a déjà rencontré ce texte pour qu'après si on le retrouve on ne réimprime pas la même séquence
}
} # fin de if
} # fin de if
} # fin de while
close(FILEIN); # on ferme le fichier en lecture
}
}
}
}
On peut intérgrer la bibliothèque de la même façon dans le script de Cordial.