PROJET ENCADRE, TRAVAIL SUR LE MOT BARRAGE

Auteurs:     Thomas Ragot (Paris 3)
                    Yann Hiard (Paris 3)
                    Samia Achouri (Paris 3)




1. Introduction



    Ce travail avait  pour but de nous présenter une chaine de traitement textuel simple. Il s'agissait de partir d'un mot, ici barrage, et de constituer un corpus de pages web contenant au moins une fois ce mot. On a cherché  ensuite à transformer ces pages web en texte brut, afin d'en extraire des occurences en contexte du mot barrage.  On a utilisé pour cela essentiellement les commandes BASH (Bourne Again SHell), émulé sous windows par le programme Cygwin.

2. Le mot barrage


Définition du Trésor de la Langue Française informatisé

A. Action de barrer.
B. P. méton. Barrière, obstacle qui ferme un passage.

Le sens A admet des sens particuliers liés à des expressions figées que nous rencontrerons plus tard (tir de barrage, faire barrage, match de barrage, test de barrage...)

3. Choix des pages contenant le mot barrage


    Pour cette étape, on a constitué un fichier d'une cinquantaine d'urls (urls.txt),contenant des urls de pages où apparaissent une ou plusieurs fois le mot "barrage". Nous avons décidé de constituer un corpus représentatifs des différents sens de barrage. On a essayé aussi de choisir des pages provenant de sources différentes: moteur de recherche (google), presse (archive du monde et monde diplomatique), encyclopédie (Wikipédia).
    On a ensuite classé ces urls selon le sens du mot barrage dans la page correspondante (urlsclasse.txt).le fichier final a donc cette structure:
barrage_routier
http://www.monde-diplomatique.fr/2005/08/ZINN/12400.html
http://sfmac.no-ip.com/corpusLeMonde/HTML/041201/data/article_389033.html

faire_barrage
http://www.monde-diplomatique.fr/2004/05/DELPHY/11173.html
http://www.monde-diplomatique.fr/2005/05/LORDON/12175.html
etc...

4. Capture des pages avec wget


    Le fichier d'urls constitué, il s'agissait de capturer les pages afin d'avoir une version locale. On a utilisé ici l'application cygwin, qui est une émulation du terminal BASH que l'on trouve sous UNIX ou LINUX. la commande Wget nous a permis de capturer les pages.
    voici sa syntaxe:
wget [option]... [URL]...

    ce qui donne appliqué à une de nos urls:
wget  http://www.monde-diplomatique.fr/2005/03/BOVET/12113.html

    cette commande capture la page et cree le fichier 12113.html qui est une copie locale de la page web. L'option -i nous a permis de nous simplifier la tâche: on indique le nom du fichier contenant les urls des pages nous intéressant et les pages correspondantes sont capturées. Ainsi la commande:
wget -i urls.txt
nous a permis de capturer toutes les pages que l'on avait sélectionné précédemment.

Problèmes rencontrés à cette étape

 

5. Transformation des fichiers .html en texte brut grâce à la commande lynx.


    La commande lynx permet d'afficher des pages web en mode texte. Cette commande dispose d'une option, - dump, qui permet de rediriger le texte d'un page vers la sortie standard. Ainsi, en redirigeant vers un fichier le flux de sortie de la commande vers un fichier, on peut ne conserver que le texte de la page. ainsi la commande:
lynx -dump http://www.monde-diplomatique.fr/2005/03/BOVET/12113.html > diplo.txt
"dumpe" la page du monde diplomatique, le resultat est un fichier texte (diplo.txt) qui contient uniquement le texte de la page, sans mise en forme.

Problèmes rencontrés à cette étape



6. Organisation des données et automatisation des taches

6.1  Script permettant la création automatique d'un tableau de résultats

    Arrivé à ce stade, il s'agissait de créer un tableau organisant les données déjà récupérés dans un tableau de synthèse associant les urls aux fichiers constitués à partir de ces urls (fichiers de capture, fichiers dumpés). On nous a fourni comme exemple le fichier suivant, qui crée un tableau à une colonne avec les urls (voir le tableau) :

#!/bin/bash
echo "donne nom de fichier contenant les liens http"; #c'est la liste des pages wgettées
read fic; #le programme connait le fichier de liens sous le nom $fic
echo "donne nom de fichier html où stocker ces liens"; #c'est le tableau de liens à créer
read tablo; #enregistre nom donné par utilisateur dans la variable $tablo
echo "<html><head><title>tableau de liens</title></head><table>" > $tablo; #code de début de tableau
for nom in `cat $fic` #$nom est la variable dans laquelle sera stocké chaque lien
{
echo "<tr><td>$nom</td></tr>" >> $tablo; #création d'un tableau à une colonne et autant de lignes qu'il y a d'URL
}
echo "</table></html>" >> $tablo; #code de fin de tableau
#le fichier dont le nom correspond à la variable tablo est maintenant créé, ouvrez-le

6.2 Ajout au tableau des liens vers les fichiers locaux

    A l'aide de la documentation qui nous a été conseillée, on a  cherché à modifier ce script afin qu'il automatise le plus de tâches possible. On a commencé par modifier le script afin de transformer les urls en liens  et de créer une deuxième colonne contenant les liens vers les fichiers locaux associés aux urls :

#!/bin/bash
echo "donne nom de fichier contenant les liens http"; #c'est la liste des pages wgettées
read fic; #le programme connait le fichier de liens sous le nom $fic
echo "donne chemin du repertoire contenant les fichiers locaux";
read rep; #le programme connait le chemin du repertoire contenant les fichiers locaux sous le nom $rep
echo "donne nom de fichier html où stocker ces liens"; #c'est le tableau de liens à créer
read tablo; #enregistre nom donné par utilisateur dans la variable $tablo
echo "<html><head><title>tableau de liens</title></head><table>" > $tablo; #code de début de tableau
for nom in `cat $fic` #$nom est la variable dans laquelle sera stocké chaque lien
{
echo "<tr>">>$tablo;#création d'une nouvelle ligne
echo "<td><a href=\"$nom\">$nom</a></td>" >> $tablo; #création d'une première colonne avec l'url
nom2=`echo $nom|sed -ne 's/.*\///p'` ;#On crée le nom du fichier local en supprimant tout ce qui est avant le dernier slash
echo "<td><a href=\"$rep/$nom2\">fichier local</a></td>">>$tablo;#création d'une deuxième colonne avec le lien vers le fichier capturé
echo "</tr>">>$tablo; #balise de fin de ligne
}
echo "</table></html>" >> $tablo; #code de fin de tableau
#le fichier dont le nom correspond à la variable tablo est maintenant créé, ouvrez-le.

    On a rajouté deux lignes au début du programme:

echo"donne chemin du repertoire contenant les fichiers locaux";
read rep;

    Ces deux lignes permettent d'indiquer au programme le chemin du repertoire contenant les pages capturées.
 
    On a aussi rajouté deux lignes à l'intérieur de la boucle:

nom2=`echo $nom|sed -ne 's/.*\///p'` ;

    La commande echo renvoie $nom (qui contient l'url en cours) le pipe (|) permet de rediriger cette sortie vers la commande sed. La commande sed, qui permet d'éditer du texte (ici remplacement) efface la première partie de l'url, le chemin du fichier en ligne, pour ne garder que le nom du fichier qui correspond à celui donné par wget au fichier de capture.

echo "<td><a href=\"$rep/$nom2\">fichier local</a></td>">>$tablo;

    On écrit dans le fichier $tablo la colonne permettant l'affichage du lien vers le fichier capturé associé à l'url de la colonne précédente, qui renvoie à la page contenu dans le repertoire saisi par l'utilisateur.

voir le tableau créé

6.3 Automatisation de la commande lynx 

    On a vu plus haut qu'il était nécessaire d'écrire un script pour traiter nos cinquantes urls plus rapidement. Encore une fois, on a repris le même patron de script:

#!/bin/bash
echo "donne chemin du repertoire contenant les fichiers locaux";
read rep; #le programme connait le chemin du repertoire contenant les fichiers locaux sous le nom $rep
ls $rep/>dump.txt;
mkdir dump;
for nom in `cat dump.txt` #$nom est la variable dans laquelle sera stocké chaque lien
{
nom2=`echo $nom|sed -ne 's/html/txt/p'` ;
lynx -dump $rep/$nom > dump/$nom2;
}

    La méthode a ici légèrement changé: on ne part pas d'une liste prédéfinie mais on la constitue à partir du répertoire des fichiers capturés, à travers la commande ls, qui liste les fichiers d'un répertoire donné.  Avec la commande mkdir on crée ensuite le répertoire dump chargé d'accueillir les fichiers dumpés que l'on crée à partir de la liste, juste en changeant l'extension .html en .txt à l'aide de la commande sed.

7.  Recherches des contextes du mot "barrage"

    Une fois le corpus disponible en texte brut grâce à la commande lynx, il s'agissait d'extraire des contextes  du mot "barrage". Pour cela, on  dispose de la commande egrep dont voici la syntaxe:

    egrep [options] PATTERN [FILE...]

    La commande egrep affiche les ligne qui correspondent à un motif donné, ce motif étant une expression régulière. Elle dispose d'un certain nombre d'options dont les principales sont:

    -c : affiche un décompte des lignes comprenant le motif
    cherché.
     -v :affiche les lignes qui ne contiennent pas le motif.
     -n : chaque ligne qui contient le motif est précédée de son
    numéro dans le fichier.
     -i : permet de ne pas tenir compte de la différence entre
    minuscules et majuscules
    -A nbx, -B nby : pour récupérer nbx lignes de contexte
    après (AFTER), et nby lignes de contexte avant (BEFORE)

quelques exemples avec la page http://agora.qc.ca/mot.nsf/Dossiers/Barrage(voir la version dumpée), qui est une page d'encyclopédie trouvée à partir de google:

    egrep  "barrage" barrage.txt

   Les projets de barrage soulèvent des controverses considérables. Il
   des travaux du barrage des Trois Gorges --, modification de la
   nappes phréatiques souterraines. Ci-dessus, le [12]barrage d'Assouan
   de travaux et mobilisa jusqu'à 30 000 travailleurs. Si le barrage a
   raz-de-marée provoquée par l'ouverture du barrage. Et conséquence de
   "Il existe environ 4 000 grands barrages (dont la hauteur est
   Commission internationale des grands barrages (CIGB). La plupart
   cependant se demander si l'époque des très grands barrages ne touche
   Au mois d'août 2000, la Commission mondiale des barrages (CMB) -
   nature (UMN) afin d'étudier l'efficacité des barrages sur le
   d'ores et déjà que les grands barrages ne tiendront pas toutes leurs
   source : Peter Coles, [13]Grands barrages: la fin d'une époque?, Le
   Peter Coles, [15]Grands barrages: la fin d'une époque?, Le Courrier de
   [18]Commission internationale des grands barrages

affiche toute les occurrences des mots "barrage" et "barrages", n'affiche pas Barrage (sensibilité à la casse)
   
    egrep -in  "barrage$" barrage.txt

    18:   Barrage

    affiche les occurrences de barrage en fin de ligne ($) sans tenir compte de la casse (-i) ,     assorti des numéro de ligne (-n).

    On devait chercher des contextes plus larges, ce que l'on a fait avec les options -B et -A:

   egrep -i -A1 -B1 "barrage" barrage.txt

   Sciences et techniques
   Barrage
   Photo: Adrien Gagnier, L'Encyclopédie de L'Agora
   Définition
   Les projets de barrage soulèvent des controverses considérables. Il
   s'agit d'un des modes d'intervention les plus dramatiques de l'homme
--
   peuplées -- près de 1 100 000 Chinois auront été relocalisés au terme
   des travaux du barrage des Trois Gorges --, modification de la
   dynamique des bassins hydrologiques, perturbation du niveaux des
   nappes phréatiques souterraines. Ci-dessus, le [12]barrage d'Assouan
   destiné à réguler les crues du Nil pour permettre la navigation à
   l'année: long de 3 kilomètres, haut de 40 mètres, il exigea 15 années
   de travaux et mobilisa jusqu'à 30 000 travailleurs. Si le barrage a
   permis l'irrigation de 850 000 hectares de terres désertiques, sa

       etc.

    ici sont affichées les fenêtre de trois lignes contenant le mot barrage.

8. Tableau final : automatisation avancée

#!/bin/bash
echo "donne nom de fichier contenant liste d'url";
read fic; #le programme connait le fichier de liens sous le nom $fic
echo "donne nom de fichier html où stocker ces liens"; #c'est le tableau de liens à créer
read tablo; #enregistre nom donné par utilisateur dans la variable $tablo
echo "<html><head><title>tableau de liens</title></head><body bgcolor="EEEEEE" ><table border=4 ><tr>" > $tablo; #code de début de tableau
echo "<tr><td><b>URL</b></td><td><b>FICHIER LOCAL</b></td><td><b>FICHIER DUMP</b></td><td><b>CONTEXTE</b></td><td><b>NOMBRE DOCCURENCES</b></td>">>$tablo;
mkdir dump;
mkdir motif;
for nom in `cat $fic` #$nom est la variable dans laquelle sera stocké chaque lien
{
if echo "$nom" | grep -q "http";
then
nom2=`echo $nom|sed -ne 's/.*\///p'` ;
nom3=`echo $nom2|sed -ne 's/html/txt/p'` ;
lynx -dump capture/$nom2 > dump/$nom3;
egrep -i -A1 -B1 "barrage" dump/$nom3>motif/$nom3;
nb=`egrep -i -c "barrage" dump/$nom3`;
echo "<tr>">>$tablo;
echo "<td><a href=\"$nom\">$nom</a></td>" >> $tablo; #création d'un tableau à une colonne et autant de lignes qu'il y a d'URL

echo "<td><a href=\"capture/$nom2\">capture</a></td>">>$tablo;
echo "<td><a href=\"dump/$nom3\">dump</a></td>">>$tablo;
echo "<td><a href=\"motif/$nom3\">egrep</a></td>">>$tablo;
echo "<td>$nb</td>">>$tablo;
echo "</tr>">>$tablo;

else
echo "<tr><td>$nom</td></tr>">>$tablo;

fi;
}
echo "</table></body></html>" >> $tablo; #code de fin de tableau
#le fichier dont le nom correspond à la variable tablo est maintenant créé, ouvrez-le

voir le tableau final

    On a  travaillé à partir du fichier d'urls classé par catégories. On a  rajouté une structure conditionnelle (if... else) à l'affichage d'une ligne de tableau, qui fasse la différence entre les catégories et les URLS, en décrivant à l'aide d'une expression régulière ce qu'est une URL .


9. Conclusion


    On nous a donc demandé de traiter une cinquantaine d'URL afin de constituer ce corpus. On s'aperçoit bien qu'il aurait été très long de tout faire manuellement. Grâce aux commandes shell, nous avons pu gagner un temps précieux.
    Automatiser n'est pas chose aisée dans la mesure ou toute automatisation peut produire des flux inninterprétables, du bruit, ou du silence, ce qui peut gêner l'analyse. Cependant, il suffit souvent de réflechir un peu pour trouver une solution. Les outils mis à notre disposition, outre le fait d'être libres, sont extremement puissants et sont particulièrement adaptés à ce type de travail. De plus il faut reconnaître que lorsqu'un script s'execute et renvoie les resultats attendus, on en retire un certain contentement, ce qui n'est pas négligeable.
    Nous y gagnons donc du temps, de l'argent et de l'expérience...  

Document made with Nvu