Un étiqueteur basé sur les CRF, licence GNU.
Ces scripts ont été optimisés pour les systèmes Unix. Ils risquent probablement de ne pas fonctionner sous Windows.
Il s'agit d'un outil permettant d'annoter du texte brut avec des étiquettes POS (détaillées ci-dessous) sur lequel on pourra se baser pour éventuellement, par la suite, effectuer un parenthésage en chunks. Par le terme " chunk ", on désigne la plus petite séquence d'unités linguistiques possible formant un groupe avec une tête forte, et qui n'est ni discontinue, ni récursive (Abney 91). Les chunks définissent la structure syntaxique superficielle des phrases (Constant et al. 11).
Plus d'informations concernant la base théorique de SEM dans la partie bibliographie et concernant le parenthésage en chunks dans le guide d'annotation.
/!\ Il faut cependant noter quelques différences
entre le programme et les documents explicatifs, qui évoluent en
parallèle mais pas forcément de manière simultanée.
D'un côté, certains choix linguistiques faits lors de la rédaction des
articles de la bibliographie ne concordent éventuellement plus avec la
version actuelle du programme, notamment le groupe COOR devenu CONJ
après absorption des conjonctions de subordination en plus des
conjonctions de coordination. Par ailleurs, pour éviter les problèmes
d'étiquetage, ce groupe ne contient plus que les conjonctions
elles-mêmes et non plus le groupe qu'il introduit.
D'un autre côté, les modèles fournis avec SEM ne sont pas toujours
compatibles avec les choix linguistiques du guide, mais plutôt avec ceux
des articles.
Cet outil ne fonctionne pas avec des programmes mais des modèles, c'est-à-dire des données qui sont le résultat d'un apprentissage automatique et qui servent à paramétrer le programme. Ceci explique pourquoi il est absolument nécessaire de choisir des modèles (cf. partie commandes) pour appliquer SEM. Par ailleurs, certains de nos modèles ont été construits en se servant de données du lefff, le lexique des formes fléchies du français (Clément et al. 04).
L'apprentissage en question a été réalisé sur le French Treebank (Abeillé et al. 03), un corpus arboré de phrases du français tiré du journal Le Monde.
Les programmes suivants doivent être installés sur votre ordinateur pour pouvoir lancer l'étiqueteur :
Les modèles que nous proposons sont compatibles avec la version 1.5 de Wapiti. En cas de problème à l'utilisation, vous pouvez envoyer un mail à yoa[point]dupont[arobase]gmail[point]com.
bzr branch lp:~yoann-dupont/crftagger/stand-alone-tagger
Toutefois, l'installation de bazaar est facultative et le code peut être directement récupéré par navigateur sur launchpad, dans le projet crftagger.
Unités multi-mots - L'étiqueteur de SEM est
étroitement lié à son segmenteur, en particulier pour la question des
unités multi-mots ou mwe (multi-word entity). Il s'agit d'un ensemble de
mots qui forment une unité polylexicale contigue à part entière et dont
la nature peut varier, par exemple " cordon bleu ",
" San Francisco ", " par rapport à " (Tellier et al. 12).
Si on ne dispose pas en entrée d'un fichier segmenté en tokens au préalable, SEM propose deux types de segmentation :
* Tous les signes de ponctuation sont considérés comme des séparateurs, sauf le point dans le cas où il suit l'abréviation d'un titre de civilité, et le tiret pour pouvoir préserver les mots composés (voir l'exemple avec " Ile-de-France "). Une exception est faite pour les inversions sujet-verbe (avec éventuellement un t épenthétique comme dans " a-t-il ") qui sont bien découpées.
POS - L'étiqueteur se base sur le jeu d'étiquettes morpho-syntaxiques de (Crabbé et al. 08), auquel on a ajouté une étiquette récupérée de l'application sur le French TreeBank, CL, pour les clitiques dont on ne trouve pas la sous-catégorie, c'est-à-dire les explétifs qui ne sont explicitement considérés ni comme sujets, ni objets, ni réfléchis (typiquement " y " dans " il y a " ou le démonstratif " c' ").
Voici la liste exhaustive des étiquettes utilisées et la catégorie syntaxique à laquelle ils correspondent :
Chunks - Quant à la liste des chunks, elle est directement liée à celle des étiquettes POS et comporte donc 6 grands types de groupes (têtes potentielles entre parenthèses) :
A chaque chunk est associée une étiquette qui marque le début du chunk (B, pour beginning) ou sa continuité (I, pour in). Quant aux mots qui ne font pas partie d'un des chunks ci-dessus, ils sont alors annotés O (pour out).
Pour plus d'informations concernant le découpage en chunks, consulter le guide d'annotation.
Entités nommées - La liste des entités nommées a été définie dans l'annotation référentielle du French Treebank en entités nommées (Sagot et al. 12). 7 types principaux sont distingués :
À l'instar des chunks, à chaque entité nommée est associée un marqueur B ou I pour son début et sa continuité respectivement.
Prenons la phrase suivante, extraite du French TreeBank :
" Tout nouvel organisme public national sera implanté hors d'Ile-de-France. "
1. Segmentation : avant d'effectuer l'étiquetage sur cette phrase, il faut au préalable la segmenter en tokens (ou jetons), où chaque token représente une unité atomique, éventuellement multimots (dont les différentes parties pourraient par exemple être rattachées par des tirets bas).
Tout nouvel organisme public national sera implanté hors_d' Ile-de-France .
/!\ Si on ne dispose pas d'une segmentation au préalable, on peut demander à SEM de le faire, auquel cas on obtiendrait, selon la segmentation dite " maximale " de SEM :
[...] hors d' Ile-de-France .
Les unités multi-mots ne sont donc pas reconnues mais peuvent être prises en compte par la suite dans l'étiquetage POS, où chaque étiquette, correspondant à la continuation d'une unité multi-mots commencée précédemment, sera précédée d'un tiret bas. Cette façon d'annoter a été préférée à celle décrite dans (Constant et al. 11), qui identifiait ces unités avec le codage BI(O) rattachées au POS, afin de réserver ce type d'étiquetage pour le chunking uniquement. On aurait par exemple :
[...] hors P d' _P Ile-de-France NPP .
2. Etiquetage POS : à partir de là, il est alors possible d'effectuer un étiquetage POS. Par ailleurs, pour améliorer les performances de l'étiqueteur, on a la possibilité d'utiliser des ressources linguistiques externes (voir la partie commandes ci-dessous). Une fois l'étiquetage POS réalisé, nous obtenons le résultat suivant :
Tout DET nouvel ADJ organisme NC public ADJ national ADJ sera V implanté VPP hors_d' P Ile-de-France NPP . PONCT
3. Chunking : sur la base de cet étiquetage POS, il est possible d'effectuer un parenthésage en chunks sous la forme d'une couche d'étiquettes supplémentaire.
Tout DET B-NP nouvel ADJ I-NP organisme NC I-NP public ADJ I-NP national ADJ I-NP sera V B-VN implanté VPP I-VN hors_d' P B-PP Ile-de-France NPP I-PP . PONCT O
Pour finir, le texte est réécrit sous forme de phrase avec son étiquetage POS et son parenthésage en chunks :
(NP Tout/DET nouvel/ADJ organisme/NC public/ADJ national/ADJ) (VN sera/V implanté/VPP) (PP hors_d'/P Ile-de-France/NPP) ./PONCT
SEM dispose de module indépendants les uns des autres, le programme principal faisant alors office d'aiguilleur vers le module à lancer. Pour obtenir la liste des modules disponibles et la syntaxe générale pour les lancer : ./sem (--help ou -h)
Pour lancer un module, la syntaxe générale est : ./sem <nom_du_module> <arguments_et_options_du_module>
La liste des modules étant :
Pour lancer le module principal :
./sem tagger <fichier_de_configuration> <fichier_d'_entrée> [-o/--output-directory <répertoire_de_sortie>]
Le fichier de configuration est un fichier xml ayant pour classe de document "master" et contenant deux grandes "sections", à savoir pipeline qui définit le séquencage des actions à effectuer et options qui définit les options globales telles que l'encodage des fichiers, ou le mode verbeux.
Schéma explicatif - avec les modules invoqués (en rouge) et les modèles disponibles (rond). Le nettoyage des informations a été occulté afin de ne pas surcharger le schéma :
Le parenthésage en chunks avec l'étiquetage POS tenant compte des unités multi-mots ou mwe (multi-word entities) n'est pas encore implémenté, ce qui explique pourquoi il résulte en un fichier à part, sans suite.
Exemple - si l'on part d'un fichier non segmenté "foo.txt" et qu'on voudrait un chunking complet, avec prise en compte des unités multi-mots et des ressources du LeFFF, on aurait la commande suivante :
./sem tagger config.xml foo.txt --output-directory bar
Avec le fichier config.xml contenant :
<?xml version="1.0" encoding="UTF-8"?> <master> <pipeline> <segmentation /> <enrich config="pos-lefff.xml" /> <label model="resources/models/plain+lefff" /> <clean_info to-keep="0,-1" /> <label model="model_all" /> </pipeline> </master>
Dans un fichier de configuration, lorsqu'un chemin relatif vers un fichier est donné, il est relatif par rapport au fichier de configuration.
Détaillons pas à pas ce que va faire le SEM si nous lui donnons ce fichier.
Autrement dit, on suit le schéma suivant :
Afin de faciliter l'enrichissement du contenu textuel, un fichier xml permet de définir quelles sont les informations à ajouter. Ce langage permet d'ajouter diverses informations dans un contexte local, qu'il s'agisse de traits endogènes ou exogènes (dictionnaires).
Les traits ajoutés sont locaux. C'est-à-dire que chaque information que nous souhaitons extraire sera évaluée indépendemment sur chaque token du texte.
Chaque information (on trouve une information par colonne dans un fichier vectorisé) dans un texte est déclarée de manière nominative. Chaque information doit avoir un nom qui lui est propre et il ne peut y avoir deux informations portant le même nom dans un même fichier.
La liste des traits endogènes est :
Quant à la liste des traits exogènes, elle est :
Exemple de fichier d'enrichissement
<?xml version="1.0" encoding="UTF-8"?> <information> <!-- les entrées présentes dans le texte avant de lancer l'enrichissement --> <!-- "before" signifie qu'elles seront écrites avant les informations ajoutées --> <!-- "after" signifie qu'elles seront écrites après --> <entries> <before> <entry name="word" /> </before> </entries> <endogene> <!-- le mot commence par une majuscule et n'est pas en début de phrase --> <!-- les nœuds nullary et unary extraient une propriété booléene du token. --> <!-- leurs noms sont basés sur leur arité. --> <!-- nullary : arité 0. --> <!-- unary : arité 1. --> <!-- action est l'identifiant de la propriété à extraire. --> <!-- BOS (nullary) : le token est-il en début de phrase ? --> <!-- isUpper (unary) : le caractère à la position donnée est-il une majuscule ? --> <expression name="UpperNotBOS"> <and> <left> <unary action="isUpper">0</unary> </left> <right> <not> <nullary action="BOS" /> </not> </right> </and> </expression> <!-- le mot est une abbréviation placée devant un nom propre --> <!-- pour chaque élément, nous utilisons une expression régulière insensible à la casse --> <!-- la condition est vérifiée si au moins un élément de la liste (some = "au moins un") --> <!-- trouve une correspondance dans le mot courant --> <list name="ABN" action="some"> <element type="regexp" casing="i">^dr\.?$</element> <element type="regexp" casing="i">^mmes?\.?$</element> <element type="regexp" casing="i">^me?lles?\.?$</element> <element type="regexp" casing="i">^m(e|rs?)?\.?$</element> <element type="regexp" casing="i">^st\.?$</element> </list> </endogene> <exogene> <!-- on énumère les dictionnaires des différences étiquettes POS --> <token name="ADJ" path="resources/lefff/ADJ" /> <token name="ADJWH" path="resources/lefff/ADJWH" /> <token name="ADV" path="resources/lefff/ADV" /> <!-- et ainsi de suite --> </exogene> </information>
Afin d'évaluer la qualité des étiquetages POS et chunk de SEM, ce dernier a été testé sur différents types de corpus, plus ou moins proches du corpus sur lequel il a été appris, c'est-à-dire le French Treebank (Abeillé et al. 03).
Les expériences ont porté sur la qualité des étiquetages des parties du discours (POS) d'une part, et de l'autre, sur la qualité du parenthésage en chunks sans la reconnaissance des unités multi-mots (modèle mwe), d'abord sur avec les POS corrects afin de pouvoir évaluer le chunker seul, puis avec les POS trouvés par SEM. Cette méthode a pour but de mettre en évidence la corrélation entre les étiqueteurs POS et chunk.
Étiquetage | Corpus blog | Corpus oral | Corpus oral sans amorces |
---|---|---|---|
POS | 95,6% | 81,6% | 82,1% |
CHUNK NP (sur POS parfait) | 91,9% | 78,6% | 78,6% |
CHUNK NP (sur POS du programme) | 87,0% | 70,3% | 70,2% |
L'évaluation a été faite avec l'aide du programme crotal développé par Denys Duchier. Les valeurs calculées pour l'évaluation du POS correspondent à l'exactitude (accuracy) de toutes les étiquettes tandis que pour le chunking, c'est la valeur de la F-mesure des chunks stricts (frontière à frontière) que l'on a gardée.
~ Ilaine W.