(: on s'intéresse au patron morphosyntaxique : NOUN ADP DET NOUN :) (: 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 2eme balise contient la forme du token (son texte) la 4eme balise correspond à l'étiquette morpho-syntaxique du token (son POS) :) for $item in collection("sortiesBAO2/BAO2_sortieUDpipe_3246.txt.xml")//item (: on récupère les séquences correspondant à notre patron et on stocke la liste de toutes les séquences dans la variable $res :) let $res:= if ( $item[contains(a[4]/text(),'NOUN')][following-sibling::*[1][contains(a[4]/text(),'ADP')]][following-sibling::*[2][contains(a[4]/text(),'DET')]][following-sibling::*[3][contains(a[4]/text(),'NOUN')]] ) then ( string-join(($item/a[2]/text(), $item/following-sibling::*[1]/a[2]/text(), $item/following-sibling::*[2]/a[2]/text(), $item/following-sibling::*[3]/a[2]/text()), ' ') ) (: ATTENTION on tient compte des formes contractées :) else if ( $item[contains(a[4]/text(),'NOUN')][following-sibling::*[1][contains(a[1]/text(),'-')]][following-sibling::*[2][contains(a[4]/text(),'ADP')]][following-sibling::*[3][contains(a[4]/text(),'DET')]][following-sibling::*[4][contains(a[4]/text(),'NOUN')]] ) then ( string-join(($item/a[2]/text(), $item/following-sibling::*[2]/a[2]/text(), $item/following-sibling::*[3]/a[2]/text(), $item/following-sibling::*[4]/a[2]/text()), ' ') ) else if ( $item[contains(a[4]/text(),'NOUN')][following-sibling::*[1][contains(a[1]/text(),'-')]][following-sibling::*[2][contains(a[4]/text(),'ADP')]][following-sibling::*[3][contains(a[4]/text(),'DET')]][following-sibling::*[4][contains(a[1]/text(),'-')]][following-sibling::*[5][contains(a[4]/text(),'NOUN')]] ) then ( string-join(($item/a[2]/text(), $item/following-sibling::*[2]/a[2]/text(), $item/following-sibling::*[3]/a[2]/text(), $item/following-sibling::*[5]/a[2]/text()), ' ') ) else if ( $item[contains(a[4]/text(),'NOUN')][following-sibling::*[1][contains(a[4]/text(),'ADP')]][following-sibling::*[2][contains(a[1]/text(),'-')]][following-sibling::*[3][contains(a[4]/text(),'DET')]][following-sibling::*[4][contains(a[4]/text(),'NOUN')]] ) then ( string-join(($item/a[2]/text(), $item/following-sibling::*[1]/a[2]/text(), $item/following-sibling::*[3]/a[2]/text(), $item/following-sibling::*[4]/a[2]/text()), ' ') ) else if ( $item[contains(a[4]/text(),'NOUN')][following-sibling::*[1][contains(a[4]/text(),'ADP')]][following-sibling::*[2][contains(a[4]/text(),'DET')]][following-sibling::*[3][contains(a[1]/text(),'-')]][following-sibling::*[4][contains(a[4]/text(),'NOUN')]] ) then ( string-join(($item/a[2]/text(), $item/following-sibling::*[1]/a[2]/text(), $item/following-sibling::*[2]/a[2]/text(), $item/following-sibling::*[4]/a[2]/text()), ' ') ) else() (: 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))," ")