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/'/'/g;
$ligne=~s/"/"/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