该回购提供了我们论文的源代码和数据:LM-Critic:无监督语法误差校正的语言模型(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) } ,
}我们开发了一种新方法,使用验证的语言模型(例如GPT2)来预测句子是否是语法,我们称之为LM-Critic 。您可以按照下面的第1节中所述使用此LM-Critic。如果语言模型比本地社区中的候选人分配了更高的概率,那么想法是将句子视为语法。
然后,我们使用LM-Critic使用BIFI算法从未标记的原始文本生成训练数据,以进行语法误差校正(GEC)。这使我们能够以无监督的方式训练GEC模型。请参阅下面的第2节。
LM-Critic的工作原理

GEC的LM-Critic :我们使用LM-Critic学习GEC模型

运行以下命令来创建CONDA环境(假设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 punkt要使用错误的得分手进行GEC评估,请分别创建另一个CONDA环境,如下:
conda create -n errant200 python=3.6
conda activate errant200
pip3 install errant==2.0.0
python3 -m spacy download en LM-Critic在critic/critic.py中定义。要玩它,您可以运行:
CUDA_VISIBLE_DEVICES=0 python3 critic/critic.py这将提示您获取句子输入,并返回判断(好:语法,坏:不语法)以及输入句子的概率分数。例如,
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
要在测试套件上运行LM-Critic的内在评估,请运行:
CUDA_VISIBLE_DEVICES=0 python3 eval_critic/eval_critic.py您可以像本脚本中所做的那样,导入您自己的代码的LM-Critic函数( from critic.critic import gpt2_critic )。
将工作目录更改为gec/ 。首先,通过运行./download_data.sh下载所有数据(GEC基准和培训数据)。
在这里,我们在合成GEC数据上训练初始修复程序。在src/run-round0.sh中运行命令。
data/round0__synthetic/synthetic_paired_data_9M.json上获得。 在这里,我们使用BIFI算法和未标记的文本数据来训练改进的修复程序。在src/run-round1.sh中运行命令。
data/round1__BIFI/BIFI_paired_data_9M.json上找到。为了进行评估,我们使用错误和m^2scorer。错误是在上述CONDA环境中设置的(Errant200),并在下载脚本中设置了M^2Scorer。