该仓库为CCL2022-CLTC(多维度汉语学习者文本纠错比赛)赛道三的第一名解决方案,队伍名称为kk。
比赛详情见https://github.com/blcuicall/CCL2022-CLTC
模型及过程处理数据文件可参考https://drive.google.com/drive/folders/1M0san4HctiKVeuVRHcSH3vGGvaPgkWNp?usp=sharing
- 训练推理阶段:requirements_train.txt
- 后处理及模型融合阶段:requirements_postedit.txt
将预训练模型下载到服务器上,并更新各种可执行文件夹中的BART_DIR变量:
- bart-large-chinese: https://huggingface.co/fnlp/bart-large-chinese
训练和验证数据需分别处理成 .src
和 .tgt
两个文件并放在 data/raw
目录下,目录结构如下。
注意:由于参赛过程中使用了两阶段训练,所以有多份训练集和验证集,详情可见技术评测报告。
- 第一阶段训练集是官方训练集,第一阶段验证集是官方验证集。
- 第二阶段以9:1的比例分割官方验证集,分别作为第二阶段训练集和验证集。
- 两个训练阶段都以平均F0.5作为模型挑选标准。
data
└── raw
├── train_lang8.src #第一阶段训练集和验证集
├── train_lang8.tgt
├── valid_lang8.src
├── valid_lang8.tgt
├── train_vminimal.src #第二阶段训练集和验证集1(使用minimal维度语料)
├── train_vminimal.tgt
├── valid_vminimal.src
├── valid_vminimal.tgt
├── train_vfluency.src #第二阶段训练集和验证集2(使用fluency维度语料)
├── train_vfluency.tgt
├── valid_vfluency.src
├── valid_vfluency.tgt
├── train_vfluandmin.src #第二阶段训练集和验证集3(混合minimal维度和fluency维度语料)
├── train_vfluandmin.tgt
├── valid_vfluandmin.src
└── valid_vfluandmin.tgt
├── bpe
├── lang8
├── vminimal
├── vfluency
└── vfluandmin
首先参照bpe_kk.sh
的示例进行分词,将data/raw/
的文件中全部分词并生成对应文件。
其次参考process_kk.sh
的示例进行二值化处理,将data/bpe/
全部处理并放置到对应文件夹中。
每个文件夹的目录结构如下,以data/lang8/
为例:
data
├── raw
├── bpe
└── lang8
├── dict.src.txt
├── dict.tgt.txt
├── train.src-tgt.src.bin
├── train.src-tgt.src.idx
├── train.src-tgt.tgt.bin
├── train.src-tgt.tgt.idx
├── valid.src-tgt.src.bin
├── valid.src-tgt.src.idx
├── valid.src-tgt.tgt.bin
├── valid.src-tgt.tgt.idx
└── preprocess.log
- 请注意
train.py
中line639、line748、line754、line755
的代码注释。 - 第一阶段训练使用
train.sh
脚本。 - 本阶段使用了dynamic mask,所以第一阶段训练所能得到的最优模型具有较大随机性。
- 该阶段必须注释
train.py
中line388-line412
,关闭动态加噪。 - 请注意
train.py
中line639、line748、line754、line755
的代码注释。 - 第二阶段训练同样使用
train.sh
脚本,注意更改DATA_DIR、MODEL_NAME,并添加finetune参数。
- 请注意
interactive.py
中line208、line209、line211、line302、line303、line304
的代码注释。 - 推理使用
interactive.sh
脚本,请修改path参数(sh文件中的DATA_SET是个无效参数,可以无视)。 - 另外,seq2seq模型天然存在unk问题,即使经过文件拼接处理,interactive完成后也只能得到src(无unk)-tgt(有unk)的para文件。
为彻底去除unk问题,需要使用ChERRANT1计算编辑距离,并将所有包括unk的编辑操作忽略,使用详情可参考文献。
在本次比赛中,F0.5作为最终评价指标放大了Precision的比重,所以在做模型融合时,使用了三个非常相似的模型(挑选出第一阶段结束后性能最好的模型,第二阶段分别用minimal验证集、minimal验证集且更换随机种子、minimal+fluency验证集训练得到三个模型),将三个模型的编辑操作提取出来,只有三个模型同时出现该编辑操作时,编辑操作才会被最终采纳。 具体步骤如下:
- 假设目前得到六个(3*2)模型,并通过六个模型得到六份预测结果
Stage2_Min_bestminimal Stage2_Min_bestfluency
Stage2_Min84_bestminimal Stage2_Min84_bestfluency
Stage2_FAM_bestminimal Stage2_FAM_bestfluency
Stage2_Min_minimal.tgtunk.para Stage2_Min_fluency.tgtunk.para
Stage2_Min84_minimal.tgtunk.para Stage2_Min84_fluency.tgtunk.para
Stage2_FAM_minimal.tgtunk.para Stage2_FAM_fluency.tgtunk.para
- 参照
/chERRANT/para2m2.sh
将六份para文件转换为六份m2文件 - 参照
/chERRANT/ensemble.sh
对单模和多模情况分开处理 - 参照
/chERRANT/m22para.sh
将m2文件转换为最终提交的para文件
avg_F0.5 | minimal_F0.5 | minimal_recall | minimal_precision | fluency_F0.5 | fluency_recall | fluency_precision | |
---|---|---|---|---|---|---|---|
Stage2_FAM | 55.68 | 70.84 | 54.61 | 76.53 | 40.52 | 24.26 | 48.67 |