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
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.
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.
Archive | Exécutable |
---|---|
BAO_interface.zip | BAO_interface.exe |