一键式文本纠错工具,整合了 BERT、ERNIE 等多种模型,让您立即享受纠错的便利和效果
pycorrector 一键式文本纠错工具,整合了 BERT、MacBERT、ELECTRA、ERNIE 等多种模型,让您立即享受纠错的便利和效果
pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正,python3 开发。实现了 Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer 等多种模型的文本纠错,并在 SigHAN 数据集评估各模型的效果。
1.中文文本纠错任务,常见错误类型:
当然,针对不同业务场景,这些问题并不一定全部存在,比如拼音输入法、语音识别校对关注音似错误;五笔输入法、OCR 校对关注形似错误,搜索引擎 query 纠错关注所有错误类型。
本项目重点解决其中的"音似、形字、语法、专名错误"等类型。
2.解决方案
2.1 规则的解决思路
依据语言模型检测错别字位置,通过拼音音似特征、笔画五笔编辑距离特征及语言模型困惑度特征纠正错别字。
中文纠错分为两步走,第一步是错误检测,第二步是错误纠正;
错误检测部分先通过结巴中文分词器切词,由于句子中含有错别字,所以切词结果往往会有切分错误的情况,这样从字粒度和词粒度两方面检测错误, 整合这两种粒度的疑似错误结果,形成疑似错误位置候选集;
错误纠正部分,是遍历所有的疑似错误位置,并使用音似、形似词典替换错误位置的词,然后通过语言模型计算句子困惑度,对所有候选集结果比较并排序,得到最优纠正词。
2.2 深度模型的解决思路
端到端的深度模型可以避免人工提取特征,减少人工工作量,RNN 序列模型对文本任务拟合能力强,RNN Attn 在英文文本纠错比赛中取得第一名成绩,证明应用效果不错;
CRF 会计算全局最优输出节点的条件概率,对句子中特定错误类型的检测,会根据整句话判定该错误,阿里参赛 2016 中文语法纠错任务并取得第一名,证明应用效果不错;
Seq2Seq 模型是使用 Encoder-Decoder 结构解决序列转换问题,目前在序列转换任务中(如机器翻译、对话生成、文本摘要、图像描述)使用最广泛、效果最好的模型之一;
BERT/ELECTRA/ERNIE/MacBERT 等预训练模型强大的语言表征能力,对 NLP 届带来翻天覆地的改变,海量的训练数据拟合的语言模型效果无与伦比,基于其 MASK 掩码的特征,可以简单改造预训练模型用于纠错,加上 fine-tune,效果轻松达到最优。
PS:
2.2 模型推荐
Kenlm模型:本项目基于 Kenlm 统计语言模型工具训练了中文 NGram 语言模型,结合规则方法、混淆集可以纠正中文拼写错误,方法速度快,扩展性强,效果一般
MacBERT模型【推荐】:本项目基于 PyTorch 实现了用于中文文本纠错的 MacBERT4CSC 模型,模型加入了错误检测和纠正网络,适配中文拼写纠错任务,效果好
Seq2Seq模型:本项目基于 PyTorch 实现了用于中文文本纠错的 Seq2Seq 模型、ConvSeq2Seq 模型,其中 ConvSeq2Seq 在 NLPCC-2018 的中文语法纠错比赛中,使用单模型并取得第三名,可以并行训练,模型收敛快,效果一般
T5模型:本项目基于 PyTorch 实现了用于中文文本纠错的 T5 模型,使用 Langboat/mengzi-t5-base 的预训练模型 fine-tune 中文纠错数据集,模型改造的潜力较大,效果好
BERT模型:本项目基于 PyTorch 实现了基于原生 BERT 的 fill-mask 能力进行纠正错字的方法,效果差
ELECTRA模型:本项目基于 PyTorch 实现了基于原生 ELECTRA 的 fill-mask 能力进行纠正错字的方法,效果差
ERNIE_CSC模型:本项目基于 PaddlePaddle 实现了用于中文文本纠错的 ERNIE_CSC 模型,模型在 ERNIE-1.0 上 fine-tune,模型结构适配了中文拼写纠错任务,效果好
DeepContext模型:本项目基于 PyTorch 实现了用于文本纠错的 DeepContext 模型,该模型结构参考 Stanford University 的 NLC 模型,2014 英文纠错比赛得第一名,效果一般
Transformer模型:本项目基于 PyTorch 的 fairseq 库调研了 Transformer 模型用于中文文本纠错,效果一般
思考
规则的方法,在词粒度的错误召回还不错,但错误纠正的准确率还有待提高,更多优质的纠错集及纠错词库会有提升,我更希望算法模型上有更大的突破。
现在的文本错误不再局限于字词粒度上的拼写错误,需要提高中文语法错误检测(CGED, Chinese Grammar Error Diagnosis)及纠正能力,列在 TODO 中,后续调研。
3.Demo 演示
Official Demo: https://www.mulanai.com/product/corrector/
HuggingFace Demo: https://huggingface.co/spaces/shibing624/pycorrector
run example: examples/gradio_demo.py to see the demo:
4.模型评估(sighan15 评估集)
提供评估脚本examples/evaluate_models.py:
使用 sighan15 评估集:SIGHAN2015 的测试集pycorrector/data/cn/sighan_2015/test.tsv,已经转为简体中文。
评估标准:纠错准召率,采用严格句子粒度(Sentence Level)计算方式,把模型纠正之后的与正确句子完成相同的视为正确,否则为错。
评估结果评估数据集:SIGHAN2015 测试集
GPU:Tesla V100,显存 32 GB
结论
中文拼写纠错模型效果最好的是 MacBert-CSC,模型名称是 shibing624/macbert4csc-base-chinese,huggingface model:shibing624/macbert4csc-base-chinese
中文语法纠错模型效果最好的是 BART-CSC,模型名称是 shibing624/bart4csc-base-chinese,huggingface model:shibing624/bart4csc-base-chinese
最具潜力的模型是 Mengzi-T5-CSC,模型名称是 shibing624/mengzi-t5-base-chinese-correction,huggingface model:shibing624/mengzi-t5-base-chinese-correction,未改变模型结构,仅 fine-tune 中文纠错数据集,已经在
SIGHAN 2015
取得接近 SOTA 的效果基于 ChatGLM-6B 的纠错微调模型效果也不错,模型名称是 shibing624/chatglm-6b-csc-zh-lora,huggingface model:shibing624/chatglm-6b-csc-zh-lora,大模型不仅能改错还能润色句子,但是模型太大,推理速度慢
5.使用指南
or
通过以上两种方法的任何一种完成安装都可以。如果不想安装依赖包,直接使用 docker 拉取安装好的部署环境即可。
安装依赖
docker 使用
后续调用 python 使用即可,该镜像已经安装好 kenlm、pycorrector 等包,具体参见Dockerfile。
使用示例:
kenlm 安装
其他库包安装
6.应用场景
6.1 文本纠错
example: examples/base_demo.py
output:
规则方法默认会从路径
~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm
加载 kenlm 语言模型文件,如果检测没有该文件,则程序会自动联网下载。当然也可以手动下载模型文件(2.8G)并放置于该位置。
6.2 错误检测
example: examples/detect_demo.py
output:
返回类型是
list
,[error_word, begin_pos, end_pos, error_type]
,pos
索引位置以 0 开始。
6.3 成语、专名纠错
example: examples/proper_correct_demo.py
output:
6.4 自定义混淆集
通过加载自定义混淆集,支持用户纠正已知的错误,包括两方面功能:1)【提升准确率】误杀加白;2)【提升召回率】补充召回。
example: examples/use_custom_confusion.py
output:
其中
./my_custom_confusion.txt
的内容格式如下,以空格间隔:
混淆集功能在
correct
方法中生效;set_custom_confusion_dict
方法的path
参数为用户自定义混淆集文件路径(str)或混淆集字典(dict)。
6.5 自定义语言模型
默认提供下载并使用的 kenlm 语言模型zh_giga.no_cna_cmn.prune01244.klm
文件是 2.8G,内存小的电脑使用pycorrector
程序可能会吃力些。
支持用户加载自己训练的 kenlm 语言模型,或使用 2014 版人民日报数据训练的模型,模型小(140M),准确率稍低,模型下载地址:people2014corpus_chars.klm(密码o5e9)。
example:examples/load_custom_language_model.py
output:
6.6 英文拼写纠错
支持英文单词级别的拼写错误纠正。
example:examples/en_correct_demo.py
output:
6.7 中文简繁互换
支持中文繁体到简体的转换,和简体到繁体的转换。
example:examples/traditional_simplified_chinese_demo.py
output:
6.8 命令行模式
支持批量文本纠错
case:
输入文件:
input.txt
;输出文件:out.txt
;关闭字粒度纠错;打印详细纠错信息;纠错结果以\t
间隔
本项目的初衷之一是比对、共享各种文本纠错方法,抛砖引玉的作用,如果对大家在文本纠错任务上有一点小小的启发就是我莫大的荣幸了。
主要使用了多种深度模型应用于文本纠错任务,分别是前面模型
小节介绍的macbert、seq2seq、bert、electra、transformer、ernie-csc、T5,各模型方法内置于pycorrector
文件夹下,有README.md
详细指导,各模型可独立运行,相互之间无依赖。
安装依赖
8. 模型推荐
各模型均可独立的预处理数据、训练、预测。
8.1 MacBert4csc 模型[推荐]
基于 MacBERT 改变网络结构的中文拼写纠错模型,模型已经开源在 HuggingFace Models:https://huggingface.co/shibing624/macbert4csc-base-chinese
模型网络结构:
本项目是 MacBERT 改变网络结构的中文文本纠错模型,可支持 BERT 类模型为 backbone。
在原生 BERT 模型上进行了魔改,追加了一个全连接层作为错误检测即 detection ,MacBERT4CSC 训练时用 detection 层和 correction 层的 loss 加权得到最终的 loss。预测时用 BERT MLM 的 correction 权重即可。
详细教程参考pycorrector/macbert/README.md
example:examples/macbert_demo.py
8.1.1 使用 pycorrector 调用纠错:
output:
8.1.2 使用原生 transformers 库调用纠错:
output:
模型文件:
8.2 ErnieCSC 模型
基于 ERNIE 的中文拼写纠错模型,模型已经开源在PaddleNLP的模型库中https://bj.bcebos.com/paddlenlp/taskflow/text_correction/csc-ernie-1.0/csc-ernie-1.0.pdparams。
模型网络结构:
详细教程参考pycorrector/ernie_csc/README.md
example:examples/ernie_csc_demo.py
使用 pycorrector 调用纠错:
output:
使用 PaddleNLP 库调用纠错:
可以使用 PaddleNLP 提供的 Taskflow 工具来对输入的文本进行一键纠错,具体使用方法如下:
output:
8.3 Bart 模型
output:
如果需要训练 Bart 模型,请参考 https://github.com/shibing624/textgen/blob/main/examples/seq2seq/training_bartseq2seq_zh_demo.py
Release models
基于 SIGHAN+Wang271K 中文纠错数据集训练的 Bart 模型,已经 release 到 HuggingFace Models:
BART 模型:模型已经开源在 HuggingFace Models:https://huggingface.co/shibing624/bart4csc-base-chinese
#3 8.4 ConvSeq2Seq 模型pycorrector/seq2seq 模型使用示例:
训练 data example:
convseq2seq
训练 sighan 数据集(2104 条样本),200 个 epoch,单卡 P40GPU 训练耗时:3 分钟。
预测
output:
如果训练数据太少(不足万条),深度模型拟合不足,会出现预测结果全为
unk
的情况,解决方法:增大训练样本集,使用下方提供的纠错熟语料(nlpcc2018+hsk,130 万对句子)试试。深度模型训练耗时长,有 GPU 尽量用 GPU,加速训练,节省时间。
Release models
基于 SIGHAN2015 数据集训练的 convseq2seq 模型,已经 release 到 github:
convseq2seq model url: https://github.com/shibing624/pycorrector/releases/download/0.4.5/convseq2seq_correction.tar.gz
9.数据集
9.1 开源数据集
说明:
SIGHAN+Wang271K 中文纠错数据集(27 万条),是通过原始 SIGHAN13、14、15 年数据集和 Wang271K 数据集格式转化后得到,json 格式,带错误字符位置信息,SIGHAN 为 test.json,macbert4csc 模型训练可以直接用该数据集复现 paper 准召结果,详见pycorrector/macbert/README.md。
NLPCC 2018 GEC 官方数据集NLPCC2018-GEC,训练集trainingdata[解压后 114.5MB],该数据格式是原始文本,未做切词处理。
汉语水平考试(HSK)和 lang8 原始平行语料[HSK+Lang8]百度网盘(密码n31j),该数据集已经切词,可用作数据扩增。
NLPCC 2018 + HSK + CGED16、17、18 的数据,经过以字切分,繁体转简体,打乱数据顺序的预处理后,生成用于纠错的熟语料(nlpcc2018+hsk),百度网盘(密码:m6fg) [130 万对句子,215MB]
SIGHAN+Wang271K 中文纠错数据集,数据格式:
字段解释:
id:唯一标识符,无意义
original_text: 原始错误文本
wrong_ids: 错误字的位置,从 0 开始
correct_text: 纠正后的文本
9.2 自有数据集
可以使用自己数据集训练纠错模型,把自己数据集标注好,保存为跟训练样本集一样的 json 格式,然后加载数据训练模型即可。
已有大量业务相关错误样本,主要标注错误位置(wrong_ids)和纠错后的句子(correct_text)
没有现成的错误样本,可以写脚本生成错误样本(original_text),根据音似、形似等特征把正确句子的指定位置(wrong_ids)字符改为错字,附上第三方同音字生成脚本同音词替换
10.总结
语言模型对于纠错步骤至关重要,当前默认使用的是从千兆中文文本训练的中文语言模型zh_giga.no_cna_cmn.prune01244.klm(2.8G),提供人民日报 2014 版语料训练得到的轻量版语言模型people2014corpus_chars.klm(密码o5e9)。
大家可以用中文维基(繁体转简体,pycorrector.utils.text_utils 下有此功能)等语料数据训练通用的语言模型,或者也可以用专业领域语料训练更专用的语言模型。更适用的语言模型,对于纠错效果会有比较好的提升。
kenlm 语言模型训练工具的使用,请见博客:http://blog.csdn.net/mingzai624/article/details/79560063
附上训练语料<人民日报 2014 版熟语料>,包括: 1)标准人工切词及词性数据 people2014.tar.gz, 2)未切词文本数据 people2014_words.txt,3)kenlm 训练字粒度语言模型文件及其二进制文件 people2014corpus_chars.arps/klm, 4)kenlm 词粒度语言模型文件及其二进制文件 people2014corpus_words.arps/klm。
Todo
[x] 优化形似字字典,提高形似字纠错准确率
[x] 整理中文纠错训练数据,使用 seq2seq 做深度中文纠错模型
[x] 添加中文语法错误检测及纠正能力
[x] 规则方法添加用户自定义纠错集,并将其纠错优先度调为最高
[x] seq2seq_attention 添加 dropout,减少过拟合
[x] 在 seq2seq 模型框架上,新增 Pointer-generator network、Beam search、Unknown words replacement、Coverage mechanism 等特性
[x] 更新 bert 的 fine-tuned 使用 wiki,适配 transformers 2.10.0 库
[x] 升级代码,兼容 TensorFlow 2.0 库
[x] 升级 bert 纠错逻辑,提升基于 mask 的纠错效果
[x] 新增基于 electra 模型的纠错逻辑,参数更小,预测更快
[x] 新增专用于纠错任务深度模型,使用 bert/ernie 预训练模型,加入文本音似、形似特征。
Reference
Chinese Spelling Checker Based on Statistical Machine Translation[Chiu, 2013]
Chinese Word Spelling Correction Based on Rule Induction[yeh, 2014]
Neural Language Correction with Character-Based Attention[Ziang Xie, 2016]
Chinese Spelling Check System Based on Tri-gram Model[Qiang Huang, 2014]
Neural Abstractive Text Summarization with Sequence-to-Sequence Models[Tian Shi, 2018]
A Sequence to Sequence Learning for Chinese Grammatical Error Correction[Hongkai Ren, 2018]
ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators
Revisiting Pre-trained Models for Chinese Natural Language Processing
Ruiqing Zhang, Chao Pang et al. "Correcting Chinese Spelling Errors with Phonetic Pre-training", ACL, 2021
DingminWang et al. "A Hybrid Approach to Automatic Corpus Generation for Chinese Spelling Check", EMNLP, 2018
参考链接:https://github.com/shibing624/pycorrector
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。
版权声明: 本文为 InfoQ 作者【汀丶人工智能】的原创文章。
原文链接:【http://xie.infoq.cn/article/204377864c4504499ed9020be】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论