(: on s'intéresse aux relatives sujet antécédent -[acl:relcl]-> verbe -[nsubj]-> pronom[PronType=Rel] l'objectif est d'extraire le pronom relatif sujet, puis le verbe qui le gouverne, puis le nom complété par la relative :) (: dans le fichier de sortie UDPipe reformaté en XML : chaque phrase est dans une balise

chaque token est dans une balise une balise contient 10 balises la 1ere balise contient l'identifiant du token la 2eme balise contient la forme du token (son texte) la 6eme balise contient les marques flexionnelles selon le POS (gender,number,prontype,mood,person,tense...) la 7eme balise contient l'identifiant de son gouverneur la 8eme balise correspond à la relation de dépendance avec son gouverneur :) for $item in collection("BAO2_sortieUDpipe_3214.txt.xml")//item where (contains($item/a[8]/text(),'nsubj') and contains($item/a[6]/text(),'PronType=Rel')) (: on récupère dans la variable $formePronom la forme du pronom (le dépendant) dans la variable $positionPronom l'identifiant du pronom dans la variable $positionGouv l'identifiant du gouverneur (le verbe) :) let $formePronom:=$item/a[2]/text() let $positionPronom:=$item/a[1]/text() let $positionGouv:=$item/a[7]/text() (: on récupère dans la variable $formeGouv la forme du gouverneur du pronom (le verbe), et dans la variable $positionGouvGouv la position du gouverneur du gouverneur (l'antécédent, le nom complété par la relative) pour cela on récupère dans un premier temps la ligne de l'item correspondant au gouverneur, en fonction de sa position par rapport à son dépendant (avant ou après) attention il faut convertir le contenu textuel des positions en valeur numérique :) let $ligneGouv:= if ( number($positionGouv) < number($positionPronom) ) then ( $item/preceding-sibling::item[number(a[1])=number($positionGouv)] ) else ( $item/following-sibling::item[number(a[1])=number($positionGouv)] ) let $formeGouv:= $ligneGouv/a[2]/text() let $positionGouvGouv:= $ligneGouv/a[7]/text() (: on récupère dans la variable $formeGouvGouv la forme du gouverneur du gouverneur (l'antécédent), en fonction de sa position par rapport à son dépendant (avant ou après) attention, comme on récupère normalement un nom, on veut éviter de récupérer les articles élidés mal analysés alors, on teste si la forme contient une apostrophe :) let $formeGouvGouv:= if ( number($positionGouvGouv) < number($positionGouv) ) then ( $item/preceding-sibling::item[number(a[1])=number($positionGouvGouv)]/a[2]/text() ) else ( $item/following-sibling::item[number(a[1])=number($positionGouvGouv)]/a[2]/text() ) (: on concatène la forme de l'antécédent + la forme du pronom + la forme du verbe avec des espaces et on stocke la liste de toutes les séquences dans la variable $res :) let $res:= string-join(($formeGouvGouv,$formePronom,$formeGouv)," ") (: on regroupe les séquences :) group by $grp:=$res (: on compte le nombre d'occurrences de chaque séquence et on les trie par ordre décroissant :) order by count($res) descending (: on concatène la séquence + une tabulation + le nombre d'occurrences et on affiche le tout :) return string-join(($grp,count($res))," ")