Overblog All blogs Top blogs Jobs, Education & Studies
Edit post Follow this blog Administration + Create my blog
MENU
L'Américanisation

Master 1 Plurital 2012

Advertising

Egrep et les Expression régulières:

Durant cette séance, nous sommes revenues sur les problèmes d'encodage et nous avons vu le filtrage de motifs dans un fichier. Ceci va se faire à travers la commande "egrep" et avec le programme "minigrep" multilingue pour obtenir directement des contextes avec les mots recherchés en html.

 

Détection d'encodage niveau 2:

Précédemment nous avons vu la détection de l’encodage des pages aspirées avec la commande "file –i" qui permet d’identifier l’encodage d’un fichier avec un certain degré de précision. Pourtant, nous ne pouvons pas nous fier 100% à "file" qui ne réussit pas toujours à détecter l’encodage. Nous avons vu cela avec certains de nos fichiers grecs, dont l’encodage a été détecté comme "unknown-8-bit". Jusqu’à maintenant nous avons dit qu'il faudrait abandonner ces fichiers-là, en nous disant qu’il n’y a rien à faire.

Advertising
la commande "file -i" ne trouve pas le charset.  Pourtant il existe dans le fichier...
la commande "file -i" ne trouve pas le charset.  Pourtant il existe dans le fichier...

la commande "file -i" ne trouve pas le charset. Pourtant il existe dans le fichier...

Cependant… il y a une autre détection d’encodage possible dans le cas où "file" ne nous trouve pas d’encodage. La solution serait aller directement voir l'encodage dans la page aspirée. Nous appellerons cette étape "détection d’encodage niveau 2". Encore – une certaine précaution – le fait que la balise meta charset précise que le fichier est écrit dans un certain encodage ne veut pas dire que c’est vrai, et pour cela, malheureusement, nous ne pouvons rien faire. Nous sommes obligées de croire que l’auteur du fichier a bien fait son travail et qu’il existe une cohérence entre l’encodage du fichier et l’étiquette meta charset. Un autre problème pourrait être la présence de frames dans la page, et potentiellement l’utilisation d’encodages différents à l’intérieur d’une même page. Si nous arrivons à détecter l’encodage dans le fichier lui-même, nous pouvons procéder comme avant(faire le traitement), en vérifiant que l’encodage soit reconnu par "iconv" et en transcodant le fichier en utf-8 via "iconv".

Nous sommes quand-même obligées à abandonner les fichiers dont "file" n’a pas reconnu l’encodage et qui ne possèdent pas de balise meta charset, et ceux dont éventuellement l’encodage extrait n’est pas reconnu par "iconv". La situation est pourtant mieux et nous pouvons détecter plus d’encodages qu’avant !

 

Pour extraire les informations contenues dans la balise meta charset, nous allons utiliser "egrep" pour filtrer le contenu du fichier. Ceci est possible grâce au fait qu’un fichier html est structuré d’une façon particulière, avec des balises standardisées, notamment une balise meta charset, reservée pour signaler l'encodage du fichier.

Il sera possible d’extraire le contenu de cette balise en visant les propriétés qui distinguent cette balise du reste du contenu du fichier.

 

Quand l’encodage du fichier est bien écrit, il prend deux formes principales :

En HTML 4 :

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 

et en HTML 5 :

<meta charset="UTF-8">

 

 

Il pourrait y avoir des variations selon le choix de l’auteur du fichier. Nous pouvons nous attendre à des espaces en plus, la présence ou absence de guillemets, des majuscules, des minuscules, des sauts de lignes (qui sont plus problématique) etc. Ces variations ne posent pas de problèmes pour le navigateur !

Pour nous, cela veut dire qu’il ne suffit pas d’extraire la même partie de la balise chaque fois, comme nous avons fait avec "file –i" et cut (pour la détection d’encodage niveau 1). La structure de la balise ne sera pas forcément la même chaque fois…

Heuresement, "egrep" est équipé d’une très bonne propriété : la capacité de chercher un motif basé sur une expression régulière – c’est une propriété très puissante qui permet de détecter la balise selon une description générique, et non pas spécifique.

Avant de continuer avec l’extraction de l’encodage dans le fichier, une petite récapitulation sur les expressions régulières.

 

Les Expression régulières:

 

Une expression régulière est une formule qui sert à définir des motifs génériques qui décrivent des chaines de caractères. Elle sert à détecter le maximum de chaines de caractères qui correspondent au motif utilisé.

Pour écrire une expression régulière, nous utiliserons des operateurs. En effet, les expressions régulières sont disponibles dans beaucoup d’outils, mais les operateurs varient selon l’outil.

·         Operateurs de quantification :

? indique que le caractère qui le précède dans le motif a zéro ou une occurrence

* Indique que le caractère qui le précède dans le motif a zéro ou plusieurs occurrences (ex : l*ng  -> lng, long, loong…)

+indique que le caractère qui le précède dans le motif a une ou plusieurs occurrences (ex : l+ng  -> long, loong, looong…)

 

·         Operateurs de classe de caracteres :

[] décrit un caractère parmi ce qu’on va mettre à l’intérieur de l’ensemble (ex : [aZAz] ->pour chercher un caractère parmi ces lettres

[^] pour chercher le complémentaire d’un ensemble

-définit les intervalles de caractères

| marque l’alternative (ex :clé | clef)

^ indique le début d’une chaine (ex : avec « egrep » elle indique le début de la ligne)

$ indique la fin d’une chaine (ex : avec « egrep » elle indique la fin de la ligne)

\ restitue le statut de caractère (enlève la fonction operateur)

Advertising

 

Retour à la détection d'encodage niveau 2:

 

Ainsi nous pouvons extraire le charset de la page aspirée avec la commande "egrep"  en utilisant un motif précis.  La commande serait:

egrep [-options] “motif” ficher-page-aspirée.html

 

Nous allons donner comme motif une expression régulière, en essayant d’être précis dans notre description au cas où la structure de la balise est un peu différente de nos attentes. Nous devons faire attention particulièrement aux guillemets et aux espaces.  En effet, "egrep" a une option qui permet de chercher un motif sans tenir compte de la casse, ainsi nous n’avons pas besoin de tenir compte de cela dans le motif utilisé.

 

Pour le choix de l’expression régulière :

Nous examinons une expression régulière possible :

egrep –i "<meta.+charset" fichier.html | egrep –i –o "charset *=[^\"]+"

Ce motif isole d’abord les lignes qui contiennent la balise meta charset.  Cette balise aura la forme <meta suivi d’au moins un symbole (peut-être plus) suivi de charset.  Ce premier filtrage est passé par un tube vers un deuxième filtrage.  Ce deuxième "egrep" filtre le texte produit du premier, en isolant la partie qui correspond à charset, suivi de n’importe quel nombre d’space, suivi d’un signe égal, suivi d’un certain nombre (au moins un) de symboles qui ne sont pas les guillemets.   

 

 

 

Pour une balise comme :

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

 

seulement la partie  charset=UTF-8 sera prise en compte (juste avant la première occurrence d’un guillemet.)

 

Il suffit après de passer le résultat par un deuxième pipe avec un cut-d= -f2 pour isoler l’encodage.

 

Il y a un problème, par contre, s’il faut permettre des variations telles que :

<meta … charset=utf-8>

ou

<meta charset= "utf-8"/>

 

 

Nous ne pouvons pas être sûres que l’auteur ait écrit des guillemets dans sa déclaration d’encodage.  Dans ce cas-là, il risque d’y avoir plus de symboles que prévus qui sont isolés par le filtrage par "egrep".  L’encodage résultant n’aura pas d’équivalent dans les encodages reconnus par "iconv", et nous serons obligés d’abandonner ces fichiers-là. 

Dans le deuxième exemple, les guillemets entourent l’encodage (ce qui est standard pour les fichiers écrits en HTML 5).  Si nous utilisons notre motif dans cette balise, la partie isolée ne contiendra pas l’encodage entre guillemets, puisque le motif spécifie que les symboles à isolér sont des symboles autres que les guillemets.

 

Ce motif réussit peut-être à isoler l’encodage en HTML 4 mais risque de trouver des problèmes avec des fichiers en HTML 5.

 

Egrep et les Expression régulières:
Egrep et les Expression régulières:

Pouvons-nous trouver un moyen de décrire génériquement les deux structures de représentation ?

 

En recommençant dès le début, nous pouvons essayer :

<meta.+charset *=.*>

Ceci est censé isoler la balise qui contient la balise ouvrante, le mot meta, suivi d’un certain nombre de symboles (au moins un), suivi de charset, suivi d’un certain nombre d’espaces, suivi d’un certain nombre de symboles, suivi de la balise fermante.  Selon les cas, ceci sélectionne bien la balise voulu.  Mais nous voyons qu’il peut y avoir un problème avec l’étoile, qui est gourmand et risque d’aller au delà de la première occurrence de la balise fermante et d’isoler plus de texte que prévu.  Pour empêcher la gourmandise de l’étoile, nous mettons le point d’interrogation juste après.  Nous voyons dans l’exemple que ceci isole la balise voulue.

 

 

Egrep et les Expression régulières:
Advertising

Maintenant il faudrait isoler la partie charset= et l’encodage qui suit. 

Nous ne pouvons pas directement faire un "cut" sur le délimiteur = parce que la balise meta peut contenir d’autres signes égaux qui ne sont pas suivi d’un encodage.  Nous pouvons essayer d'isoler directement tout ce qui suit charset= en utilisant "charset=" comme délimiteur.  Cependant, la commande "cut" prend uniquement un caractère comme délimiteur et non pas une chaîne de caractères.  Il n’est pas possible de faire -d"charset=".

Une autre commande "awk" permet aussi de manipuler du texte et prend quelques options qui ressemblent à "cut" et peut prendre des expressions régulières.  Il permet aussi de spécifier une chaîne de caractères comme délimiteur de champ.

 

La syntaxe pourrait être de la forme suivante :

 

 awk 'BEGIN{FS="charset=";}{print $2}' | awk 'BEGIN{FS="[/>]";}{print $1}')

 

Cela veut dire que le délimiteur (field separator) est défini comme "charset=" et que le résultat sera le deuxième champ (tout ce qui suit le délimteur).

Nous aurons alors un résultat comme :

 

UTF-8" /> ou UTF-8"> ou UTF-8" > ou UTF-8 > ou "UTF-8" /> ou même ISO-8859-1" http-equiv="Content-Type"/>

 

Nous ne pouvons pas forcément compter sur la présence de guillemets pour délimiter la fin de l’encodage que nous voulons extraire.  Mais nous pouvons utiliser une expression régulière pour définir les contextes de la délimitation de la fin de l’encodage.  Cette deuxième commande "awk" prend en entrée le résultat du premier filtrage.  Le délimiteur est / ou >  selon le premier de ces deux symboles à apparaître.

Ceci nous donne un résultat comme :

 

UTF-8"  ou UTF-8" ou UTF-8"  ou UTF-8  ou "UTF-8"  ou même ISO-8859-1" http-equiv="Content-Type"

 

Nous avons des encodages avec ou sans guillemets et un encodage suivi d'un texte.  Pour standardiser le format de ces encodages, nous pouvons isoler tout ce qui n’est pas un guillemet ou un espace en passant le résultat par un tube vers :

egrep –io "[^_\"]"

 

Les résultats semblent nous donner des encodages extraits de plusieures sortes de balise meta charset et nous n'avons plus de problèmes d'encodages inconnus quand nous l'intégrons dans le script.  Il reste toujours des améliorations à faire au niveau de l'expression régulière, qui pourrait recontrer des problèmes lorsqu'il y a, par exemple, une espace entre le mot charset et le signe égal, qu'on utilise pour délimiter les champs. 

 

Egrep et les Expression régulières:
Egrep et les Expression régulières:

Recherche des Contextes

 

Nous allons aussi utiliser "egrep" mais en ayant comme motif le mot que nous recherchons dans nos pages. Il nous faudra donc une regex qui réunisse les mots français, anglais et grec pour “américanisation”, par exemple: “américanisation”, “americanisation”, “americanization” et “αμερικανοποίηση”. Pour ce dernier, il faudra tenir compte aussi aux variations morphologiques du mots selon les variations de cas pour être capable de contempler des formes comme “αμερικανοποίησης”, “αμερικανοποιήσεως”, “αμερικανοποιήσεων”.  (N.B. Il y aura un article sur le choix du motif utilisé)

 

Minigrep:

De plus, nous essayerons le programme minigrep multilingue, qui va produire directement du html. En effet, le programme minigrep permet d'extraire le mot choisi des pages web récupérées avec leurs contextes. Toutefois, avant de l’utiliser, il faut télécharger le programme minigrep et créer un fichier txt qui contient le motif recherché.

 

-Téléchargement du programme minigrep:

 

Apres le téléchargement et la décompression du programme minigrep, il faut se placé dans le répertoire « minigrepmultilingue » pour décompresser le module « Unicode-String-2.09 » avec la commande "tar xzf Unicode-String-2.09 tar gz"

Egrep et les Expression régulières:

Ensuite, pour la compilation, il faut aller dans le répertoire du module « Unicode-String-2.09 » et lancer le script "Makefile.PL" puis lancer la commande "make"

Egrep et les Expression régulières:

enfin la commande "make test"

Egrep et les Expression régulières:

Pour l’installation, il suffit de taper la commande « make install ».

Parfois nous avons besoin de taper "sudo make install" et d'entrer notre mot de passe pour des questions de permissions.

Egrep et les Expression régulières:

Il est à noter que le programme minigrep génère automatiquement un dossier de résultat. Ainsi pour lancer ce programme nous utilisons la commande suivante :

perl ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/minigrepmultilingue.pl "UTF-8" ./DUMP-TEXT/$k-utf-8.txt ./PROGRAMMES/minigrepmultilingue-v2.2-regexp/motif-regexp.txt

suivi de la commande :

mv resultat-extraction.html ./CONTEXTES/$k-utf-8.html

pour pouvoir accéder aux résultats générés et les stocker dans le tableau

Share this post
Repost0
To be informed of the latest articles, subscribe:
Comment on this post