BAO 2 : Intégration de la bibliothèque xml::rss

Publié le par Marion et Sophie

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=~/^(.+)&lt;img width='1' height='1'.*$/) {$propre=$aa}; #permet de supprimer les balises images contenues dans description
                $propre=~s/&#38;#39;/\'/g;# nettoie
                $propre=~s/&#38;#34;/\"/g;# nettoie
                $propre=~s/&#233;/é/g;# nettoie
                $propre=~s/&#234;/ê/g;# nettoie
                $propre=~s/&amp;eacute;/é/g;# nettoie
                $propre=~s/&amp;egrave;/è/g;# nettoie
                $propre=~s/&amp;icirc;/\î/g;# nettoie
                $propre=~s/&amp;ocirc;/\ô/g;# nettoie
                $propre=~s/&amp;ccedil;/\ç/g;# nettoie
                $propre=~s/&amp;agrave;/\à/g;# nettoie
                $propre=~s/&#38;/&/g;# nettoie
                $propre=~s/&lt;/\</g;# nettoie
                $propre=~s/&gt;/\</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.

Publicité
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
S
Super...<br /> SF
Répondre