RÉALISATION DU SCRIPT

1-) La boucle ” for ” et création des variables

Cette partie du script est responsable de la création de la boucle avec laquelle on va assigner à chaque URL, un numéro de ligne.

Elle comprend deux variables, $1 qui renvoie au fichier d’URLs à traiter, et $2 qui renvoie au fichier sous format HTML à créer.

Pour chaque fichier de la variable $1 (urls) , la boucle doit lire chaque élément et lui assigner une ligne, qui servira à le placer dans un tableau. Cela se fait grâce à un compteur, il est implémenté avec compteur=1, qui fait référence à la façon dont on va organiser le tableau à partir de la première ligne.

Les emplacements des deux variables sont définis lors de la commande de l’exécution du script, qui prend la forme ” sh ./PROGRAMMES/script1.sh ./URLS ./TABLEAUX “.

Cette image a un attribut alt vide ; le nom du fichier est projettal4.png
Le script Shell à exécuter
Cette image a un attribut alt vide ; le nom du fichier est projettal3.png
L’exécution du script depuis le Terminal Bash
Cette image a un attribut alt vide ; le nom du fichier est projettal5.png
Le rendu du fichier HTML, pour le fichiers d’URLs en arabe

2-) Vérification du code HTTP et extraction de l’encodage

Cette image a un attribut alt vide ; le nom du fichier est e.png
Le script utilisé

Si la colonne ” encodage ” affiche HTTP 200, il s’agit d’un encodage pertinent et on peut donc traiter l’URL. Le cas échéant, les colonnes suivantes sont vides et l’URL correspondante ne peut être traitée.

Nous vérifions que l’encodage est en UTF-8, pour la suite du traitement. UTF-8 doit s’afficher sous la colonne “Encodage” sur la page HTML générée.

Nous allons expliquer le fonctionnement de ces commandes plus précisément:

if [[ $coderetourhttp == 200 ]]
then

L’instruction if permet d’effectuer des opérations si une condition est réalisée, et elle peut aussi inclure une instruction else permettant d’exécuter des instructions le cas échéant:

if condition
    then instruction(s)
else instruction(s) 
fi

Il est possible d’imbriquer des commandes if dans d’autres commandes if  :

if condition1
    then instruction(s)
else
    if condition2
        then instruction(s)
    else
        if condition3
            ...
        fi
    fi
fi

On met deux crochets hors de la condition qu’on va mettre ( [[condition]] ), et “==” ce qui signifie qu’un élément est égal à un autre.

encodage=$(curl -sIL -o tototo.html -w %{content_type} $ligne | cut -f2 -d”=” | tr ‘[a-z]’ ‘[A-Z]’ | tr -d ‘\r’);

Voici les fonctions des variables de curl qu’on a employé sur cette commande (Attention aux lettres en majuscules ou en minuscules):

-s (silent)signifie qu’il ne faut pas afficher le résultat des commandes de curl

-I signifie qu’il faut afficher la tête de page

-L (location): pour rediriger une base sur la localisation pertinente, si celle-ci possède une localisation différent

-o (output) permet de rediriger la sortie vers un fichier

curl -sIL -o tototo.html  => lire le contenu des URLs et récupérer la tête de toutes les pages en “silence” dans le fichier : tototo.html 

Avant de continuer, nous allons voir quelques exemples pour réparer l’encodage:

Exemple 1
Exemple 2

Généralement, « UTF-8 » se trouve sur la même ligne que « Content_Type », surtout dans la deuxième partie si on traite «  charset=UTF8 » comme un ensemble dont “=” est le délimiteur. Mais si on trouve « text/html » au lieu de « UTF-8 » dans le « Content_Type », malheureusement, cette URL ne peut pas être traitée car cette information est inutilisable.

-w (write out) est une variable pour détecter l’information demandée. -w %{content_type} permet de détecter l’information dans « content_type ».

cut -f2 -d”=” signifie qu’on coupe et garde la deuxième partie dont le délimiteur est “=”.

La commande tr (transfer)permet de remplacer des caractères par d’autres. tr ‘[a-z]’ ‘[A-Z]’ permet de transformer tous les caractères alphabétiques en majuscule. En considérant la variation des écritures de « utf-8 », par exemple « UTF-8 » , « utf-8 » ou bien  encore « Utf-8 », on peut remplacer toutes ces réalisations par « UTF-8 ».

tr -d ‘\r’ : -d (delete) permet de supprimer les caractères dans leur “input”. Cette commande consiste à supprimer le caractère de “return” (touche d’entrée).

curl -L -o “./PAGES-ASPIREES/$numerotableau-$compteur.html” “$ligne”;

Ensuite, nous récupérons la page localement et on la rangeons dans le bon dossier.

3-)  Utilisation de la commande Lynx -dump -nolist

Si l’encodage est égal à « UTF-8 », on va extraire le contenu dans la page web en format text avec lynx.

Lynx est un navigateur web textuel, utilisable depuis le Terminal. Il affiche le texte de la page correspondante.

lynx -dump permet de récupérer le contenu en format text de la page web, sans les balises html ou autres informations. Nous ajoutons -nolist afin d’indiquer à la commande de ne pas suivre les liens potentiellement présents sur le page web.

Ensuite, toutes les pages aspirées avec lynx -dump -nolist seront envoyées dans le dossier « DUMP-TEXT » et le résultat est écrit dans le tableau.

Si l’encodage n’est pas égal à « UTF-8 », on n’affichera rien sous la colonne de « Dump » (la dernière colonne) .

Enfin, on s’affiche rien sur les colonnes suivantes à cause du code différent de 200 (on marque “-” dans les cases vides).

Voici le résultat:

* Une petite conclusion

Pendant cette séance, nous avons appris des éléments de la syntaxe tels que « if . ..then… else… fi » pour faciliter notre traitement du code HTTP et de l’encodage des URLs.

On peut ainsi conclure cette séance avec le diagramme présenté en cours:

*Annexes – variables pertinentes dans le manuel anglais

4 -) Détection et conversion de l’encodage avec egrep et iconv 

Après avoir testé le code HTTP sur les URLs, on peut passer à l’étape suivante. 

Mais nous avons rencontré un nouveau problème avec l’encodage UTF-8. Pour certains sites, le résultat va être TEXT-HTML même si leur encodage est bien en UTF-8. En voici un exemple:

On vérifie le code source de cette page :

On réalise que parfois UTF-8 ne se trouve pas directement après « Content_Type », mais après « charset ». On va donc créer une nouvelle ligne de commande pour détecter l’encodage qui se trouve après « charset ». Comme dans le script précédent, on convertit l’encodage UTF-8 en majuscules, et on supprime les sauts de ligne et les guillemets qui existent potentiellement: 

egrep -oi “charset=\”?[^\”&,)]+\”?” | cut -d”=” -f2 | head -1| tr ‘[a-z]’ ‘[A-Z]’ | tr -d ‘\r’ |  tr -d ‘”‘

On teste cette ligne de commande sur l’une des URLS problématiques, et ça marche:

On crée donc une nouvelle boucle “if” :

Malheureusement, il reste encore des sites dont l’encodage n’est pas en UTF-8 ou dont l’encodage UTF-8 ne se trouve pas juste après « charset », et qu’on ne peut donc pas traiter avec les nouvelles lignes de code.

Maintenant, nous avons besoin de iconv pour reconnaître l’encodage différent de UTF-8 et le convertir en ce dernier.

Avant, nous expliquons ce qu’est inconv:

iconv est un programme de ligne de commande et une interface de programmation d’application normalisée permettant la conversion entre différents codages de caractères

D’abord, on va vérifier si iconv est capable de reconnaître un encodage différent de UTF-8 avec « iconv -l » et « egrep -i » , ainsi que la boucle « if » . Si l’encodage est reconnu, le contenu ne sera pas vide. Par exemple, on veut tester si iconv peut reconnaître GB2312, et c’est bien le cas:

On peut passer à l’étape suivante: on affiche les dump text dans les pages aspirées avec « lynx » et on convertit l’encodage avec ” iconv -f -t [UTF-8] ".

Voici les lignes de script pertinentes : 

5-) Traitement du motif 

Maintenant, on peut commencer le traitement du motif:

D’abord, on va créer une nouvelle variable pour insérer le motif dans le Terminal. Vu que les deux premières variables consistent en les URLs et le tableau final, le motif sera la troisième variable à créer : motif=$3.

Ensuite, on va créer des fichiers qui contiennent le contexte des ces motifs en format txt et les stocker dans le dossier CONTEXTES.

Ici C2 signifie 2 lignes avant et 2 lignes après. 

egrep -i -C2 "$motif" ./DUMP-TEXT/$numerotableau-$compteur.txt > ./CONTEXTES/$numerotableau-$compteur.txt;

6-) Affichage du contexte du motif avec Minigrep

Afin de montrer clairement le contexte du motif, nous avons besoin du programme "minigrep-multilingue". Voici le lien de téléchargement : http://www.tal.univ-paris3.fr/cours/minigrepmultilingue-v2.2-regexp.zip

On ouvre le fichier "parametre-motif.txt" et on insère le motif qu'on veut trouver. On peut chercher le mot "immigration" en chinois par exemple:

On créé ensuite les lignes suivantes:

Après l’exécution du programme perl, le résultat va être enregistré dans « extraction-extraction.html », nous utilisons donc la commande mv pour le déplacer dans le dossier CONTEXTES et le renommer afin de rendre le tableau final plus lisible.

Enfin, on obtient le résultat:

7-) Index Hiérarchique

Nous avons par la suite calculé l'index hiérarchique. Il s'agit de compter le nombre d’occurrences de chaque mot pour chaque URL donnée et les ordonner de façon décroissante.

Le résultat prend la forme suivante:

L'index est établi grâce à la ligne suivante:

egrep -o "\w+" ./DUMP-TEXT/$numerotableau-$compteur.txt | sort | uniq -c | sort -r > ./DUMP-TEXT/index-$numerotableau-$compteur.txt ;

L'expression régulière "\w+" permet d'identifier les mots, car "\w" permet de reconnaître un caractère alphanumérique, en excluant les espaces, tandis que l'opérateur "+" indique que l'expression doit reconnaître au moins un caractère ou plus.

La fonction " | sort | uniq -c | sort -r " permet de compter les occurrences des entités reconnues, ainsi que de les trier.

Les fichiers .txt comprenant les résultats sont placés dans le dossier DUMP TEXT.

8 -) Bigrammes

On passe au calcul des bigrammes. Les bigrammes désignent l’occurrence d'un mot a suivi par un mot b.

Le résultat prend la forme suivante:

Le calcul des bigrammes s'effectue selon les lignes suivantes:

egrep -o "\w+" ./DUMP-TEXT/$numerotableau-$compteur.txt > bi1.txt;
tail -n +2 bi1.txt > bi2.txt ;
paste bi1.txt bi2.txt > bi3.txt ;
cat bi3.txt | sort | uniq -c | sort -r > ./DUMP-TEXT/bigramme-$numerotableau-$compteur.txt ;

Là encore, on utilise l'expression régulière "\w+" pour segmenter le fichier, en identifiant les mots. Les résultats sont inscrits dans le fichier bi1.txt.

La commande tail -n +2 permet de lire le fichier bi1.txt à partir de la deuxième ligne. Il est ensuite recopié dans un nouveau fichier, bi2.txt.

La commande paste b1.txt bi2.txt permet de joindre les deux fichiers horizontalement. Le résultat est placé dans un troisième fichier, bi3.txt.

cat bi3.txt | sort | uniq -c | sort -r permet d'afficher le contenu de bi3.txt grâce à la commande cat, tout en triant les bigrammes par leur nombre d'occurrences grâce à | sort | uniq -c | sort -r.

Les résultats respectifs de chaque URL sont ensuite placés dans le dossier DUMP TEXT.

9-) Segmentation du corpus chinois

En traitant le corpus chinois, je me suis rendu compte que les bigrammes ne s'affichaient pas correctement. Le chinois, étant une langue sinitique et différant donc considérablement des langues indo-européennes, ne présente pas de mots clairement délimités par un espace. Nous avons donc besoin d'un outil supplémentaire pour nous permettre de segmenter les mots. Nous avons utilisé le Stanford Chinese Segmenter.

Voici le lien de téléchargement : https://nlp.stanford.edu/software/segmenter.shtml

Après avoir téléchargé le dossier, on peut lire le fichier .txt intitulé "README-Chinese.txt", qui présente les consignes à suivre afin de segmenter les fichiers en chinois.

Il faut d'abord exécuter cette ligne de commande bash pour activer pour le script:

./stanford-segmenter/segment.sh ctb test.simp.utf8 UTF-8 0

Ensuite, on peut essayer de segmenter le corpus chinois avec la grammaire ci-dessous:

segment.sh [-k] [ctb|pku] <filename><encoding><size>

ctb : Chinese Treebank

pku : Beijing Univ

filname: le fichier à segmenter

Encoding: UTF-8, etc

Size: 0

Voici un exemple de segmentation sur un texte chinois :

bash ./stanford-segmenter/segment.sh -k ctb ./DUMP-TEXT/1-4.txt UTF-8 0

Nous sommes enfin parvenues à segmenter les mots, voici le résultat s'affichant sur le Terminal :

Nous avons donc ajouté les lignes de commandes suivantes dans notre script :

10 -) Problème rencontré : échec pour repérer l'index et le bigramme du corpus chinois

Après avoir résolu le problème précédent, me voilà face à un nouveau problème! Même si les textes sont bien segmentés, l'index et les bigrammes affichent encore de faux résultats... 🤯

Après avoir consulté M.Fleury, je me suis rendu compte que c'est mon système qui signale un problème et que je ne suis pas la seule à rencontrer un tel obstacle avec un corpus chinois. M.Fleury m'a conseillé d'exécuter mon script testé sur la machine virtuelle, sur une machine possédant un véritable système d'exploitation Ubuntu. Malgré mes tentatives de lancer le script sur ma machine virtuelle, je suis toujours bloquée à cette étape-là.

Donc je vais essayer de me débrouiller plus tard...

Enfin, M. Fleury nous a aidé de trouver les bons résultats sur l'index et le bigramme du corpus chinois, merci pour son soutien ! ^^

11- ) Spécificités de l'arabe

Malgré une segmentation correcte en arabe, cette langue possède des spécificités linguistiques qui nécessitent une expression régulière plus élaborée, en tant que motif.

L'expression "l'immigration" s'écrit :

Elle est donc traitée comme un seul mot. Tandis que le mot " immigration " sans déterminant défini, s'écrit:

Cette forme apparaît par exemple après un déterminant indéfini. En plus d'être traitée comme un mot différent, la lettre ح se transforme en un caractère différent selon qu'elle soit précédée par une lettre ou un espace.

Dans le fichier du paramètrage du motif, l'expression régulière serait définie comme:

Après une première tentative de construction d'un tableau avec seul l'équivalent de " l'immigration " comme motif, je me suis rendu compte que certaines URLs affichaient 0 occurrences du motif recherché. Après avoir inclu les deux formes dans l'expression régulière, la fréquence du motif a augmenté de façon générale, et le nombre d'URLs affichant 0 occurrences a été considérablement réduit.

Il subsiste toutefois 4 URLs où le motif n'a pas été identifié. Le motif apparaissant bel et bien dans ces URLs, après vérification, je ne parviens pas à régler le problème pour le moment.

12-) Script final

Voici le script final:

通过 WordPress.com 设计一个这样的站点
从这里开始