Lors de notre
dernier billet, nous avons cherché une manière d’obtenir les encodages de
toutes les pages et de convertir en UTF-8 celles qui ne l’étaient pas déjà.
Nous avons vu en cours une
manière plus simple et efficace que celle que nous avions trouvée :
egrep -io "charset=\"?[^\",]+\"?"
./PAGES-ASPIREES/$numerotableau-$compteur.html | cut -f2 -d"=" | tr
-d '("|\\|>)' | sed "s/'//g" | tr '[a-z]' '[A-Z]'
L’expression régulière charset=\"?[^\",]+\"? permet
de trouver l’encodage, puis nous nous débarrassons de « charset= »
grâce au cut -f2 -d"=",
ainsi que des éventuels guillemets (simples et doubles) encadrant l’encodage et
autre signes (barres obliques et balises) avec tr -d '("|\\|>)' | sed "s/'//g" |, et enfin
nous passons le résultat en majuscules avec tr '[a-z]' '[A-Z]'. Nous avons ajouté à cette commande les
instructions |sort|uniq après avoir
constaté que le charset était renseigné à deux reprises sur certains sites.
Nous avons
également ajouté les dernières colonnes du tableau (cinq colonnes).
Tout d’abord,
une colonne avec un lien vers un fichier texte montrant le motif cherché en
contexte. Nous avons pour cela ajouté au début du programme une troisième
variable à déclarer lors du lancement du script. La variable 3, que l’on
renomme motif, contient le motif
entre guillemets : en ce qui nous concerne, le mot « geek ».
Voici la commande pour créer ce fichier :
egrep -i
-C2 $motif "./DUMP-TEXT/$numerotableau-$compteur.txt" >
./CONTEXTES/$numerotableau-$compteur.txt
La fonction -C de la commande egrep permet d’afficher la ligne contenant le
motif accompagné des n lignes précédentes et des n lignes suivantes (ici 2).
Nous ajoutons -i (pour case insensitive) afin d’avoir également
les résultats pour « GEEK » en majuscules. Et nous enregistrons le
fichier dans le répertoire « CONTEXTES ».
La colonne
suivante affiche un lien vers un fichier html contenant chaque ligne où
apparaît le motif, accompagnée, en bleu et italique, de la ligne précédente et
de la ligne suivante. Les numéros de lignes sont précisés en bleu et le motif
apparaît en rouge. Cette présentation plus visuelle du motif en contexte est
permise par le programme Perl minigrep
que nous avons téléchargé. Il s’utilise comme suit :
perl ./minigrep/minigrepmultilingue.pl
"UTF-8" ./DUMP-TEXT/$numerotableau-$compteur.txt
minigrep/parametre-motif.txt;
mv
resultat-extraction.html ./CONTEXTES/$numerotableau-$compteur.html;
Nous appelons le programme avec
la commande perl puis nous donnons
trois arguments dans cet ordre : encodage, fichier dans lequel le motif
est recherché, fichier dans lequel nous avons écrit le motif à chercher. Le
fichier de résultat est généré automatiquement avec le nom
« resultat-extraction.html ». Nous le renommons pour qu’il ne soit
pas écrasé à chaque tour de boucle et le déplaçons dans le répertoire
« CONTEXTES ».
La
colonne suivante contient un lien vers un index : l’ensemble des mots et
le nombre d’occurrences de chacun est présenté dans un fichier texte. Pour
créer ce fichier, nous écrivons la commande suivante :
egrep -o
"\w+" ./DUMP-TEXT/$numerotableau-$compteur.txt | sort | uniq -c |
sort -gr > ./DUMP-TEXT/index-$numerotableau-$compteur.txt
L’expression régulière \w+ permet de lister tous les mots du
fichier contenant le texte de la page web. Nous trions ces mots dans l’ordre
alphabétique avec sort,
nous n’affichons qu’une fois chaque mot, en ajoutant le nombre d’occurrences
devant avec uniq -c et nous classons
les résultats dans l’ordre décroissant d’occurrences avec sort -gr.
L’avant-dernière
colonne contient un lien vers un fichier texte listant les bigrammes,
c’est-à-dire les couples de mots qui se suivent. Le fichier est généré
ainsi :
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 -gr >
./DUMP-TEXT/bigrams-$numerotableau-$compteur.txt
Nous créons un premier fichier
temporaire avec la liste des mots, grâce à la regex vue plus haut. Nous créons
ensuite un second fichier temporaire à partir du premier, dont nous retranchons
la première ligne (donc le premier mot) grâce à la commande tail -n +2. Nous concaténons les lignes de
ces deux fichiers grâce à la commande paste dans un troisième fichier qui contient donc les bigrammes. Nous
retravaillons ce fichier en triant les résultats comme nous l’avons fait pour
l’index.
La
dernière colonne affiche le nombre d’occurrences du motif. La commande est la
suivante :
nbmotif=$(egrep -coi $motif ./DUMP-TEXT/$numerotableau-$compteur.txt)
Nous créons une variable nbmotif qui contient le nombre
d’occurrence (egrep -co) de
notre motif.
L’ensemble des
étapes permettant de remplir les colonnes du tableau est un long processus qui
doit être répété à plusieurs reprises : deux fois pour les fichiers dont
nous avons trouvé l’encodage dans le protocole http (pour les fichiers déjà en
UTF-8 puis pour les autres après conversion), puis deux fois pour les fichiers
dont nous avons trouvé l’encodage dans le code source (idem).
Afin d’alléger un peu le
programme, nous avons donc souhaité créer une fonction. Voici comment créer une
fonction en bash :
nom_de_la_fonction()
{
Instructions
}
Pour l’appeler, nous écrivons
tout simplement le nom de la fonction ainsi que ses éventuels paramètres (sans
parenthèses).
Nous avons rencontré un problème
lors de la création de la fonction. En effet, la dernière étape de la fonction
consiste à écrire dans le tableau. Ce tableau est désigné par son chemin
relatif, dans lequel notre répertoire « TABLEAU » est désigné à
l’aide d’une variable $2 qui sera passée en paramètre lors de l’appel du
script. Cependant si nous écrivons une variable à l’intérieur d’une fonction,
un paramètre est attendu pour la fonction elle-même. C’est pourquoi j’ai
renommé « $2/tableau.html » en « $1/tableau.html » et passé
$2 en paramètre lors de l’appel de la fonction.
Voici notre fonction :
J’appelle cette fonction avec la
commande : constit_tableau $2;
Notre tableau est terminé !
Nous n’avons plus qu’à analyser les
données que le script nous a permis de recueillir. Cela fera l’objet des
prochains billets !
Très bonne idée que de mettre en place une fonction...
RépondreSupprimer