(: on s'intéresse au patron morphosyntaxique : NOUN ADP NOUN ADP :)
(: 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_3214.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(),'NOUN')]][following-sibling::*[3][contains(a[4]/text(),'ADP')]] )
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(),'NOUN')]][following-sibling::*[4][contains(a[4]/text(),'ADP')]] )
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(),'NOUN')]][following-sibling::*[4][contains(a[1]/text(),'-')]][following-sibling::*[5][contains(a[4]/text(),'ADP')]] )
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(),'NOUN')]][following-sibling::*[4][contains(a[4]/text(),'ADP')]] )
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(),'NOUN')]][following-sibling::*[3][contains(a[1]/text(),'-')]][following-sibling::*[4][contains(a[4]/text(),'ADP')]] )
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))," ")