L'extraction du patron

A l'issu de la BÀO 2, nous disposons deux fichiers annotés. L'un est au format XML et l'autre est en format TXT.

L'objectif de cette étape est d'extraire des patrons à partie du fichier généré par Cordial.

Dans le texte suivant, deux solutions vont être présentées. L'un est une méthode de pur Perl avec les expressions régulière, alors que l'autre utilise le module XML::XPATH.

Les patrons syntaxiques à extraire sont :
PREP DETIMS NCMS
NCMS ADJMIN

Solution 1 : extraction avec les expressions régulières

L'entrée :
1. les sorties en texte brute étiquetés via Cordial issues de la Boîte à Outils 2
2. un fichier qui contient les motifs

L'idée du script :

1. Comme le résultat de l'étiquetage est présenté sous trois colonnes et il y a une relation bijective entre les trois éléments dans chaque ligne, on peut sauvegarder respectivement les trois colonnes dans trois listes.
2. Il nous faut un fichier de motif pour extraire les mots correspondants.
3. C'est bien facile de remarquer que chaque ligne sauf celles qui contiennent la ponctuation est séparée par deux fabulations. De ce fait, on peut extraire les trois éléments de chaque ligne par l'expression régulière : $ligne=~/^([^\t]+)\t([^\t]+)\t([^\t]+)$/.
4. Quant à ceux qui contiennent la ponctuation, on les prend comme des délimiteurs. 5. Comme les tokens, les lemmes et les étiquettes sont correspondants, les indices des motifs dans la liste de l’étiquette sont aussi les indices des mots dans la liste de tokens. Pour récupérer les indices des motifs dans la liste de l’étiquette, on met chaque patron (une séquence des étiquette) en une même ligne et ajoute les espaces pendant chaque mot dans la liste de l’étiquette. (C’est étape est très importante! Parce qu’on compte les indices par les espaces!)
6. If dans la nouvelle liste de l’étiquette, on trouve les patrons, on extrait tout ce qui est avant le patron s` et compte l’espace dans s`.
7. Compter le nombre de l’étiquette dans un patron: on split le patron par l’espace et utiliser la fonction $# pour trouver l’indice de la dernière étiquette dans le patron.
8. C’est facile de remarquer que la première indice du mot est le nombre de l’espace qu’on vient de compter et la dernière est la somme du nombre de l’espace et l’indice du dernier élément du patron.

Solution 2 : extraction avec le module XML::XPATH

L'entrée :
1. les sorties en texte brute étiquetés via Cordial issues de la Boîte à Outils 2
2. Les motifs

L'idée du script :

1. Le fichier taggé est tout d'abord transformé en une liste LISTE (une ligne = 1 élément de la liste).
2. On va ensuite vider progressivement la liste LISTE en supprimant son premier élément à gauche : pour chaque élément enlevé, on regarde :
s'il contient la première POS du patron rangé dans @ARGV (comparaison de chaîne de caractère via des regexp)?
si oui, on examine les éléments suivants dans la liste LISTE sur une longueur correspondant à la longueur du patron (sous-liste de @ARGV) : càd que l'on regarde si la ligne suivante (en position 0 dans la nouvelle liste) contient ou pas le second terme du patron, puis si la ligne suivante (en position 1 dans lanouvelle liste) contient ou pas le troisième terme du patron etc. On fait cela en tenant compte de la longueur du patron et si sur une ligne il n'y a pas coïncidence on ne regarde pas les suivantes...
s'il y a coïncidence "globale" entre chaque terme POS et celle contenue dans un élément de LISTE examiné : on imprime la liste de formes correspondantes.

Téléchargement