Outil 3 : Extraction de patrons


Présentation

1. Tâche

Nous sommes maintenant en posséssion de deux fichiers un au format TXT et un au format XML. Ils contiennent nos titres et nos descriptions taggués respectivement par Treetagger et Talismane. Pour chacun des fichiers, l'objectif est maintenant d'établir une méthode nous permettant d'extraire des patrons morphosyntaxiques. Par exemple, nous voulons pouvoir extraire tous les syntagmes qui respectent le patron : NomPropre + Adjectif. Nous présentons ici plusieurs méthodes pour procéder avec différents fromats. La première utilisera le langage Python sur le fichier TXT, la seconde utilisera le langage Xquery sur le fichier XML. Et la troisième utilisera une feuille de style XSLT sur le fichier XML. A noter qu'il existe autant de méthode que de langage de programmation, nous proposerons dans la dernière partie deux équivalents dans d'autres langages.


2. Données traitées

Ci-dessous un aperçu du contenu de nos deux fichiers. A gauche le XML, à droite le TXT


3. Outils utilisés

Méthode 1 : Python sur le TXT

Vous avez compris notre adoration pour le langage Python. C'est encore ce dernier que nous utiliserons ici. Et comme on ne change pas les bonnes habitudes, nous travaillerons toujours avec notre éditeur favori Jupyter.

Méthode 2 : Xquery sur le XML

Le code Xquery sera écrit sur BaseX, pratique et facile d'utilisation.

Méthode 3 : Xslt sur le XML

La feuille XSLT sera écrite sur le logiciel Oxygen


Méthodes

1. Méthode Python

Comme présenté plus haut nous traitons ici le fichier TXT avec le langage python. Puisque nous adorons coder nous présentons deux versions. La principale différence se situe au niveau des itérations. A noter qu'il n'y a pas de différence de performance notable. Vous remarquerez également que les deux programmes ci-dessous proposent deux types de résultats : l'un compté et trié, l'autre non trié préparé pour la BAO4.

Pour accéder à l'explication complète du code veuillez cliquer sur "accéder à l'explication".

format voir dans le navigateur explication détaillée télécharger
Python voir version 1 accéder à l'explication
Python voir version 2 accéder à l'explication

2. Méthode Xquery

Nous passons maintenant à la seconde méthode : l'extraction par Xquery sur le XML. Nous avons choisi 4 patrons :

  • Nom commun + Adjectif
  • Adjectif + Nom commun
  • Adjectif + Nom commun + Préposition + Nom commun
  • Nom commun + Préposition + Nom commun + Adjectif
Nous présentons ci-dessous les requêtes utilisées pour les patrons 1 et 3. Pour les patrons 2 et 4, il suffira de modifier la position de l'adjectif.

Requête Xquery pour le patron "nom commun + adjectif" :

for $n in //element/data[@type='type']
let $textn := $n/following-sibling::data[@type='string']/text()
let $a := $n/parent::element/following-sibling::element[1]/data[@type='type']
return if($n/text()='NOM' and $a/text()='ADJ')
then string-join(($n/following-sibling::data[@type='string']/text(),
$a/following-sibling::data[@type='string']/text()), ' ')
else ()

Requête Xquery pour le patron "adjectif + nom commun + préposition + nom commun" :

for $n in //element/data[@type='type']
let $textn := $n/following-sibling::data[@type='string']/text()
let $a := $n/parent::element/following-sibling::element[1]/data[@type='type']
let $texta := $a/following-sibling::data[@type='string']/text()
let $b := $a/parent::element/following-sibling::element[1]/data[@type='type']
let $textb := $b/following-sibling::data[@type='string']/text()
let $c := $b/parent::element/following-sibling::element[1]/data[@type='type']
let $textc := $c/following-sibling::data[@type='string']/text()
return if($n/text()='ADJ' and $a/text()='NOM' and $b/text()='PRP' and $c/text()='NOM')
then string-join(($textn, $texta, $textb, $textc), ' ')
else ()

Accédez également au fichier de requêtes ci-dessous

voir dans le navigateur télécharger
BAO3_xquery.txt

3. Méthode XSLT

Nous proposons également une feuille de style XSLT pour chacun des 4 patrons. Vous pouvez accéder aux fichiers dans le tableau suivant.

patron voir dans le navigateur télécharger
ADJ NOM adj_nom.xsl
NOM ADJ nom_adj.xsl
ADJ NOM PRP NOM adj_nom_prp_nom.xsl
NOM PRP NOM ADJ nom_prp_nom_adj.xsl

Résultats

Voici les résultats pour les 4 patrons sur le fichier complet de toutes les rubriques.

1. Méthode Python

patron résultat trié télécharger résultat non trié télécharger
ADJ NC adj_nc_trie.txt adj_nc.txt
NC ADJ nc_adj_trie.txt nc_adj.txt
ADJ NC P NC adj_nc_p_nc_trie.txt adj_nc_p_nc.txt
NC P NC ADJ nc_p_nc_adj_trie.txt nc_p_nc_adj.txt

2. Méthode Xquery

patron voir dans le navigateur télécharger
ADJ NOM adj_nom.txt
NOM ADJ nom_adj.txt
ADJ NOM PRP NOM adj_nom_prp_nom.txt
NOM PRP NOM ADJ nom_prp_nom_adj.txt

3. Méthode XSLT

Pour éviter des problèmes de chargement à cause de la taille du XML complet, nous proposons une visualisation de résultat sur un échantillon de la rubrique "politique".

patron voir dans le navigateur
ADJ NOM adj_nom.xml
NOM ADJ nom_adj.xml
ADJ NOM PRP NOM adj_nom_prp_nom.tml
NOM PRP NOM ADJ nom_prp_nom_adj.xml

Alternatives

Cette tâche a également été l'occasion d'explorer les atouts d'autres langages. Voici deux programmes équivalents en Java et JavaScript parfaitement fonctionnels. Nous avons choisis ces deux langages pour leur fonctionnement de traitement interne qui sont complétement différents. Ils ont été réalisés sur Visual Code Studio

Remarques :

  • Java : Le plus difficile à réaliser pour nous. Sachant que nous sommes bien trop inéxpérimentés dans ce langage, le programme peut certainement être amélioré. Pourtant il s'agit du programme le plus performant sur cette tâche. Ce qui n'est pas très surprenant quand on connait le fonctionnement du langage (types de variable détailés, compilation préalable, etc.)
  • Node.js : Soyons clair, nous nous intéressons à JavaScript que pour Node.js avec lequel il a gagné un potentiel intéressant. Il est relativement rapide et son code est d'une facilité comparable à celle de Python. Son fonctionnement asynchrone en fait un outil potentiellement intéressant pour certaines tâches. Nous l'avons beaucoup apprécié, malheureusement son grand manque de module et sa popularité en NLP en fait un candidat bien moins intéressant que Python. Nous le présentons donc à titre expérimental.
langage voir télécharger
Java BAO3.java
Node.js BAO3.js

Bonus

Nous avons également créé en Python une petite application très simple. ( Avec Tkinter pour l'interface et PyInstaller pour l'exécutable )
Vous pouvez la télécharger ci-dessous sous forme de dossier ou d'exécutable. L'application intègre aussi un onglet pour l'étiquettage morphosyntaxique. Cette fonctionnalité utilise Treetagger et nécessite donc son installation sur votre ordinateur.

Outil suivant : graphe >>>