Dieses Repo enthält den Quellcode und die Daten unseres Papiers: LM-Critic: Sprachmodelle für unbeaufsichtigte grammatikalische Fehlerkorrektur (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) } ,
}Wir haben eine neue Methode zur Verwendung eines vorbereiteten Sprachmodells (z. B. GPT2) entwickelt, um vorherzusagen, ob ein Satz grammatikalisch ist, das wir LM-Critic nennen. Sie können mit diesem LM-Critic spielen, wie in Abschnitt 1 beschrieben. Die Idee ist es, einen Satz als grammatikalisch zu halten, wenn das Sprachmodell ihm eine höhere Wahrscheinlichkeit zuweist als Kandidaten in seiner lokalen Nachbarschaft.
Anschließend verwenden wir das LM-Critic, um Trainingsdaten für die grammatikalische Fehlerkorrektur (GEC) aus nicht markiertem Rohtext unter Verwendung des BIFI-Algorithmus zu generieren. Auf diese Weise können wir GEC -Modelle auf unbeaufsichtigte Weise trainieren. Siehe Abschnitt 2. Unten.
Wie LM-Critic funktioniert

LM-Critic für GEC : Wir verwenden LM-Critic, um GEC-Modelle zu lernen

Führen Sie die folgenden Befehle aus, um eine Conda -Umgebung zu erstellen (unter der Annahme von 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 punktUm den fehlerhaften Torschützen für die GEC -Bewertung zu verwenden, erstellen Sie wie folgt eine andere Conda -Umgebung separat:
conda create -n errant200 python=3.6
conda activate errant200
pip3 install errant==2.0.0
python3 -m spacy download en Der LM-Critic ist in critic/critic.py definiert. Um damit zu spielen, können Sie rennen:
CUDA_VISIBLE_DEVICES=0 python3 critic/critic.pyDies fordert Sie für eine Satzeingabe auf und gibt das Urteil (gut: grammatikalisch, schlecht: ungrammatisch) zusammen mit der Wahrscheinlichkeitsbewertung des Eingangssatzes zurück. Zum Beispiel,
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
Um eine intrinsische Bewertung von LM-Critic in einer Testsuite durchzuführen, rennen Sie:
CUDA_VISIBLE_DEVICES=0 python3 eval_critic/eval_critic.py Sie können die LM-Critic-Funktion ( from critic.critic import gpt2_critic ) für Ihren eigenen Code importieren, wie in diesem Skript.
Ändern Sie das Arbeitsverzeichnis in gec/ . Laden Sie zunächst alle Daten (GEC -Benchmarks und Trainingsdaten) herunter, indem Sie ./download_data.sh .
Hier schulen wir einen ersten Fixierer für synthetische GEC -Daten. Führen Sie die Befehle in src/run-round0.sh aus.
data/round0__synthetic/synthetic_paired_data_9M.json verfügbar Hier verwenden wir den BIFI -Algorithmus und nicht markierte Textdaten, um einen verbesserten Fixierer zu trainieren. Führen Sie die Befehle in src/run-round1.sh aus.
data/round1__BIFI/BIFI_paired_data_9M.json die in Schritt (d) verwendet werdenZur Bewertung verwenden wir fehlerhafte und m^2Scorer. Errant wird in der oben beschriebenen Conda -Umgebung eingerichtet (Errant200) und M^2Scorer wird im Download -Skript eingerichtet.