Langage DPath

Il est possible d'interroger les corpus traités par FRMG à l'aide du langage DPath, décrit ci-dessous.

Inspiré par le langage de requête XPath pour XML, le langage DPath permet d'exprimer des requêtes pour le schema natif FRMG sous son format DepXML. Il est implanté en Perl mais possède sa propre syntaxe pour plus de compacité. Le langage DPath s'appuie sur une représentation orientée objet des noeuds (DepXML::Node) et arcs (DepXML::Edge), et dans une moindre mesure des clusters (DepXML::Cluster). Les constituants et hypertags ne sont pas encore accessibles. Les primitives de base du langage sont des méthodes s'appliquant à ses objets. On distingue deux familles de méthodes:

  • la première famille permet de tester une propriété sur un objet. La table 1 illustre quelques une de ces propriétés. Une large partie des méthodes sont automatiquement construites à partir des labels et catégories syntaxiques du tagset de FRMG
  • la seconde famille permet de naviguer d'un objet à un autre. La table 2 liste les 4 déplacements de base.
méthode type d'objet propriété
Table 1 - Quelques méthodes de propriété dans DPath
is_adj arc test si l'arc est un arc d'adjonction
is_subst arc test si l'arc est un arc de substitution
is_subject arc test si l'arc est étiqueté subject
is_v noeud test si le noeud est verbal
is_active noeud test si le noeud verbal est à la voie active
is_root noeud test si le noeud est racine de la phrase
méthode type d'objet action
Table 2 - Les quatre méthodes de navigation de base dans DPath
in noeud accède à l'arc entrant du noeud
out noeud accède aux arcs sortant du noeud
source arc accède au noeud source de l'arc
target arc accède au noeud cible de l'arc

Certaines méthodes sont en fait implicites, comme par exemple cat_in_v_aux pour indiquer que la catégorie d'un noeud est soit v, soit aux, ou label_in_subject_impsubj pour indiquer que le label d'un arc est soit subject, soit impsubj.

Il est bien sûr possible de définir ses propres méthodes sur les noeuds et les arcs pour les utiliser dans DPath, en respectant la convention que les méthodes de propriétés doivent commencer par is_ ou has_. Et il est tout à fait possible d'utiliser une requête DPath dans la définition d'une telle méthode.

Une succession de propriétés dénote une conjonction, tandis qu'une succession de déplacements dénote un chemin dans la structure de dépendance.

Il est à noter que les expressions DPath (comme XPath) travaillent sur des ensembles d'objets (de même nature, noeuds ou arcs). Elles prennent généralement un singleton en entrée mais peuvent très bien retourner plusieurs objets en sortie, ou l'ensemble vide. L'opérateur union peut ainsi être utilisé pour grouper les résultats de deux sous-requêtes (équivalent à un ou logique). Enfin, il est possible de parenthéser une expression E pour l'appliquer sur l'ensemble courant d'objets sans déplacement, même si E contient des déplacements, de manière analogue à la construction [0...]0 en XPath. DPath autorise ainsi les constructions suivantes, sans déplacement:

  • .( <exp> ) pour filtrer l'ensemble courant en ne gardant que les membres vérifiant l'expression;
  • .x( <exp> ) pour garder l'ensemble courant, si au moins un des membres vérifie l'expression;
  • .a( <exp> ) pour garder l'ensemble courant, si tous ses membres vérifient l'expression;
  • .n( <exp> ) pour garder l'ensemble courant, si aucun de ses membres vérifient l'expression.

Il est également possible d'itérer une expression avec la notation ( <exp>)*.

L'expression suivante permet de récupérer les noeuds de catégorie coo (coordonnant), lié à un noeud fils verbal par un arc étiqueté coord3 et à un noeud père verbal par un arc d'adjonction.

  1. dpath is_coo
  2. .(out is_coord3 target is_v)
  3. .(in is_adj source is_v)

exemple d'expression dpath


  • 0
  • 0
configuration filtrée par l\'expression DPath dans il mange et il boit.



  • 0
  • 0
configuration rejetée par l\'expression DPath dans il mange ou non ?

Les deux méthodes suivantes (sur les noeuds) s'appuient sur des expressions DPath pour se déplacer au noeud père (via l'arc entrant) ou aux noeuds fils (via les arcs sortants). Ces méthodes peuvent ensuite elles-mêmes être utilisées dans des expressions DPath.

  1. sub parent {
  2. shift->apply(dpath in source);
  3. }
  4. sub children {
  5. shift->apply(dpath out target);
  6. }

méthodes de déplacement vers les noeuds père ou fils

En allant plus loin, on peut ainsi définir des méthodes de déplacement beaucoup plus complexes. Ainsi, la méthode suivante (sur les noeuds) permet de se déplacer vers son sujet. On notera l'emploi de l'opérateur union et l'emploi récursif de la méthode get_subject (intuitivement, un sujet est accroché directement sur le noeud ou doit être recherché récursivement sur un auxiliaire adjoint au noeud).

  1. sub get_subject {
  2. (shift->apply( dpath out
  3. ( is_subject target union is_Infl is_adj target is_aux get_subject )
  4. ) )[0]; }

méthode récursive pour se déplacer vers le sujet

DPath version wiki

Dans le cadre de ce wiki, pour la consultation des corpus analysés avec FRMG, DPath a été complété par l'utilisation d'une phase amont d'indexation via ElasticSearch. Il est également envisagé d'utiliser DPath pour chercher certaines structures dans les phrases d'exemple servant à illustrer ce wiki.

Pour ce wiki, DPath a aussi été étendu pour fonctionner pour les schémas CONLL, PASSAGE et DepCONLL en plus de DepXML. Il est également possible d'utiliser des macro. Les requêtes faites par les utilisateurs peuvent être enregistrés en vue de constituer une bibliothèque.

Il existe quelques différences de notation avec la version Perl.

Ainsi sur les expressions parenthésées:

  • .( <exp> ) pour filtrer l'ensemble courant en ne gardant que les membres vérifiant l'expression;
  • x( <exp> ) pour garder l'ensemble courant, si au moins un des membres vérifie l'expression;
  • a( <exp> ) pour garder l'ensemble courant, si tous ses membres vérifient l'expression;
  • n( <exp> ) pour garder l'ensemble courant, si aucun de ses membres vérifient l'expression.

Pour les tests élémentaires:

  • [@cat="v"] pour un trait de base (form, lemma; cat et xcat pour DepXML; pos et cpos pour CONLL)
  • [@features@p="2"] pour des traits morphosyntaxiques profonds (ici p pour personne)
  • [@cpos="C"] [@features@p="2"] pour une conjonction (séquence) de tests

Et naturellement, plus d'échappements possibles vers Perl !