Historique du projet


Phase 1 :

- Création du blog
- Préparation de l'environnement de travail
- Constitution du corpus
- Ecriture du script et analyses des résultats produits

Phase 2 :

- Nuages de mots
- Trameur



Phase 1


I) La création du blog

Une fois notre sujet de projet défini, nous nous sommes lancés dans la création d'un blog dédié à la description des différentes étapes d'écriture de notre programme ainsi que des difficultés rencontrées. Si vous souhaitez connaître plus en détails les étapes de notre projet, notamment des informations sur l'utilisation des différentes commandes décrites ci-après, n'hésitez pas à y jeter un œil en cliquant ICI

II) L'environnement de travail

La première chose à faire était d'organiser notre environnement de travail avec les dossiers suivants :

  • URLS : Emplacement de nos trois fichiers d'urls anglais.txt, chinois.txt et francais.txt.
  • PROGRAMMES : Emplacement de notre script.sh, du fichier input.txt contenant les chemins vers les fichiers d'entrée (./URLS) et de sortie (./TABLEAUX/tableau.html) pour le programme.
  • PAGES-ASPIREES : Emplacement des urls téléchargées
  • DUMP-TEXT : Emplacement des contenus des pages aspirées sauvegardés en fichiers texte.
  • CONTEXTES : Dossier contenant les contextes dans lesquels notre mot choisi apparaît
  • INDEX : Dossier contenant les dictionnaires de chaque fichier Dump.
  • TABLEAUX : Emplacement du tableau HTML produit par le script
  • FICHIERGLOBAUX : Emplacement des fichiers contenant la concaténation de tous les fichiers dump, contextes et index.

  • III) Constitution du corpus

    Après avoir créé ces dossiers, nous pouvions commencer à constituer notre corpus de 150 urls (50 par langue) autour de notre sujet.
    Pour cela, nous avons écrit notre mot clef « peine de mort »/« peine capitale » en français, anglais et chinois, et nous sommes concentrés sur les forums, blogs et autres sites contenant des commentaires d'internautes à ce sujet.
    Ce choix de sites nous semblait en effet plus pertinent, nous permettant d'obtenir différents arguments pour et contre la peine de mort. Nous avons alors ajouté des mots clefs tels que « débat », « pour-contre », « opinion » à notre recherche, ce qui nous a permis de rassembler un grand nombre de liens contenant des arguments divers sur le sujet.

    IV) Ecriture du script et analyses des résultats produits

    Une fois notre corpus complet et placé dans notre dossier URLS, le temps était venu de passer à l'écriture de notre programme. Celui-ci avait pour but de créer les fichiers nécessaires pour notre analyse en phase 2, tout en les plaçant dans un tableau HTML.

  • Aspiration des pages

  • Le premier travail effectué par le programme est l'aspiration des pages web, grâce à la commande :

    wget --no-check-certificate -O ./PAGES-ASPIREES/$j/$i.html $ligne;

    Cette commande est suivie d'une variable retourwget=$?; nous permettant de créer des conditions en fonction de la valeur retournée. Ainsi, dans notre programme, si le retour de wget est autre que 0 (signifiant que tout s'est bien passé), nous ne traitons pas ces pages et colorons les lignes du tableaux en rouge pour ces urls non traitées.
    A cette étape, nous obtenons trois colonnes (sans compter celle des numéros de lignes) : une colonne contenant les liens Urls, une seconde contenant les pages aspirées et une autre affichant le retour wget.

  • Dump

  • Les dump sont les contenus des pages aspirées extraits en format .txt. Pour cela, on utilise la commande lynx et son option -dump :

    lynx -dump -nolist -display_charset="$encodage" ./PAGES-ASPIREES/$j/$i.html > ./DUMP-TEXT/$j/$i-utf8.txt;

  • Display Charset

  • L'option display_charset permet de sauvegarder les pages dans l'encodage souhaité. Ici, la variable $encodage fait référence à une commande servant à identifier l'encodage des pages. Dans notre programme, on utilise trois façons différentes pour détecter l'encodage, dans l'ordre :

    encodageMeta=$(egrep -io "]+>" ./PAGES-ASPIREES/$j/$i.html | egrep -io "charset *=[^ \>]+" | cut -d= -f 2 | tr -d \" | tr -d \' | tr -d \> | tr -d " " | tr -d \/ | sort -u);

    Cette commande identifie l'encodage de la page directement dans le charset contenu dans l'en-tête.
    Dans le cas où la commande de la variable $encodageMeta n'a pas permis d'identifier l'encodage, on essaye avec la commande iconv :

    encodageIconv=$(iconv -l | egrep -io "$encodageMeta" | sort -u | sed 's/\///');

    Enfin, si cette dernière n'a donné aucun résultat, on utilise la commande file en dernier recours :

    encodageFile=$(file -i ./PAGES-ASPIREES/$j/$i.html | cut -d= -f2);

    Ainsi, dans notre script, si le charset est en UTF-8 (ou utf-8 en minuscules), on demande à ce que la page soit dumpée dans ce même encodage au lieu d'écrire directement -display_charset="utf-8'', pour éviter toute ambiguïté (notamment le problème de la différence de casse entre UTF-8 et utf-8).

    Cette étape donne lieu à la création de deux colonnes supplémentaires  : Dump et Dump utf-8.
    Les pages déjà encodées en utf-8 se retrouvent directement dans cette dernière colonne, tandis que celles devant être réencodées se retrouvent en « deux exemplaires » : le dump original dans la colonne Dump (avec l'encodage de base précisé en dessous du lien), et sa version encodée en utf-8 dans la colonne Dump utf-8.

    La commande utilisée pour encoder ces pages vers l'utf-8 est :

    iconv -f $encodage -t utf-8 ./DUMP-TEXT/$j/$i.txt > ./DUMP-TEXT/$j/$i-utf8.txt;

  • Contextes

  • Les contextes permettent de rassembler uniquement les lignes qui nous intéressent (dans les fichiers Dump utf-8) pour notre analyse, c'est-à-dire celles qui contiennent « peine de mort ». Pour identifier ces lignes, nous avons utilisé la commande egrep suivie de notre motif en expression régulière :

    egrep -i "([Pp]eine de mort)|([Pp]eine capitale)|([Dd]eath penalty)|([Cc]apital punishment)|死刑" ./DUMP-TEXT/$j/$i-utf8.txt > ./CONTEXTES/$j/$i-utf8.txt;

    Cette expression régulière unique pour toutes les langues traitées a l'avantage de nous éviter de créer des conditions supplémentaires pour chaque langue. Détail important pour le chinois, il est impératif de ne laisser aucun espace dans l'expression. En effet, après avoir fait l'erreur d'écrire notre motif en les séparant par des espaces, cela ne posait aucun problème pour le français et l'anglais, mais cela a empêché la reconnaissance du motif chinois puisqu'il n'y a pas d'espaces entre les mots dans cette langue !

    Comme pour les Dump, les contextes disposent de deux colonnes : une colonne contenant les fichiers contextes, et une seconde contenant les contextes en HTML. Ces derniers sont créés grâce au programme Perl minigrepmultilingue.pl lisant notre motif dans un fichier motif-regexp.txt. Il renvoie l'extraction du motif dans un fichier html, que l'on déplace ensuite dans le dossier CONTEXTES avec la commande mv :

    perl ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/$j/$i-utf8.txt ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/motif-regexp.txt;
    mv ./resultat-extraction.html ./CONTEXTES/$j/$i-utf8.html;

  • Contextes

  • Comme vu précédemment lors de la description de notre environnement de travail, les index sont les dictionnaires des mots contenus dans les Dump utf-8.
    Au départ, nous avions utilisé la commande :

    egrep -o "\w+" 1.txt | sort | uniq -c | sort -r

    pour réaliser ces dictionnaires, mais l'expression ''\w+'' (signifiant « tous les mots ») intégrait aussi des caractères non pertinents dans la liste (ponctuation, chiffres et autres symboles).
    Nous avons alors opté pour l'utilisation de la commande sed afin de supprimer ces caractères pour qu'ils ne soient pas intégrés au dictionnaire :

    sed -re 's/[0-9]+|\(|\.|!|,|\)|\[|\]|«|»|;|:|\*|\+|\-|\_|\%|"|•|\&|\t|\||\/|#|©|$|\–|—|<|>|\^|►|www|$|gif/ /g' ./DUMP-TEXT/$j/$i-utf8.txt | sed -re 's/ /\n/g' | sort | uniq -ci | sort -nr > ./INDEX/$j/$i.txt;

    (Nous vous renvoyons à l'article Tableau à 10 colonnes de notre blog pour une description détaillée de cette commande !)

  • Nombres d'occurences

  • Cette dernière colonne affiche le nombre d'occurrences de notre motif dans les fichiers dump utf8.
    En voici la commande :

    nbOccur=$(egrep -o -i "([Pp]eine de mort)|([Pp]eine capitale)|([Dd]eath penalty)|([Cc]apital punishment)|死刑" ./DUMP-TEXT/$j/$i-utf8.txt | wc -l);

  • Fichiers globaux

  • Enfin, des fichiers globaux sont ajoutés à la fin des colonnes Dump utf-8, Contextes et Index, contenant les fichiers concaténés de toutes ces colonnes.
    Le fichier dump global nous a ensuite servi à créer les Nuages de mots, et les contextes globaux ont été utilisés pour l'analyse avec le Trameur