Scripts

Pour passer d'une liste de documents web à un corpus exploitable, il est nécessaire de passer par toute une série d'étapes afin de nettoyer, parser, concaténer notre corpus. Ce travail s'est réalisé à l'aide d'un script bash unique que nous avons enrichi au long du semestre.

Ce script permet, à partir d'une liste d'URLs, d'aspirer les pages associées, de n'en garder que le contenu textuel, et enfin d'organiser ce contenu grâce à une concaténation par langue. Enfin, ce script affiche les contextes d'apparition de notre expression-cible, "11 Septembre", partout dans le texte.

L'organigramme ci-contre décrit le fonctionnement du script, ses étapes sont détaillées ci-dessous.

Pour accéder directement au script complet, vous pouvez cliquer ici.

Aspiration

for lien in `cat $chemin/$doc`; do monlien=$(expr substr $lien 1 50); compteur=$(($compteur+1)); #ligne servant à aspirer la page web wget -O ../pages-aspirees/$doc$compteur.html $lien; retourwget=$?;

La première étape pour pouvoir travailler sur nos fichiers et bien sûr de les récupérer. Mais pas n'importe comment ! Si on récupère bêtement une page html, on récupère en fait son code source, agrémenté de diverses balises très utiles pour afficher agréablement une page web, mais très difficiles à éliminer automatiquement. C'est pourquoi nous avons utilisé un outil capable d'afficher le contenu d'une page web sous forme de texte brut, sans balises, et avec le moins de résidus possible : Lynx.

Lynx est un navigateur en mode texte, conçu pour fonctionner depuis une console de commandes. En récupérant la sortie de Lynx et en la détournant vers un fichier, on peut obtenir un contenu de page web propre. On bon départ pour éviter une trop grosse étape nettoyage.

Encodage

encodage=$(file -i ../pages-aspirees/$doc$compteur.html | cut -d" " -f3 | cut -d"=" -f2) echo "ENCODAGE INITIAL :$encodage-ICI"; if [[ $encodage == "utf-8" ]] #on utilise directement le dump ... else #on vérifie que l'encodage est dans les encodages reconnus par iconv verifencoddansiconv=$(iconv -l | egrep -io $encodage | sort -u); if [[ $verifencoddansiconv != "" ]] then lynx -dump -nolist -display_charset=$encodage $lien > ../dump-txt/dump$doc$compteur.txt; #on transcode iconv -f $encodage -t utf-8 ../dump-txt/dump$doc$compteur.txt > ../dump-txt/dump$doc$compteur-UTF8.txt; else #si l'encodage est précisé dans la head de la page web if egrep -i "<meta.*charset" ../pages-aspirees/$doc$compteur.html then echo "---présence d'un charset---"; encodage=$(egrep -i "<meta.*charset" ../pages-aspirees/$doc$compteur.html | egrep -i -o 'charset *=[^\"]+' | tr [A-Z] [a-z] | sort -u | cut -f2 -d=) ; #on recommence alors l'étape de vérification de l'encodage dans iconv #si l'encodage n'est ni connu par iconv ni précisé dans le code source de la page web, on ne peut rien faire

Lorsqu'on travaille sur des documents textuels, et tout particulièrement lorsqu'on traite des documents venant du web, on se retrouve inévitablement avec des problèmes d'encodage. Il est nécessaire de traiter ces problèmes le plus haut possible dans la chaîne de traitement, sous peine de ne plus pouvoir retrouver l'origine du problème, ou même de les cumuler avec les étapes.

Pour l'anglais, l'allemand et le français, nous n'avons pas rencontré de gros problèmes. Paradoxalement, l'anglais est celui des trois qui s'est montré le moins coopératif, car un certain nombre de sites américains utilisent un encodage latin-1, alors que les sites européens privilégient l'utf-8. Or, pour obtenir une base exploitable et homogène, l'unicode, et donc l'utf-8, nous était indispensable. Il a donc fallu passer par une étape de détection de l'encodage et de conversion vers l'utf-8 grâce à la très pratique commande unix i-conv.

Lorsque l'encodage ne pouvait pas être détecté par i-conv, il nous restait une option : chercher si l'auteur de la page html l'a indiqué "à la main" c'est à dire en spécifiant une balise charset. Si aucune de ces deux étapes n'a permis de déterminer l'encodage, le fichier n'est malheureusement pas exploitable.

En ce qui concerne l'arabe, avec un encodage unicode, on ne rencontre finalement pas tant de problèmes que ça. Le seul point qui nous a véritablement interpelé, c'est le problème du sens de lecture.

Concaténation

#on ajoute une balise avec l'ID du fichier afin que Le Trameur puisse séquencer le corpus cat <fichier = $compteur>" >> ../dump-txt/$doc-concatenationDump.txt; #on ajoute le dump lui-même cat ../dump-txt/dump$doc$compteur-UTF8.txt >> ../dump-txt/$doc-concatenationDump.txt;

Lors de la mise en place des dumps (fichiers de texte brut en UTF8 pour chaque article) traitée dans une boucle parcourant chaque texte de nos divers corpus, on ajoute après la création du dumps deux choses : la première consiste à enregistrer le résultat dans un fichier texte qui comprendra donc le texte correspondant à l'article tout propre en UTF8 et tout seul. Mais on ne se contente pas d'avoir nos dumps séparément dans des dizaines de fichiers différents ! En plus de cela, on crée un fichier global de concaténation auquel on ajoute le nouveau texte à chaque tour de boucle en séparant les articles par une balise indiquant son numéro : <fichier=NUMERO> qui nous permettra de donner ce joli pavé comme entrée au Trameur pour qu'il nous donne des informations analysable fichier par fichier tout de même !

Recherche de motif

motif="(11-septembre)|(September 11)|(9/11)|(11 septembre)|(11. september)|(11 september)|(11 سبتمبر)"; #... ici du code tronqué... #on cherche le motif directement avec egrep egrep -i "\b$motif\b" ../dump-txt/dump$doc$compteur-UTF8.txt > ../contextes/contextes$doc$compteur-UTF8.txt ; cat ../contextes/contextes$doc$compteur-UTF8.txt >> ../contextes/$doc-concatenationContextes.txt; nbOccur=??; nbOccur=$(egrep -o -i "\b$motif\b" ../dump-txt/dump$doc$compteur-UTF8.txt | wc -l ); #là on cherche le motif avec le programme en Perl de SF /opt/ActivePerl-5.8/bin/perl ./minigrepmultilingue-v2.2-regexp/minigrepmultilingue.pl "UTF-8" ../dump-txt/dump$doc$compteur-UTF8.txt ./minigrepmultilingue-v2.2-regexp/motif-regexp.txt ;

Nous avons ici simplement utilisé le script en Perl fournit par Serge Fleury qui permet de chercher dans un texte un motif, que ce soit juste un mot, une suite de caractères ou bien une expression régulière. Pour nous, il s'agira donc de chercher les termes du genre "11 Septembre", "9/11" et les variantes dans toutes les langues que nous avons choisies. Le résultat de ce script est stocké de deux façons : un premier fichier .txt est créé, peu lisible et qui contient uniquement les lignes "matchant" notre motif : pratique pour des traitements ultérieurs. Mais un deuxième fichier en HTML (créé par les bons soins de SF encore une fois) nous présente les choses au format html avec une mise en page plus lisible :

Screenshot des contextes présentés en HTML

L'exemple donné ici a été fait avec un motif non-définitif qui a servi pour nos tests au début du projet.

Nettoyage

Le nettoyage se fait essentiellement à la main, et est destiné à préparer le corpus pour qu'il soit utilisable avec nos différents outils de statistiques textuelles.