Ce dépôt fournit le code source et les données de notre article: LM-Critique: Modèles de langue pour la correction d'erreur grammaticale non supervisée (EMNLP 2021).
@InProceedings { yasunaga2021language ,
author = { Michihiro Yasunaga and Jure Leskovec and Percy Liang } ,
title = { LM-Critic: Language Models for Unsupervised Grammatical Error Correction } ,
year = { 2021 } ,
booktitle = { Empirical Methods in Natural Language Processing (EMNLP) } ,
}Nous avons développé une nouvelle méthode pour utiliser un modèle de langue pré-étendue (par exemple GPT2) pour prédire si une phrase est grammaticale, que nous appelons LM-Critique . Vous pouvez jouer avec ce LM-Critique comme décrit dans la section 1. Ci-dessous. L'idée est de considérer qu'une phrase est grammaticale si le modèle de langue lui attribue une probabilité plus élevée que les candidats dans son quartier local.
Nous utilisons ensuite le LM-Critique pour générer des données de formation pour la correction d'erreur grammaticale (GEC) à partir de texte brut non étiqueté, en utilisant l'algorithme BIFI. Cela nous permet de former des modèles GEC de manière non supervisée. Voir la section 2. Ci-dessous.
Comment fonctionne LM-Critic

LM-Critique pour GEC : Nous utilisons LM-Critic pour apprendre les modèles GEC

Exécutez les commandes suivantes pour créer un environnement conda (en supposant CUDA10.1):
conda create -n lm-critic python=3.8
conda activate lm-critic
pip install torch==1.6.0 torchvision==0.7.0
pip install transformers==4.3.3 datasets==1.3.0 absl-py rouge-score
pip install nltk wandb editdistance spacy==3.0.5
python3 -m nltk.downloader punktPour utiliser le marqueur errant pour l'évaluation GEC, créez un autre environnement Conda séparément, comme suit:
conda create -n errant200 python=3.6
conda activate errant200
pip3 install errant==2.0.0
python3 -m spacy download en Le LM-Critique est défini dans critic/critic.py . Pour jouer avec, vous pouvez courir:
CUDA_VISIBLE_DEVICES=0 python3 critic/critic.pyCela vous incitera à une apport de phrase et renvoie le jugement (bon: grammatical, mauvais: non grammatical) avec le score de probabilité de la phrase d'entrée. Par exemple,
Enter a sentence: I like apple.
Bad! Your sentence log(p) = -22.333
Neighbor sentence with highest log(p): I like apples. (= -19.570)
Enter a sentence: I like apples.
Good! Your sentence log(p) = -19.570
Pour exécuter l'évaluation intrinsèque de LM-Critique sur une suite de test, exécutez:
CUDA_VISIBLE_DEVICES=0 python3 eval_critic/eval_critic.py Vous pouvez importer la fonction LM-Critique ( from critic.critic import gpt2_critic ) pour votre propre code comme fait dans ce script.
Modifiez le répertoire de travail en gec/ . Tout d'abord, téléchargez toutes les données (repères GEC et données de formation) en exécutant ./download_data.sh .
Ici, nous formons un fixateur initial sur les données GEC synthétiques. Exécutez les commandes dans src/run-round0.sh .
data/round0__synthetic/synthetic_paired_data_9M.json Ici, nous utilisons l'algorithme BIFI et les données de texte non marquées pour former un fixateur amélioré. Exécutez les commandes dans src/run-round1.sh .
data/round1__BIFI/BIFI_paired_data_9M.jsonPour l'évaluation, nous utilisons Errant et m ^ 2Scorer. Errant est configuré dans l'environnement conda décrit ci-dessus (Errant200) et M ^ 2Scorer est configuré dans le script de téléchargement.