Boîtes à outils

ou La roue réinventée
Accueil BAO 1 BAO 2 BAO 3 BAO 4

Objectifs

L'objectif de cette première boîte à outil est le filtrage du contenu textuel des fils RSS du Monde pour obtenir des fichiers qui vont pouvoir être étiquettés à l'étape suivante.
Notre point de départ est un répertoire contenant une arborescence de répertoires et de fichiers dans lesquels se trouvent des fils RSS du Monde.fr, récupérés automatiquement tous les jours à 19h du 1er au 15 janvier 2008. Chaque fil est récupéré au format texte et au format xml, c'est ce dernier format que nous voulons récupérer.
Nos fichiers de travail se présentent donc sous la forme suivante :


Seul le contenu textuel de ces fichiers nous intéresse. Il va donc falloir extraire le contenu des balises <title> et <description> (surlignées en jaune). Mais comme on peut le voir, certains de ces éléments (indiqués par une flèche rouge) contiennent un texte présent sur chaque fil RSS et non pertinent pour nous : leur contenu ne devra pas être extrait afin qu'il ne fausse pas les résultats en fin de traitement (en augmentant des fréquences de cooccurrences non signifiantes pour nous).

haut de la page

Outils

L'outil dont on dispose pour cette BaO 1 est le langage de programmation Perl. Perl est adapté à la tâche qu'on veut accomplir car c'est un langage destiné à la manipulation de données textuelles.

Trois squelettes de scripts nous sont fournis au départ :
  • nettoyeur.pl : attend une expression régulière permettant de repérer les balises (à savoir : /<[^>]*>/)
  • filtreur.pl : attend une expression régulière permettant d'extraire le contenu textuel de balises (à savoir : /<balise>(.*)<\/balise>/)
  • parcours-arborescence-fichiers.pl : script récursif qui parcourt une arborescence de fichiers (cad qui s'appelle lui-même sous une condition donnée : l'élément considéré n'est pas le fichier recherché)

haut de la page

Le script

On a dans un premier temps modifié les scripts fournis pour les adapter au traitement de nos fils RSS. Puis on les a fusionnés afin d'obtenir un script complet qui prend en entrée le répertoire contenant les fichiers à traiter et produit en sortie pour chaque rubrique (17 au total) un fichier XML contenant sur chaque ligne le résultat du filtrage de chaque fil RSS du type : <PARCOURS><NOM>de l'auteur</NOM><FILTRAGE>contenu du filtrage</FILTRAGE></PARCOURS>
(NB Nous verrons dans la BaO suivante une version améliorée de ce script.)

Le script bao1.pl exécute les opérations suivantes :

# Préparation pour un fichier de sortie identifiable : les fils RSS portent des nom cabalistiques du type 0,2-3234,1-0,0.xml. En fait, une partie de ce nombre (ici 3234) est le code de la rubrique à laquelle appartient le fil. Ainsi, après avoir répertorié tous les codes, on va utiliser une table de hachage pour associer à chacun de ces codes (clef) le nom du fichier de sortie correspondant (valeur), c'est-à-dire le nomdelarubrique.xml à laquelle il renvoie. En voici un extrait :
my %F=("3208" =>"a_la_une.xml",
"3210"=>"international.xml",
"3214"=>"europe.xml",
"3224"=>"societe.xml",
"3232"=>"opinions.xml");

# Génération d'un document XML de sortie dans lequel sont inscrits : l'entête XML obligatoire (<?xml version="1.0" encoding="iso-8859-1"?>), la balise ouvrante de l'élément racine (<PARCOURS>) et de l'élément contenant le filtrage (<FILTRAGE>).

# Parcours récursif de l'arborescence à la recherche de fichiers XML à traiter, puis pour chaque fichier trouvé :

# "Nettoyage" du fichier : remplace les entités HTML et supprime des lignes contenant les balises <title> et <description> qui ne nous intéressent pas :
my $ligne=shift(@_);
$ligne=~s/&#39;/'/g;
$ligne=~s/&#34;/"/g;
$ligne=~s/"/"/g;
$ligne=~s/'/'/g;
$ligne=~s/&/&/g;
$ligne=~s/[/[/g;
$ligne=~s/]/]/g;
$ligne=~s/Le Monde.fr.*\n//g;
$ligne=~s/Retrouvez l'ensemble.*\n//g;
$ligne=~s/Toute l'actualité au.*\n//g;
return ($ligne);
# Récupération du contenu textuel des balises qui nous intéressent grâce à une expression régulière ($1 est la variable par défaut du motif contenu entre parenthèses) : if ($ligne=~/<title>(.*)<\/title>/) {
$text_t.= "$1 \n";
}
if ($ligne=~/<description>(.*)<\/description>/){
$text_d.= "$1 \n";
}
# "Fermeture" du document XML de sortie : c'est-à-dire fermeture de l'élément racine (tout élément XML ouvert doit être fermé).

Voir un exemple de sortie du script (NB exemple produit pour les fils RSS d'une seule journée):

haut de la page

Sarah Terrail-Lormel, 2007-2008, Designed by Free CSS Templates