This repository contains a set of ressources used to enrich a morphosyntactic lexicon for old French (OFrLex) in order to improve the performance of a syntactic parser and improve its the lexical coverage. These ressources include lexicons, scripts and linguistic annotation tools for old French.
It is part of the ANR PROFITEROLE projet. This work has been conducted by Cristina Garcia Holgado and Mathilde Reignault.
Construction d'un inventaire de formes à partir du corpus gold BFMGOLDLEM et le lexique OFrLex (dev) afin d'augmenter la couverture du lexique (nouvelles entrées).
/scripts/inventaires
- Corpus BFMGOLDLEM source dans la Base de Français Médiéval: 21 textes (431 144 formes étiquetées et lemmatisées) en format CoNNL-U. Il inclut les informations suivantes: forme, lemme, étiquette UD, étiquette Cattex 2009, traits morphologiques (quelques formes) et source/idx. Des nouveaux textes ont été ajoutés postérieurement. Accès au corpus: corpus BFMGOLDLEM
- Lexique OFrLex: Lexique morpho-syntaxique annoté selon les conventions Alexina. Il est composé d'entrées lexicales de différentes sources complétées par leurs fonctions syntaxiques, leurs réalisations et leurs redistributions. Le lexique est composé d'entrées intensionnelles (.ilex) et extensionnelles (.lex) :
Intensional lexicon
aamer___746696__1 | v-er | 100;Lemma;v;Suj:cln\\sn,Obj:(cla\\sn);upos=VERB,cat=v;%actif |
Extensional lexicon (lexique utilisé)
aamer | 100 | v | [pred="aamer___746696__1__1<Suj:cln\sn,Obj:(cla | sn)>",@pers,cat=v,upos=VERB,@inf.std] | aamer___746696__1__1 | Default |
Accès au lexique (dernière version) OFrLex dev. La version précédente utilisé dans ce travail est disponible dans OFrLex old
Informations plus détaillées à propos des ressources: OFrLex, Alexina
Inventoire
inventory_builder_bfm.py
[-in CORPUS -out FILENAME -ignore IGNORE FILES]
Structure du fichier en sortie:
fpl | forme | lemme | pos (cattex) | feats_bfm | lemma_src | file_src_bfm | occ_bfm | n |
---|---|---|---|---|---|---|---|---|
confondemant_confondement_noun | confondemant | confondement | NOMcom | _ | DECT | CligesKu | 1 | _ |
confondent_confondre_verb | confondent | confondre | VERcjg | VerbForm=Fin | DECT | CligesKu | 2 | _ |
confondoit_confondre_verb | confondoit | confondre | VERcjg | VerbForm=Fin | DMF | SGenPr1 | 1 | _ |
inventory_builder_ofr.py
[-in CORPUS -out FILENAME -ignore IGNORE FILES -cattex CATTEX IF AVALIABLE -fiter_pos IGNORE POS]
Structure du fichier en sortie:
form | pos | traits | lemme | file_src | raw_lemme | inconnu | upos | no_upos |
---|---|---|---|---|---|---|---|---|
aates | adj | [pred="aate___203__1<Suj:cln | sn>",@pers,cat=adj,upos=ADJ,@sg.nom.masc] | aate___203__1 | ..\ofrlex-dev\ADJ.lex | aate | 0 | ADJ |
abaant | adj | [pred="abeant___211__1<Suj:cln | sn>",@pers,cat=adj,upos=ADJ] | abeant___211__1 | ..\ofrlex-dev\ADJ.lex | abeant | 0 | ADJ |
abaeux | adj | [pred="abaeuz___204__1<Suj:cln | sn>",@pers,cat=adj,upos=ADJ] | abaeuz___204__1 | ..\ofrlex-dev\ADJ.lex | abaeuz | 0 | ADJ |
Fusion d'entrées
scripts/map_ofrlex_bfmgoldlem.ipynb
bfm_inventory = "data\\profiterole_bfmgold_inventoire.tsv"
ofrlex_inventory = "data\\ofrlexdev_inventory.tsv
On peut fusionner les entrées BFM-OFrLex par forme-lemme (fl), forme-pos(fp) et forme-lemme-pos(flp).
merge_by_col = 'flp'
On obtient les formes en commun et/ou absentes (formes BFMGOLDLEM non renseignées dans OFrLex):
forme | lemme | UPOS | traits ofrlex | source ofrlex | ||||
---|---|---|---|---|---|---|---|---|
Abbeville* | Abeville* | _ | _ | Abeville | NOMpro | _ | _ | _ |
Abbeye___54353__1 | Abbeye | PROPN | [pred="Abbeye___54353__1<Suj:(sn)>",upos=PROPN,cat=np] | _ | _ | _ | 0.0 | ..\ofrlex-dev\PROPN.lex |
Formes BFMGOLD absentes dans OFrLex(*) triées par ordre alphabétique du lemme, ce qui permet de gérer (vérification manuelle) plus facilement les cas où l'on trouve des variants dans les lemmes:
e.g.
[...] Abbeville NOMpro
[...] Abeville NOMpro
[...] Abel NOMpro
[...] Abels NOMpro
[...] Abevile NOMpro
...
Accès aux inventaires et formes BFMGOLDLEM absentes dans OFrLex
Après avoir constaté que de nombreuses formes du corpus PROFITEROLE (32.485 formes) étaient absentes dans le lexique OFrLex-dev, on leur a attribué des informations morphologiques en utilisant divers ressources et stratégies pour le tri des différentes informations.
** Dans une étape postérieure, ces formes ont été lematisées en contexte (voir section 5)
Stratégies:
(1) Lemmatisation avec divers outils et ressources (LGeRM, BFMGOLDLEM, FROLEX) et tri selon la priorité accordée à chaque ressource:
- BFMGOLDLEM (inventaire): priorité à un corpus gold pour le français médiéval
- LGeRM: puis, propositions de la lemmatisation par LGeRM, mais l'outil est notamment conçu pour le Moyen Français
- FROLEX: lexique qui fournit uniquement lemme/POS
(2) Génération de variants graphiques possibles pour les formes qui n'ont pu être alignés (match)
Cette strátegie permet de rapprocher les formes qui n'ont pas été trouvées pendant l'étape précedente.
E.g.:
meyns (forme non trouvée) meins(variant généré) moins(forme trouvée) ADV int_quantif quantif
(3) Requêtes automatiques dans un dictionnaire externe
Pour les formes restantes qui n'ont pu être renseignées, on effectue des requêtes automatiques dans le dictionnaire (dictionnaire anglo-normand) et on extrait les informations qui sont fournies pour cette forme.
scripts/manques
-
LGeRM: plateforme, lexique morphologique et outil de lemmatisation pour le moyen français et le français médieval. Il privilégie les lemmes du DMF (Dictionnaire du Moyen Français). Pour accèder à l'outil et au lexique en local, contactez l'auteur
-
FROLEX: lexique qui rassemble des formes en français médiéval provenant de diverses sources. Il fournit leur étiquette Cattex (Cattex 2009). Ce lexique est disponible dans frolex-03.tsv dernière version (2020)
- Lemmatisation et alignement d’entrées dans les différents resources
[align_manques.py]
Fichiers nécessaires
folder = 'scripts\\enrich_ofrlexdev\\' DOSSIER DE TRAVAIL
*manques_lemmatisees = folder + "MANQUES LEMMATISÉES" # Formes manquantes lemmatisées avec lgerm
inventory_bfm = folder + 'ressources\\' + INVENTAIRE BFMGOLDLEM # Inventaire du corpus BFMGOLDLEM
frolex_f = folder + LEXIQUE FROLEX # Lexique Frolex
lexique_lgerm = "lgerm\\lexiques\\graphies_MF.txt" # Lexique LGeRM
manques_file = folder + LISTE DE FORMES MANQUANTES # Manques
* optionnel
Mode d'annotation:
Si "manques", on fournit des annotations pour les formes manquantes (première étape)
Si "variants", on fournit des annotations pour les variants générés dans [generate_variants.py]
mode = MODE
Ce script retourne un fichier (un fichier par POS) structuré de la manière suivante:
form | def_pos | def_lemma | def_morph | source | UPOS | pos |
---|---|---|---|---|---|---|
abiság | NCO | aviage | masc | LGERM | NCO | NCO |
abitation | NCO | habitation | fem | FROLEX | NCO | NCO |
abiteür | NCO | habiteur | _ | BFMGOLDLEM | NCO | NCO |
Il inclut la source à partir de laquelle nous avons récupéré les informations morphologiques. L'ensemble de fichiers en sortie peuvent être consultés dans FORMES MANQUANTES ANNOTES PAR POS
Et un seul fichier avec la liste de formes qui n'ont pas été trouvées. Vous puvez le trouver dans LISTE DE FORMES NON TROUVEES PREMIER ALIGNEMENT
- Génération de variants pour les formes qui n'ont pu être alignés (aucune correspondance dans les ressources)
On génére les variants avec [generate_variants.py]
en utilisant la liste de formes qui n'ont pas été trouvées à partir la commande suivante:
-in LISTE_FORMES -sep \t -out SAVE_TO_PATH
qui retourne:
source_mot | variant | id |
---|---|---|
malfaitúrs | malfaitúrs | 461 |
malfaitúrs | malfaiturs | 461 |
malvesyve | malvesyve | 462 |
malvesyve | malvesive | 462 |
marsopye | marsopye | 463 |
marsopye | marsopie | 463 |
Ensuite, on refait l'alignement avec le script précedent ([mode = "variants"]
). Pareillement, il retourne les formes annotées et une liste avec les formes qui n'ont pas été trouvées avec cette stratégie. LISTE DE FORMES NON TROUVEES DEUXIEME ALIGNEMENT, FORMES MANQUANTES ANNOTES PAR POS DEUXIEME ALIGNEMENT
- Requêtes automatiques dans des dictionnaires externes
[request_and.py]
Avec ce script, nous récupérons les entrées du dictionnaire correspondant au reste des formes manquantes en précisant le chemin vers les dernières formes manquantes. Pour éviter les limites de requête, nous pouvons extraire les entrées par chunks de 100 formes [from_="0"]
, [up_to= "500"]
. Structure des fichiers en sortie:
form | lemma_pos | cognates | TL: | DMF: | FEW: | Gdf: |
---|---|---|---|---|---|---|
chaitivíer | chaitivier (s.xii2)__s. | ['FEW: 2/i,330a captivus', 'Gdf: 2,38b chaitivier', 'TL: 2,173 chaitivier'] | chaitivier | captivus | chaitivier | |
chelidonius | celidoine (s.xii1/3)__s. | ['FEW: 2/i,634a chelidonia', 'DMF: chélidoine'] | chélidoine | chelidonia | ||
clamíve | clamif (s.xii)__s. | ['FEW: 2/i,730a clamare', 'TL: 2,460 clamif', 'DMF: clamif'] | clamif | clamif | clamare |
Recherche de formes préfixées dans les formes manquantes à partir d’une liste de préfixes de départ. Nous avons sélectionné les formes dans les catégories ADV, ADJ, VER et NOM. Seulement les formes avec une longueur supérieure à 3 caractères (et 3 également pour le radical) ont été retenues. Pour chaque préfixe dans la liste, nous avons collecté toutes les formes possibles commençant par ces préfixes et ensuite, nous avons cherché, à partir d'une segmentation sur le préfixe, si le radical est attesté dans le lexique. Par exemple:
[prefixe] sor - [forme trouvé] sorcroissant - [radical attesté] - croissant - [lemme associé] - croissir___750428_… - [POS] v
[find_prefixes.py]
Préiser les fichiers dans:
folder = "enrich_ofrlexdev\\data\\source_data\\"
manques_f = folder + "liste_manques.txt"
ofrlex = folder + "inventaire_ofrlex.tsv"
prefixes = folder + "prefixes.txt"
prefixe | word | root | ofr_root_form | ofr_root_lemma | ofr_root_pos | lemma_def |
---|---|---|---|---|---|---|
contre | contredeïst | deïst | deïst | dire___751970__1__1 | v | _ |
contre | contrediroient | diroient | diroient | dire___751970__1__1 | v | contredire |
des | deshonnestement | honnestement | honnestement | onestement___9076__1 | adv | déshonnêtement |
des | deshonneur | honneur | honneur | honneur___99999__1 | nc | déshonneur |
re | revenons | venons | venons | venir___60461__1__3 | v | revenir |
re | revenra | venra | venra | venir___60461__1__3 | v | revenir |
Accéder à la liste de possibles formes préfixées
Réduire le nombre de lemmes permettrait, d’une part, de réduire le nombre d’entrées (ce qui aurait pour effet de réduire l’ambiguïté lexicale et représenterait une diminution du temps de calcul de l’analyse syntaxique), et, d’autre part, de proposer une meilleure lemmatisation au terme de l’analyse syntaxique avec MetaMOF.
[distances_lemma.py]
Fournir le fichier des formes manquantes annotées pour recherches les variants avant l'ajout au lexique, ou les fichiers .md
du OFrLex pour identifier les variants présents dans le lexique.
file = 'scripts/manques/fichiers/premier_alignement/v2_conj_manques_annote.tsv'
Il retourne un fichier pour chaque partie du discours dont nous trouvons plusieurs lemmes (e.g. desus (lemme TL) au lieu de dessus (lemme DMF)).
lemme | prox_lemme | var |
---|---|---|
après_PRE | ['apres_PRE'] | |
delez_PRE | ['dalez_PRE'] | |
desor_PRE | ['desoz_PRE'] | |
dessous_PRE | ['dessus_PRE'] | |
desus_PRE | ['dessus_PRE'] | |
deçà_PRE | ['delà_PRE'] | |
en+le_PRE | ['en.le_PRE'] | |
entre_PRE | ['estre_PRE'] | |
jusque_PRE | ['jesque_PRE'] |
Nous avons entraîné un modèle RNN pour l’annotation en POS et la lemmatisation afin de renseigner les formes manquantes (OFrLex) de manière contextualisée dans le corpus Profiterole. Cela permet de renseigner les formes inconnues pour les lexiques utilisés précédemment et, notamment, de les renseigner dans leur contexte d’apparition. Aussi, de comparer les étiquettes et les lemmes fournis par les ressources lexicales avec ceux appris par le modèle.
-
NLP Pie: Outil de lemmatisation et d'annotation morphosyntaxique conçu pour les langues historiques et des langues à forte variation.
-
Corpus Profiterole- Tokens de chaque texte: Ils font partie du découpage Train/Dev/Test (fichiers utilisés à l'entraînement, dévelopment et test du modèle).
Utiliser le notebook pour charger les textes utilisés et récupérer les prédictions.
On peut sélectionner les donées fournis par défault dans le dictionnaire:
## Download traning/dev/test data
!pip install wget
import wget
urls= {'train_data':'https://sharedocs.huma-num.fr/wl/?id=LVfEryNatUmIOSrcv79qLt7Vh9xQcP5G&fmode=open',
'dev_data': 'https://sharedocs.huma-num.fr/wl/?id=NP9ubphyOqW1kHf5E6EKdq6F4USxFLC6&fmode=open',
'test_data': 'https://sharedocs.huma-num.fr/wl/?id=5bNmeXMzMVVOR11huaOx6aiYFVzRsRNf&fmode=open'}
for k, v in urls.items():
print('Downloading', k)
wget.download(v)
Ou les télécharger directement à partir scripts/lemmatisation/train-dev-test-data
Pie entraînera deux modèles, où un pour les POS (pour chaque texte du corpus) et un pour les lemmes (pour chaque texte du corpus). Nous pouvons les fusionner en utilisant le script merge_lemma_pos_pie.py
. Ce script va extraire les formes manquantes annotés dans les prédictions que nous pouvons trouver dans scripts/lemmatisation/lemmatisation_manques_Pie.tsv
L'ensemble des fichiers regroupés (corpus, notebook, modèles, prédictions, résultats) peuvent être également consultes dans le lien suivant.