BAO 3

Présentation

La boite à outil 3 consistait à extraire des patrons syntaxiques à partir de nos données, en utilisant trois solutions. Une feuille de style XSL et deux scripts perl. Le premier script extrait les patrons à partir des données txt étiquetées avec Cordial, et le deuxième exploite la structure XML des données étiquetées avec Tree-tagger.

Enfin, nous avons choisi de nous concentrer sur l'extraction des verbes transitifs et intransitifs, avec les motifs :

Verbe Prep
Verbe Det Nom

Les feuilles de style

Nous avons d'abord récupéré une feuille de style XSL sur le site du cours. À partir de cette feuille, nous avons créé deux feuilles de style, la première pour extraire les verbes intransitifs, la deuxième pour extraire les verbes transitifs. Afin d'extraire les verbes intransitifs, par exemple, pour chaque élément, nous regardons si un de ses items contient « VER », et s'il est suivi d'un deuxième élément dont un item contient « PRP ». Si ces deux conditions se vérifient, nous imprimons le troisième élément de l'item, celui qui correspond au token. Puis pour imprimer le deuxième élément du patron, nous posons la condition inverse : nous imprimons le token de l'élément qui contient un item « PRP » et qui est précédé par un élément qui contient un item « VER ».

Nous avons appliqué nos deux feuilles de style aux fichiers extraits des rubriques « À la Une » et « International ». Voici le résultat :

Télécharger les fichiers de l'« International », télécharger les fichiers de « À la Une ».

Lors de ce traitement, nous nous sommes aperçues qu'un caractère présent dans nos fichiers résutats de la BAO2 posait problème : &. En effet, ce caractère introduit toujours une entitée XML. Il empêche donc la feuille de style de s'appliquer, et crée une erreur de parser XML. Nous avons donc choisi de remplacer ce caractère systématiquement par "et" dans toutes nos sorties, en utilisant la fonction chercher-remplacer de TextWrangler. Nous aurions dû intégrer le remplacement de ce caractère à notre script, en ajoutant les lignes suivantes après l'appel au module XML::entities::decode (l 136 et l 138) :

$description=~ s/&/et/g;
$titre=~s/&/et/g;

Mais comme l'exécution du script prenait trop de temps pour pouvoir la relancer avec cette dernière modification, nous avons préféré remplacer ce caractère manuellement.

À noter que nous aurions pu et peut-être même dû remplacer le caractère & par son code &

Le script « brut »

Ce script extrait les patrons à partir de données brutes, en utilisant des expressions régulières pour définir le motif d'extraction, et en jonglant entre trois listes, contenant chacune tous les lemmes, tous les tokens ou tous les POS du fichier. Le tableau des POS est d'abord réuni sur une ligne, chaque item étant séparé par un blanc. Le contenu du fichier motif est ensuite projeté sur cette chaîne pour trouver des correspondances. Le motif d'entrée est en fait une expression régulière. Quand une correspondance est trouvée, on compte le nombre de blancs au sein du terme à extraire, et dans tout le texte qui le précède. Le nombre de blanc est ensuite utilisé pour se repérer dans la liste de tokens, et identifier les tokens qui correspondent au motif retrouvé dans la chaîne de POS.

À l'exécution du programme, on a toujours un message d'erreur sur le terminal :

"Use of uninitialized value $lemma[4] in join or string at PROGRAMMES/BAO3_Daube.pl line 36, <TEXT> line 30309. et Use of uninitialized value $pos[4] in join or string at PROGRAMMES/BAO3_Daube.pl line 37, <TEXT> line 30309"

Ce message correspond à l'étiquetage de certains caractères comme les guillemets. Voici ce que l'on a sur notre input :

Ècologique Ècologique ADJSIG
"
Ètait Ítre VINDI3S

Comme cordial n'étiquette pas les guillemets, lorsqu'on découpe la ligne pour répartir token, lemme et POS dans leurs tableau respectifs, on n'affecte rien dans les tableau lemme et POS. On se retrouve avec une "case vide". C'est à cette case vide que correspond le message "use of uninitialized value". Nous pourrions régler cette erreur en supprimant les lignes mal étiquetées de notre fichier d'input avant de lancer le programme, ou encore en rajoutant un test pour ignorer ces lignes. Mais par manque de temps, et comme ce détail n'empêche pas la bonne exécution du programme et la bonne extraction de nos patterns, nous laissons de côté ce problème.

Pour conclure, ce programme a le double avantage de traiter très rapidement même nos plus gros fichiers, et de ne pas nécessiter de préparation particulière du fichier d'entrée, en dehors de l'étiquetage. Ce n'est pas le cas du programme suivant.

Télécharger le script et les motifs, télécharger les fichiers de sortie.

Le script version XML::XPATH

Ce script fait appel à un module perl. Dans un premier appel à une sous-routine, le programme établit le chemin Xpath qui va nous permettre de trouver le motif recherché. Ce chemin établi, il sera employé dans la sous-routine d'extraction de motif, en premier par la méthode findnodes. Cette méthode nous permet de nous positionner dans le noeud à traiter. Ensuite, la fonction find nous permet d'atteindre le noeud data dont le type est string. On récupère ensuite la valeur de ce neud avec les fonctions get_nodes et string_values. La dernière permet de transformer cette valeur en une chaîne, qui est imprimée dans le fichier de sortie. La même opération est ensuite répétée dans une boucle pour extraire le reste du motif.

Le module XML::PATH permet d'explorer efficacement les fichier XML pour en extraire les données souhaitées. Mais son exécution est très longue et sa mise en place un peu laborieuse au départ. Le premier script est tout aussi efficace que celui-ci, mais leur comparaison s'arrête au niveau des données d'entrée. En effet, un script nous permet de traiter des données brutes, l'autre des données structurées en XML. Leurs emplois sont donc complètement différents. Il serait intéressant de comparer le résultat des extractions des deux programmes, la BAO4 nous en donnera l'occasion.

Télécharger le script et les motifs, télécharger les fichiers de sortie.

Extraire nos patrons syntaxiques sur toutes nos données, sans perdre de temps

Comme nous l'avons précisé plus haut, l'exécution du script perl version XML::XPATH est plutôt longue. Il n'était donc pas envisageable de lancer ce script sur toutes les rubriques une à une. Nous avons donc décidé de rédiger un petit script bash, qui, à l'aide de deux boucles lancerait tour à tour les deux scripts perl sur les deux fichiers. Le voici :

Script de lancement