Elise LINCKER

Boîte à outils 3 - partie 1

Extraction de patrons morpho-syntaxiques

Objectif

Le premier objectif de cette troisième boîte à outils est d'extraire des patrons morpho-syntaxiques. Nous travaillerons sur les données annotées avec TreeTagger et UDPipe, générées par la boîte à outils 2.

Nous allons procéder par différentes méthodes :

Pour extraire les patrons morpho-syntaxiques avec XQuery et XSLT, il est nécessaires d'utiliser des données au format XML. Nous utiliserons la sortie TreeTagger au format XML et la sortie UDPipe qui a été reformatée en XML dans la boîte à outils 2.

Les 7 patrons morpho-syntaxiques à extraire sont :

Remarque :

Dans les données annotées avec UDPipe, les formes contractées sont détaillées sous la forme suivante :

Par exemple : Or, pour rechercher des suites telles que NOM PREP DET NOM, dans un cas de figure comme celui de l'exemple ci-dessus, il est nécessaire d'omettre la ligne "4-5 du". Les codes qui s'appliquent aux données UDPipe ont été élaborés pour tenir compte des formes contractées.

Méthode 1 : XQuery

Nous commencons par extraire les patrons avec XQuery. La requête ci-dessous correspond à l'extraction du patron NOM PREP NOM PREP (NOUN ADP NOUN ADP avec le jeu d'étiquettes utilisé par UDPipe, NOM PRP NOM PRP avec celui de TreeTagger). Les requêtes correspondant aux 7 patrons sont téléchargeables sous le code.

(: 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 <p>
   chaque token est dans une balise <item>
   une balise <item> contient 10 balises <a>
   la 2eme balise <a> contient la forme du token (son texte)
   la 4eme balise <a> 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)),"	")
(: on s'intéresse au patron morphosyntaxique : NOM PRP NOM PRP :)

(: dans le fichier de sortie TreeTagger XML :
   chaque phrase est dans une balise <titre> ou <description>
   chaque token est dans une balise <element>
   une balise <element> contient 3 balises <data>
   la 1ere balise <data> contient l'étiquette morpho-syntaxique du token (son POS)
   la 2eme balise <data> contient le lemme du token
   la 3eme balise <data> contient la forme du token (son texte) :)

for $element in collection("sortiesBAO2/BAO2_sortieXML_TreeTagger_3214.xml")//element
where
  $element[contains(data[1]/text(),'NOM')][following-sibling::element[1][contains(data[1]/text(),'PRP')]][following-sibling::element[2][contains(data[1]/text(),'NOM')]][following-sibling::element[3][contains(data[1]/text(),'PRP')]]

(: on récupère dans des variables la forme de chaque token du patron :)
let $forme1:=$element/data[3]/text()
let $forme2:=$element/following-sibling::element[1]/data[3]/text()
let $forme3:=$element/following-sibling::element[2]/data[3]/text()
let $forme4:=$element/following-sibling::element[3]/data[3]/text()

(: on concatène les éléments avec des espaces
   et on stocke la liste de toutes les séquences dans la variable $res :)
let $res:= string-join(($forme1, $forme2, $forme3, $forme4)," ")

(: 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)),"	")

Méthode 2 : XSLT

Nous effectuons la même tâche avec XSLT. Ci-dessous sont présentés les deux codes pour le patron NOM PREP NOM PREP (NOUN ADP NOUN ADP pour UDPipe, NOM PRP NOM PRP pour TreeTagger). Pour extraire un autre patron, il suffit de modifier les paramètres au début du code. Puis, en fonction du nombre de paramètres, on ajoutera ou supprimera des conditions à <xsl:if> sur les frères, et on ajoutera ou supprimera des tokens à afficher. Les feuilles de style utilisées pour chacun des 7 patrons sont toutes disponibles sous les codes.

La feuille de style permet de récupérer et imprimer les résultats. Le tri en fonction de la fréquence se fait directement en ligne de commande. On utilisera la commande suivante :

xsltproc fichier.xsl fichier.xml | sort | uniq -c | sort -nr

Par exemple :

xsltproc bao3_extract_patron_1.xsl BAO2_sortieUDpipe_3476.txt.xml | sort | uniq -c | sort -nr > BAO3_sortie_XSLT_NOUN_ADP_NOUN_ADP_3476.txt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="text" encoding="utf-8"/>

<!-- 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 <p>
     chaque token est dans une balise <item>
     une balise <item> contient 10 balises <a>
     la 2eme balise <a> contient la forme du token (son texte)
     la 4eme balise <a> correspond à l'étiquette morpho-syntaxique du token (son POS) -->

<!-- on crée un paramètre pour chaque élément du patron -->
<xsl:param name="POS1">NOUN</xsl:param>
<xsl:param name="POS2">ADP</xsl:param>
<xsl:param name="POS3">NOUN</xsl:param>
<xsl:param name="POS4">ADP</xsl:param>

<!-- template principal -->
<xsl:template match="/">
<xsl:apply-templates select="//item"/>
</xsl:template>

<!-- règle appliquée à chaque balise <item> càd à chaque token -->
<xsl:template match="item">

	<!-- pour chaque item d'une phrase dont la 4e balise <a> contient le premier POS du patron et dont les 4e balises <a> des éléments qui suivent forment la suite de POS qui constitue le patron
	     ATTENTION on tient compte des formes contractées ! -->
	<xsl:choose>
		<xsl:when test="contains(following-sibling::*[1]/a[1]/text(),'-')">
			<xsl:choose>
				<xsl:when test="contains(following-sibling::*[4]/a[1]/text(),'-')">
					<xsl:if test="contains(a[4]/text(),$POS1) and contains(following-sibling::*[2]/a[4]/text(),$POS2) and contains(following-sibling::*[3]/a[4]/text(),$POS3) and contains(following-sibling::*[5]/a[4]/text(),$POS4)">
						<!-- on imprime chaque token (sa forme) de la séquence -->
						<xsl:value-of select="concat(a[2]/text(), ' ',following-sibling::*[2]/a[2]/text(), ' ', following-sibling::*[3]/a[2]/text(), ' ', following-sibling::*[5]/a[2]/text())"/>
						<xsl:text>
</xsl:text>
					</xsl:if>
				</xsl:when>
				<xsl:otherwise>
					<xsl:if test="contains(a[4]/text(),$POS1) and contains(following-sibling::*[2]/a[4]/text(),$POS2) and contains(following-sibling::*[3]/a[4]/text(),$POS3) and contains(following-sibling::*[4]/a[4]/text(),$POS4)">
						<!-- on imprime chaque token (sa forme) de la séquence -->
						<xsl:value-of select="concat(a[2]/text(), ' ',following-sibling::*[2]/a[2]/text(), ' ', following-sibling::*[3]/a[2]/text(), ' ', following-sibling::*[4]/a[2]/text())"/>
						<xsl:text>
</xsl:text>
					</xsl:if>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:when>

		<xsl:when test="contains(following-sibling::*[2]/a[1]/text(),'-')">
			<xsl:if test="contains(a[4]/text(),$POS1) and contains(following-sibling::*[1]/a[4]/text(),$POS2) and contains(following-sibling::*[3]/a[4]/text(),$POS3) and contains(following-sibling::*[4]/a[4]/text(),$POS4)">
				<!-- on imprime chaque token (sa forme) de la séquence -->
				<xsl:value-of select="concat(a[2]/text(), ' ',following-sibling::*[1]/a[2]/text(), ' ', following-sibling::*[3]/a[2]/text(), ' ', following-sibling::*[4]/a[2]/text())"/>
				<xsl:text>
</xsl:text>
			</xsl:if>
		</xsl:when>
	
		<xsl:when test="contains(following-sibling::*[3]/a[1]/text(),'-')">
			<xsl:if test="contains(a[4]/text(),$POS1) and contains(following-sibling::*[1]/a[4]/text(),$POS2) and contains(following-sibling::*[2]/a[4]/text(),$POS3) and contains(following-sibling::*[4]/a[4]/text(),$POS4)">
				<!-- on imprime chaque token (sa forme) de la séquence -->
				<xsl:value-of select="concat(a[2]/text(), ' ',following-sibling::*[1]/a[2]/text(), ' ', following-sibling::*[2]/a[2]/text(), ' ', following-sibling::*[4]/a[2]/text())"/>
				<xsl:text>
</xsl:text>
			</xsl:if>
		</xsl:when>
	
		<xsl:otherwise>
			<xsl:if test="contains(a[4]/text(),$POS1) and contains(following-sibling::*[1]/a[4]/text(),$POS2) and contains(following-sibling::*[2]/a[4]/text(),$POS3) and contains(following-sibling::*[3]/a[4]/text(),$POS4)">
					
				<!-- on imprime chaque token (sa forme) de la séquence -->
				<xsl:value-of select="concat(a[2]/text(), ' ',following-sibling::*[1]/a[2]/text(), ' ',following-sibling::*[2]/a[2]/text(), ' ', following-sibling::*[3]/a[2]/text())"/>
				<xsl:text>
</xsl:text>
			</xsl:if>
		</xsl:otherwise>
	</xsl:choose>

</xsl:template>


</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="text" encoding="utf-8"/>

<!-- on s'intéresse au patron morphosyntaxique : NOM PRP NOM PRP -->
<!-- dans le fichier de sortie TreeTagger XML :
     chaque phrase est dans une balise <titre> ou <description>
     chaque token est dans une balise <element>
     une balise <element> contient 3 balises <data>
     la 1ere balise <data> contient l'étiquette morpho-syntaxique du token (son POS)
     la 2eme balise <data> contient le lemme du token
     la 3eme balise <data> contient la forme du token (son texte)-->

<!-- on crée un paramètre pour chaque élément du patron -->
<xsl:param name="POS1">NOM</xsl:param>
<xsl:param name="POS2">PRP</xsl:param>
<xsl:param name="POS3">NOM</xsl:param>
<xsl:param name="POS4">PRP</xsl:param>

<!-- template principal -->
<xsl:template match="/">
<xsl:apply-templates select="//element"/>
</xsl:template>

<!-- règle appliquée à chaque balise <element> càd à chaque token -->
<xsl:template match="element">

	<!-- pour chaque token d'une phrase dont la 1ere balise <data> contient le premier POS du patron et dont les 1eres balises <data> des éléments qui suivent forment la suite de POS qui constitue le patron -->
	<xsl:if test="contains(data[1]/text(),$POS1) and contains(following-sibling::element[1]/data[1]/text(),$POS2) and contains(following-sibling::element[2]/data[1]/text(),$POS3) and contains(following-sibling::element[3]/data[1]/text(),$POS4)">
		<xsl:value-of select="concat(data[3]/text(), ' ', following-sibling::element[1]/data[3]/text(), ' ', following-sibling::element[2]/data[3]/text(), ' ', following-sibling::element[3]/data[3]/text())"/>
		<xsl:text>
</xsl:text>
	</xsl:if>

</xsl:template>


</xsl:stylesheet>

Méthode 3 : Perl

La troisième méthode consiste à extraire les patrons avec un script Perl, à partir de données annotées avec UDPipe au format CONLL. Tous les patrons sont extraits en même temps avec ce même script. Nous utilisons un fichier externe patrons.txt dans lequel sont écrits les patrons (1 par ligne). Le programme lit chacun des patrons, extrait les séquences correspondantes dans le fichier UDPipe, et produit en sortie autant de fichiers que de patrons recherchés. Les fichiers de sortie sont au format texte brut et contiennent la liste triée des séquences récupérées et leur nombre d'occurrences.

#!/usr/bin/perl
<<DOC; 
Nom -- Elise LINCKER
Date -- AVRIL 2021

Traitement -- extraction de patrons morphosyntaxiques

Utilisation du programme -- perl bao3_extract_patrons.pl FICHIER_A_TRAITER FICHIER_PATRONS
Exemple d utilisation -- perl bao3_extract_patrons.pl ./sortiesBAO2/BAO2_sortieUDpipe_3244.txt patrons.txt
Entrée -- le nom de la sortie UDPipe au format CONLL
          et le fichier TXT contenant la liste des patrons morpho-syntaxiques à extraire
Sortie -- autant de fichiers TXT que de lignes dans le fichier des patrons
          chacun contenant la liste triée des séquences qui correspondent au patron
DOC

use utf8;
binmode STDOUT, ':utf8';

#---------------------------------------------------------------------------------
my $fichierUDPipe="$ARGV[0]";
my $fichierPatrons="$ARGV[1]";

#---------------------------------------------------------------------------------
#on stocke les patrons écrits dans $fichierPatrons
open my $termino,"<:encoding(utf8)","$fichierPatrons";
my @patrons = <$termino>;
close($termino);

#---------------------------------------------------------------------------------
#extraction des patrons....

open my $IN ,"<:encoding(utf8)","$fichierUDPipe";

#on crée deux listes parallèles dans lesquelles on va stocker tous les tokens de chaque phrase et leurs pos 
my @token=();
my @pos=();

while (my $ligne=<$IN>) {
	
	#si la ligne commence par un #, ou si le token est une forme contractée
	#    exemple : 3-4 du
	#              3 de
	#              4 le
	#              --> on ignore la ligne qui commence par 3-4
	#alors il n'y a rien à traiter, et on passe à la ligne suivante
	next if $ligne=~m/^#|\d+-\d+/ ;

	$ligne=~s/\r?\n//g;
	
	#si la ligne n'est pas vide, on est toujours dans la même phrase :
	if ($ligne ne "") {
		#on ajoute aux listes le token et le pos récupérés dans la ligne
		my @ligne = split /\t/, $ligne;
		push @token, $ligne[1];
		push @pos, $ligne[3];
	}

	#sinon, c'est la fin de la phrase ---> on traite les listes
	else {

		#pour chaque patron $patron récupéré du fichier des patrons,
		foreach my $patron (@patrons) {
			
			$patron=~s/\r?\n//g;
			
			#on stocke dans la variable $longueurPatron la longueur du patron (<=> le nombre de POS à extraire pour ce patron)
			my $longueurPatron=0;
			while ($patron=~/ /g) {$longueurPatron++}
			
			my $i=0;
			#pour chaque POS $element de la liste @pos
			foreach my $element (@pos) {
				$i++;
				
				#si il correspond au premier POS du patron
				if ($patron =~/^$element/) {
					#on récupère dans la variable string $suitePOS toute la séquence de POS sur $longueurPatron caractères
					my $suitePOS="";
					my $j;
					for ($j=$i-1;$j<=$longueurPatron+$i-1;$j++) {$suitePOS=$suitePOS.$pos[$j]." "}
					
					#si $suitePOS (la suite de POS de longueur $longueurPatron récupérée) correspond au patron
					if ($suitePOS=~/$patron/) {
						#on concatène les tokens avec des espaces dans la variable $extract
						my $extract = join(" ", @token[$i-1..$j-1]);
						#et on l'ajoute au tableau du patron correspondant
						#(on crée le tableau si il n'existe pas encore)
						$dico{$patron} = [] unless exists $dico{$patron};
						push @{$dico{$patron}}, $extract;
						}
				}
			}
		}

	#on réinitialise les listes de tokens et de pos pour la phrase suivante
	@token=();
	@pos=();
	}
}

#on imprime les résultats obtenus pour chaque patron de manière indépendante
foreach my $patron (keys %dico) {
	#on crée un fichier de sortie pour le patron traité
	my $nomPatron = join("_",split(' ', $patron)); 
	open my $OUT,">:encoding(utf8)","BAO3_sortie_Perl_$nomPatron.txt";
	#on récupère le tableau qui correspond au patron traité
	my @extract = @{$dico{$patron}};
	#on crée une nouvelle table de hachage pour compter les occurrences de chaque séquence extraite
	my %extractFreq;
	++$extractFreq{$_} for @extract;
	#on trie par ordre décroissant de fréquence et on imprime dans le fichier la séquence suivie de son nombre d'occurrences
	foreach $unique (sort {$extractFreq{$b}<=>$extractFreq{$a}} (keys %extractFreq)) {
		print $OUT "$unique\t$extractFreq{$unique}\n";
	}
	close $OUT;
}

Résultats

Fichiers :

Télécharger toutes les sorties de toutes les rubriques pour tous les patrons : icone-de-telechargement

Tous les fichiers de sortie peuvent aussi être visualisés directement depuis les tableaux ci-dessous.

Sorties pour le patron NOM PREP NOM PREP
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Sorties pour le patron VERBE DET NOM
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Sorties pour le patron NOM ADJ
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Sorties pour le patron ADJ NOM
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Sorties pour le patron NOM ADJ ADJ
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Sorties pour le patron NOM DET NOMPR
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Sorties pour le patron NOM PREP DET NOM
RUBRIQUE Données UDPipe Données TreeTagger
SORTIE Perl SORTIE XQuery SORTIE XSLT SORTIE XQuery SORTIE XSLT
Europe - 3214 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Planète - 3244 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Culture - 3246 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement
Cinéma - 3476 icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement icone-de-telechargement

Observations sur les résultats :

Après avoir jeté un oeil aux résultats, nous constatons que l'extraction d'un même patron donne lieu à des différents résultats selon l'outil utilisé. Les séquences extraites à partir des données TreeTagger comportent beaucoup d'erreurs, dûes à des erreurs de tokenisation et d'analyse morpho-syntaxique, notamment en ce qui concerne les caractères de ponctuation : on retrouve par exemple des «…», «'», «”» dans nos patrons. Moins de séquences sont extraites à partir des données UDPipe : on relève moins d'erreurs et on a l'impression que les patrons sont mieux filtrés. D'un autre côté, UDPipe produit quelques erreurs d'étiquetage ce qui implique que des séquences pourtant correctes ne sont pas récupérées pour un patron donné. Dans l'ensemble, UDPipe semble plus performant et plus précis que TreeTagger en ce qui concerne l'étiquetage morpho-syntaxique. De plus, il permet une analyse en dépendances.

Ainsi, nous préférons nous concentrer sur les patrons extraits à partir des données annotées avec UDPipe :

Pour un même étiqueteur, les sorties obtenues avec Perl, XSLT et XQuery sont les mêmes.

En général, les patrons extraits correspondent à ce à quoi nous nous attendions pour les différentes rubriques. Par exemple, dans la rubrique Cinéma (3476), on retrouve majoritairement des termes du champ lexical du cinéma : film, documentaire, présenter, réaliser, festival, Cannes, long-métrage, Netflix, Hollywood, sélection, cinéma, salle, sortie, rédacteur, acteur, actrice, vidéo...etc. Dans toutes les rubriques et en particulier pour Planète (3244), nous retrouvons aussi le thème du Covid-19, sujet numéro 1 de l'actualité dans le monde en 2020.

Certaines séquences peuvent sembler étranges : par exemple, "poche de Mathias" apparaît à 29 reprises et constitue la séquence NOM PREP NOMPR la plus fréquente de la rubrique Culture (3246). Si à première vue une telle séquence ne semble pas adéquate, il s'agit en fait d'une chronique récurrente parmi les articles du Monde : la chronique intitulée "poche" et écrite par Mathias Enard au sujet des livres de poche.

On relève enfin certaines erreurs, dûes à des erreurs d'étiquetage par UDPipe. Par exemple, les séquences "toute autre logique" et "forêt belge fascine" sont récupérées parmi les NOM ADJ ADJ.