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: cheÌlidoine'] | cheÌ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.