Séance 9 à 11 (Partie 1) : Améliorations du script, contexte txt et contexte html avec minigrep

(Semaine du 24/11/2021 – Semaine du 08/12/2021)

  • Modification de la condition if

Notre première condition if nous permettait de savoir si tout ce qui concerne le code HTTP se passait bien. C’est après cette étape que l’on décidait de récupérer l’encodage de la page via curl -L -I. Cependant, pour certains liens, cela ne suffisait pas, car il n’y avait aucun encodage obtenu avec cette première méthode. Si l’encodage est vide, un autre if a été créé afin de récupérer cette fois-ci, l’encodage via le code html de la page à l’aide de curl -L -i (i minuscule). (Voir l’encadré bleu ci-dessous.)

Normalement, nous sommes quasiment sûrs d’avoir un encodage non vide dans notre variable $encodage. Mais cet encodage n’est pas obligatoirement de l’UTF-8.

Il avait d’abord été tenté de vérifier si l’encodage était présent dans la liste iconv -l afin de convertir nous-même le fichier de l’encodage non UTF-8 à UTF-8 avec iconv, avant de rentrer dans la boucle if [[ $encodage == « UTF-8 » ]]. Cependant, après ces tentatives, un problème s’est posé : le fichier était réencodé une deuxième fois en UTF-8 via l’option lynx –assume_charset UTF-8 (encadré jaune). Cette piste a donc été abandonnée au profit d’un if où l’encodage peut être UTF-8 ou un autre encodage connu de la liste iconv -l. L’option de lynx –assume_charset UTF-8 effectuera par la suite, une et une seule conversion du texte, en UTF-8. Les pages aspirées ne seront donc pas converties en UTF-8 mais les dump-texts créés à partir de ces pages aspirées seront en revanche, bien convertis en UTF-8.

  • Contexte txt

On instancie notre expression régulière dans une string nommée « motif » avant de rentrer dans la boucle de traitement de chaque fichier URL.

Dans nos boucles imbriquées, on lit notre fichier brut que l’on a créé pour chaque URL et on modifie les retours à la ligne par un symbole peu utilisé afin de pouvoir se servir de la commande sed plus facilement. En effet, sed fonctionne ligne par ligne et ne reconnait donc pas les \n, c’est pourquoi l’on passe par un autre moyen afin de pouvoir tout de même remplacer les sauts de ligne. Cette suite de commandes permet de mettre les lignes d’un même paragraphe sur une même ligne, au lieu de les avoir sur plusieurs, puis de rétablir les sauts de lignes entre les paragraphes.

Cela est très utile pour notre egrep (qui suit le pipe de la ligne précédente), qui va prendre comme contexte, jusqu’à 7 « mots » (nombre choisi arbitrairement) avant et après notre motif comme demandé ci-dessus. Si l’opération précédente n’avait pas été réalisée, le egrep s’arrêterait à chaque saut de ligne, bien que nous voulons la suite du contexte, contenue à la ligne suivante.

L’expression régulière trouvée permet de capter des mots même composés comme « Royaume-Uni » ou bien en allemand – où les mots composés sont très courants – des mots comme « EU-Parlament » ou « EU-Brexit-Chefverhandler ». Les ponctuations les plus courantes ont été également listées afin de ne pas s’arrêter à la vue d’apostrophes ou de parenthèses par exemple. La variable « motif » de type string, doit être mis entre accolades et précédée d’un dollar pour être correctement appelée.

  • Légères améliorations du script

1) Nettoyage des dump-texts

Rajout de la commande grep -v « [+*].* » pour nettoyer un peu plus les dump-text (bien que cela ne reste pas suffisant). La commande grep suivi de l’option -v permet de prendre toutes les lignes qui ne commencent pas par + ou par *, correspondant souvent à des catégories de menu qui ne nous sont pas utiles.

2) Rajout du compteur de fréquence cptfreq

Un compteur de motifs a été rajouté afin de connaître le nombre de fois où apparaît notre motif pour chaque lien. Pour ce faire, la commande egrep associée aux options -c et -o avait d’abord été utilisée comme suit :

Cependant, l’option -c va compter le nombre de lignes dans lequel apparaît le motif. L’option -o qui permet de capter seulement le motif trouvé en question, et non la ligne entière, ne change pas le comportement de le comptage de l’option -c. Cela signifie que si une ligne contient trois occurrences du motif, elle ne sera comptabilisée qu’une fois. C’est pourquoi une modification s’est imposée, afin de compter le nombre de lignes obtenu après le egrep -o à l’aide de la commande wc -l. Ainsi, ce sera bien le nombre d’occurrences du motif que l’on obtiendra dans la variable cptfreq.

La colonne « CPT motif » a bien sûr été rajoutée de la même manière que les colonnes précédentes, au tableau final.

3) Modification du tableau

Trois lignes supplémentaires ont été ajoutées au début de chaque tableau afin d’avoir :
– le numéro du tableau
– le nom du fichier URL traité par le tableau
– le motif recherché

Les balises <th colspan= »11″> </th> permettent de définir sur combien de colonnes la ligne va s’étendre. Ici, nous avons un total de 11 colonnes, d’où ce chiffre, afin d’avoir ces trois lignes centrées et prenant toute la longueur du tableau.

  • Contextes html avec minigrep

Le contexte html quant à lui, a été bien créé à l’aide du programme minigrep qui a été fourni et ces deux lignes de code qui permettent l’exécution du programme et le renommage du fichier créé, déplacé dans le dossier CONTEXTES :

Explication : Après avoir installé perl au préalable, la commande pour exécuter minigrep a été utilisée, avec comme arguments, le type d’encodage, le fichier dump-text à traiter, et un fichier motif.txt qui contient l’expression régulière suivante (motifs de « l’Union européenne » pour l’allemand et le français).

Problème cependant : il a été remarqué que le programmme minigrep ignorait la casse, car le motif « EU » (initiales de Union européenne en allemand) pouvait être retrouvé en français (« eu » minuscule du verbe « avoir »). Le motif était donc pris en compte alors que nous ne le voulions pas. Après consultation avec nos professeurs, le i de la ligne 112 dans le script perl de minigrep devait être supprimé pour remédier à ce problème. En effet, ce i permet de chercher le motif, indifféremment des minuscules ou majuscules. En le supprimant, la recherche s’effectue alors sur les caractères tels qu’ils sont.

La colonne contexte html a également été bien entendu, été rajoutée de la même manière que les colonnes précédentes dans le tableau final, avec un lien cliquable renvoyant au contexte html du fichier correspondant. De plus, le contenu du dossier CONTEXTE est maintenant, comme les dossiers PAGES-ASPIREES et DUMP-TEXT, également supprimé à chaque réexecution de script à l’aide de la commande rm.

Voici un extrait du tableau obtenu :

  • Quelques remarques

1) Limite relevée concernant les contextes.txt

La commande egrep « consommant » les mots une seule fois, si nos motifs « motif UE 1 » et « motif UE 2 » sont rapprochés, le contexte de « motif UE 1 » peut contenir « motif UE 2 », et donc passer à côté d’un contexte qui aurait dû être créé pour « motif UE 2 », comme c’est le cas ici dans la ligne 3.

De la même manière, si les motifs sont rapprochés, nous pouvons également observer que le contexte ayant déjà été consommé pour un contexte précédent ne figurera pas dans le contexte du motif suivant, comme c’est le cas ici où la ligne 2 et la ligne 3 se suivent directement dans le texte.

2) Limite relevée concernant minigrep

Il a été observé qu’un motif comme « Union européenne », s’il est séparé sur deux lignes dans le dump-text, ne sera pas pris en compte dans le contexte html après l’exécution du programme minigrep. Par exemple, l’occurrence ci-dessous est présente dans un de nos dump-texts mais est absente dans le contexte html.

3) Difficulté concernant l’allemand

Les mots composés en allemand sont très fréquents, et peuvent être plus ou moins intéressants pour notre étude. En effet, en allemand, lorsque nous avons un mot de forme « EU-mot » , EU peut être utilisé pour qualifier le mot qui suit d’ « européen » sans forcément avoir la notion du terme « Union européenne » que l’on veut avoir en particulier.

Ici par exemple, dans la ligne 2, le terme « EU-Seite » nous intéresse, car il signifie « du côté de l’Union européenne ». Contrairement à la ligne 4, où le terme « EU-Kommission » correspond à la « Commission européenne » : le sujet ici est l’institution (la Commission) qui est qualifiée d’européenne, et ne correspond pas réellement à notre terme de « l’Union européenne » en tant que telle, mais bien à une institution dérivée. Un autre exemple « EU-Parlament » à la dernière ligne signifiant le « parlement européen » : ici encore, nous ne voulons pas avoir le contexte de toutes les organisations qualifiées « d’européennes » mais bien seulement le contexte du terme de « l’Union européenne ». Malheureusement, le problème ici est d’ordre sémantique et ne peut donc être réglé en surface…

Laisser un commentaire

Concevoir un site comme celui-ci avec WordPress.com
Commencer