Package: pycorrector
🇨🇳中文|🌐English|📖文档/Docs|🤖模型/Modelspycorrector: useful python text correction toolkitpycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正，python3开发。pycorrector实现了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型的文本纠错，并在SigHAN数据集评估各模型的效果。GuideFeaturesEvaluationUsageDatasetContactReferencesIntroduction中文文本纠错任务，常见错误类型：当然，针对不同业务场景，这些问题并不一定全部存在，比如拼音输入法、语音识别校对关注音似错误；五笔输入法、OCR校对关注形似错误，
搜索引擎query纠错关注所有错误类型。本项目重点解决其中的"音似、形字、语法、专名错误"等类型。News[2023/11/07] v1.0.0版本：新增了ChatGLM3/LLaMA2等GPT模型用于中文文本纠错，发布了基于ChatGLM3-6B的shibing624/chatglm3-6b-csc-chinese-lora拼写和语法纠错模型；重写了DeepContext、ConvSeq2Seq、T5等模型的实现。详见Release-v1.0.0FeaturesKenlm模型：本项目基于Kenlm统计语言模型工具训练了中文NGram语言模型，结合规则方法、混淆集可以纠正中文拼写错误，方法速度快，扩展性强，效果一般DeepContext模型：本项目基于PyTorch实现了用于文本纠错的DeepContext模型，该模型结构参考Stanford University的NLC模型，2014英文纠错比赛得第一名，效果一般Seq2Seq模型：本项目基于PyTorch实现了用于中文文本纠错的ConvSeq2Seq模型，该模型在NLPCC-2018的中文语法纠错比赛中，使用单模型并取得第三名，可以并行训练，模型收敛快，效果一般T5模型：本项目基于PyTorch实现了用于中文文本纠错的T5模型，使用Langboat/mengzi-t5-base的预训练模型finetune中文纠错数据集，模型改造的潜力较大，效果好ERNIE_CSC模型：本项目基于PaddlePaddle实现了用于中文文本纠错的ERNIE_CSC模型，模型在ERNIE-1.0上finetune，模型结构适配了中文拼写纠错任务，效果好MacBERT模型【推荐】：本项目基于PyTorch实现了用于中文文本纠错的MacBERT4CSC模型，模型加入了错误检测和纠正网络，适配中文拼写纠错任务，效果好GPT模型：本项目基于PyTorch实现了用于中文文本纠错的ChatGLM/LLaMA模型，模型在中文CSC和语法纠错数据集上finetune，适配中文文本纠错任务，效果好延展阅读：中文文本纠错实践和原理解读DemoOfficial demo:https://www.mulanai.com/product/corrector/Colab online demo:HuggingFace demo:https://huggingface.co/spaces/shibing624/pycorrectorrun example:examples/macbert/gradio_demo.pyto see the demo:pythonexamples/macbert/gradio_demo.pyEvaluation提供评估脚本examples/evaluate_models/evaluate_models.py：使用sighan15评估集：SIGHAN2015的测试集pycorrector/data/sighan2015_test.tsv，已经转为简体中文评估标准：纠错准召率，采用严格句子粒度（Sentence Level）计算方式，把模型纠正之后的与正确句子完成相同的视为正确，否则为错评估结果评估数据集：SIGHAN2015测试集GPU：Tesla V100，显存 32 GBModel NameModel LinkBase ModelGPUPrecisionRecallF1QPSKenlm-CSCshibing624/chinese-kenlm-klmkenlmCPU0.68600.15290.25009BART-CSCshibing624/bart4csc-base-chinesefnlp/bart-base-chineseGPU0.69840.63540.665458Mengzi-T5-CSCshibing624/mengzi-t5-base-chinese-correctionmengzi-t5-baseGPU0.83210.63900.7229214MacBERT-CSCshibing624/macbert4csc-base-chinesehfl/chinese-macbert-baseGPU0.82540.73110.7754224ChatGLM3-6B-CSCshibing624/chatglm3-6b-csc-chinese-loraTHUDM/chatglm3-6bGPU0.55740.49170.52254结论中文拼写纠错模型效果最好的是MacBert-CSC，模型名称是shibing624/macbert4csc-base-chinese，huggingface model：https://huggingface.co/shibing624/macbert4csc-base-chinese中文语法纠错模型效果最好的是Mengzi-T5-CSC，模型名称是shibing624/mengzi-t5-base-chinese-correction，huggingface model：https://huggingface.co/shibing624/mengzi-t5-base-chinese-correctionInstallpipinstall-Upycorrectororpipinstall-rrequirements.txt

gitclonehttps://github.com/shibing624/pycorrector.gitcdpycorrector
pipinstall--no-deps.通过以上两种方法的任何一种完成安装都可以。如果不想安装依赖包，可以拉docker环境。docker使用dockerrun-it-v~/.pycorrector:/root/.pycorrectorshibing624/pycorrector:0.0.2后续调用python使用即可，该镜像已经安装好kenlm、pycorrector等包，具体参见Dockerfile。使用示例：Usage本项目的初衷之一是比对、调研各种中文文本纠错方法，抛砖引玉。项目实现了kenlm、macbert、seq2seq、 ernie_csc、T5、deepcontext、LLaMA等模型应用于文本纠错任务，各模型均可基于已经训练好的纠错模型快速预测，也可使用自有数据训练、预测。kenlm模型（统计模型）中文拼写纠错example:examples/kenlm/demo.pyfrompycorrectorimportCorrectorm=Corrector()print(m.correct_batch(['少先队员因该为老人让坐','你找到你最喜欢的工作，我也很高心。']))output:[{'source':'少先队员因该为老人让坐','target':'少先队员应该为老人让座','errors':[('因该','应该',4),('坐','座',10)]}{'source':'你找到你最喜欢的工作，我也很高心。','target':'你找到你最喜欢的工作，我也很高兴。','errors':[('心','兴',15)]}]Corrector()类是kenlm统计模型的纠错方法实现，默认会从路径~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm加载kenlm语言模型文件，如果检测没有该文件，
则程序会自动联网下载。当然也可以手动下载模型文件(2.8G)并放置于该位置返回值:correct方法返回dict，{'source': '原句子', 'target': '纠正后的句子', 'errors': [('错误词', '正确词', '错误位置'), ...]}，correct_batch方法返回包含多个dict的list错误检测example:examples/kenlm/detect_demo.pyfrompycorrectorimportCorrectorm=Corrector()idx_errors=m.detect('少先队员因该为老人让坐')print(idx_errors)output:[['因该', 4, 6, 'word'], ['坐', 10, 11, 'char']]返回值：list,[error_word, begin_pos, end_pos, error_type]，pos索引位置以0开始。成语、专名纠错example:examples/kenlm/use_custom_proper.pyfrompycorrectorimportCorrectorm=Corrector(proper_name_path='./my_custom_proper.txt')x=['报应接中迩来','这块名表带带相传',]foriinx:print(i,' -> ',m.correct(i))output:报应接中迩来  ->  {'source': '报应接踵而来', 'target': '报应接踵而来', 'errors': [('接中迩来', '接踵而来', 2)]}
这块名表带带相传  ->  {'source': '这块名表代代相传', 'target': '这块名表代代相传', 'errors': [('带带相传', '代代相传', 4)]}自定义混淆集通过加载自定义混淆集，支持用户纠正已知的错误，包括两方面功能：1）【提升准确率】误杀加白；2）【提升召回率】补充召回。example:examples/kenlm/use_custom_confusion.pyfrompycorrectorimportCorrectorerror_sentences=['买iphonex，要多少钱','共同实际控制人萧华、霍荣铨、张旗康',]m=Corrector()print(m.correct_batch(error_sentences))print('*'*42)m=Corrector(custom_confusion_path_or_dict='./my_custom_confusion.txt')print(m.correct_batch(error_sentences))output:('买iphonex，要多少钱', [])   # "iphonex"漏召，应该是"iphoneX"
('共同实际控制人萧华、霍荣铨、张启康', [('张旗康', '张启康', 14)]) # "张启康"误杀，应该不用纠
*****************************************************
('买iphonex，要多少钱', [('iphonex', 'iphoneX', 1)])
('共同实际控制人萧华、霍荣铨、张旗康', [])其中./my_custom_confusion.txt的内容格式如下，以空格间隔：iPhone差 iPhoneX
张旗康 张旗康自定义混淆集ConfusionCorrector类，除了上面演示的和Corrector类一起使用，还可以和MacBertCorrector一起使用，也可以独立使用。示例代码examples/macbert/model_correction_pipeline_demo.py自定义语言模型默认提供下载并使用的kenlm语言模型zh_giga.no_cna_cmn.prune01244.klm文件是2.8G，内存小的电脑使用pycorrector程序可能会吃力些。支持用户加载自己训练的kenlm语言模型，或使用2014版人民日报数据训练的模型，模型小（140M），准确率稍低，模型下载地址：shibing624/chinese-kenlm-klm|people2014corpus_chars.klm(密码o5e9)。example：examples/kenlm/load_custom_language_model.pyfrompycorrectorimportCorrectormodel=Corrector(language_model_path='people2014corpus_chars.klm')print(model.correct('少先队员因该为老人让坐'))英文拼写纠错支持英文单词级别的拼写错误纠正。example：examples/kenlm/en_correct_demo.pyfrompycorrectorimportEnSpellCorrectorm=EnSpellCorrector()sent="what happending? how to speling it, can you gorrect it?"print(m.correct(sent))output:{'source': 'what happending? how to speling it, can you gorrect it?', 'target': 'what happening? how to spelling it, can you correct it?', 'errors': [('happending', 'happening', 5), ('speling', 'spelling', 24), ('gorrect', 'correct', 44)]}中文简繁互换支持中文繁体到简体的转换，和简体到繁体的转换。example：examples/kenlm/traditional_simplified_chinese_demo.pyimportpycorrectortraditional_sentence='憂郁的臺灣烏龜'simplified_sentence=pycorrector.traditional2simplified(traditional_sentence)print(traditional_sentence,'=>',simplified_sentence)simplified_sentence='忧郁的台湾乌龟'traditional_sentence=pycorrector.simplified2traditional(simplified_sentence)print(simplified_sentence,'=>',traditional_sentence)output:憂郁的臺灣烏龜 => 忧郁的台湾乌龟
忧郁的台湾乌龟 => 憂郁的臺灣烏龜命令行模式支持kenlm方法的批量文本纠错python -m pycorrector -h
usage: __main__.py [-h] -o OUTPUT [-n] [-d] input

@description:

positional arguments:
  input                 the input file path, file encode need utf-8.

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        the output file path.
  -n, --no_char         disable char detect mode.
  -d, --detail          print detail infocase：python -m pycorrector input.txt -o out.txt -n -d输入文件：input.txt；输出文件：out.txt；关闭字粒度纠错；打印详细纠错信息；纠错结果以\t间隔MacBert4CSC模型基于MacBERT改变网络结构的中文拼写纠错模型，模型已经开源在HuggingFace Models：https://huggingface.co/shibing624/macbert4csc-base-chinese模型网络结构：本项目是 MacBERT 改变网络结构的中文文本纠错模型，可支持 BERT 类模型为 backbone在原生 BERT 模型上进行了魔改，追加了一个全连接层作为错误检测即detection，
MacBERT4CSC 训练时用 detection 层和 correction 层的 loss 加权得到最终的 loss，预测时用 BERT MLM 的 correction 权重即可详细教程参考examples/macbert/README.mdpycorrector快速预测example：examples/macbert/demo.pyfrompycorrectorimportMacBertCorrectorm=MacBertCorrector("shibing624/macbert4csc-base-chinese")print(m.correct_batch(['今天新情很好','你找到你最喜欢的工作，我也很高心。']))output：{'source':'今天新情很好','target':'今天心情很好','errors':[('新','心',2)]}{'source':'你找到你最喜欢的工作，我也很高心。','target':'你找到你最喜欢的工作，我也很高兴。','errors':[('心','兴',15)]}transformers快速预测见examples/macbert/README.mdT5模型基于T5的中文拼写纠错模型，模型训练详细教程参考examples/t5/README.mdpycorrector快速预测example：examples/t5/demo.pyfrompycorrectorimportT5Correctorm=T5Corrector()print(m.correct_batch(['今天新情很好','你找到你最喜欢的工作，我也很高心。']))output:[{'source': '今天新情很好', 'target': '今天心情很好', 'errors': [('新', '心', 2)]},
{'source': '你找到你最喜欢的工作，我也很高心。', 'target': '你找到你最喜欢的工作，我也很高兴。', 'errors': [('心', '兴', 15)]}]GPT模型基于ChatGLM3、LLaMA、Baichuan、QWen等模型微调训练纠错模型，训练方法见examples/gpt/README.md在ChatGLM3-6B上SFT微调的纠错模型，已经release到HuggingFace Models:https://huggingface.co/shibing624/chatglm3-6b-csc-chinese-lorapycorrector快速预测example:examples/gpt/demo.pyfrompycorrectorimportGptCorrectorm=GptCorrector()print(m.correct_batch(['今天新情很好','你找到你最喜欢的工作，我也很高心。']))output:[{'source':'今天新情很好','target':'今天心情很好','errors':[('新','心',2)]},{'source':'你找到你最喜欢的工作，我也很高心。','target':'你找到你最喜欢的工作，我也很高兴。','errors':[('心','兴',15)]}]ErnieCSC模型基于ERNIE的中文拼写纠错模型，模型已经开源在PaddleNLP。
模型网络结构：详细教程参考examples/ernie_csc/README.mdpycorrector快速预测example：examples/ernie_csc/demo.pyfrompycorrectorimportErnieCscCorrectorif__name__=='__main__':error_sentences=['真麻烦你了。希望你们好好的跳无','少先队员因该为老人让坐',]m=ErnieCscCorrector()batch_res=m.correct_batch(error_sentences)foriinbatch_res:print(i)print()output:{'source': '真麻烦你了。希望你们好好的跳无', 'target': '真麻烦你了。希望你们好好的跳舞', 'errors': [{'position': 14, 'correction': {'无': '舞'}}]}
{'source': '少先队员因该为老人让坐', 'target': '少先队员应该为老人让座', 'errors': [{'position': 4, 'correction': {'因': '应'}}, {'position': 10, 'correction': {'坐': '座'}}]}Bart模型基于SIGHAN+Wang271K中文纠错数据集训练的Bart4CSC模型，已经release到HuggingFace Models:https://huggingface.co/shibing624/bart4csc-base-chinesefromtransformersimportBertTokenizerFastfromtextgenimportBartSeq2SeqModeltokenizer=BertTokenizerFast.from_pretrained('shibing624/bart4csc-base-chinese')model=BartSeq2SeqModel(encoder_type='bart',encoder_decoder_type='bart',encoder_decoder_name='shibing624/bart4csc-base-chinese',tokenizer=tokenizer,args={"max_length":128,"eval_batch_size":128})sentences=["少先队员因该为老人让坐"]print(model.predict(sentences))output:['少先队员应该为老人让座']如果需要训练Bart模型，请参考https://github.com/shibing624/textgen/blob/main/examples/seq2seq/training_bartseq2seq_zh_demo.pyDataset数据集语料下载链接压缩包大小SIGHAN+Wang271K中文纠错数据集SIGHAN+Wang271K(27万条)百度网盘（密码01b9）shibing624/CSC106M原始SIGHAN数据集SIGHAN13 14 15官方csc.html339K原始Wang271K数据集Wang271KAutomatic-Corpus-Generation dimmywang提供93M人民日报2014版语料人民日报2014版飞书（密码cHcu）383MNLPCC 2018 GEC官方数据集NLPCC2018-GEC官方trainingdata114MNLPCC 2018+HSK熟语料nlpcc2018+hsk+CGED百度网盘（密码m6fg）飞书（密码gl9y）215MNLPCC 2018+HSK原始语料HSK+Lang8百度网盘（密码n31j）飞书（密码Q9LH）81M中文纠错比赛数据汇总Chinese Text Correction（CTC）中文纠错汇总数据集（天池）-NLPCC 2023中文语法纠错数据集NLPCC 2023 Sharedtask1Task 1: Chinese Grammatical Error Correction（Training Set）125M说明：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":"B2-4029-3","original_text":"晚间会听到嗓音，白天的时候大家都不会太在意，但是在睡觉的时候这嗓音成为大家的恶梦。","wrong_ids":[5,31],"correct_text":"晚间会听到噪音，白天的时候大家都不会太在意，但是在睡觉的时候这噪音成为大家的恶梦。"}]字段解释：id：唯一标识符，无意义original_text: 原始错误文本wrong_ids： 错误字的位置，从0开始correct_text: 纠正后的文本自有数据集可以使用自己数据集训练纠错模型，把自己数据集标注好，保存为跟训练样本集一样的json格式，然后加载数据训练模型即可。已有大量业务相关错误样本，主要标注错误位置（wrong_ids）和纠错后的句子(correct_text)没有现成的错误样本，可以写脚本生成错误样本（original_text），根据音似、形似等特征把正确句子的指定位置（wrong_ids）字符改为错字，附上
第三方同音字生成脚本同音词替换Language Model什么是语言模型？-wiki语言模型对于纠错步骤至关重要，当前默认使用的是从千兆中文文本训练的中文语言模型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。16GB中英文无监督、平行语料Linly-AI/Chinese-pretraining-dataset524MB中文维基百科语料wikipedia-cn-20230720-filtered尊重版权，传播请注明出处。ContactGithub Issue(建议)：Github discussions：欢迎到讨论区灌水（不会打扰开发者），公开交流纠错技术和问题邮件我：xuming:xuming624@qq.com微信我：加我微信号：xuming624, 进Python-NLP交流群，备注：姓名-公司名-NLPCitation如果你在研究中使用了pycorrector，请按如下格式引用：APA:Xu, M. Pycorrector: Text error correction tool (Version 0.4.2) [Computer software]. https://github.com/shibing624/pycorrectorBibTeX:@misc{Xu_Pycorrector_Text_error,
  title={Pycorrector: Text error correction tool},
  author={Ming Xu},
  year={2023},
  howpublished={\url{https://github.com/shibing624/pycorrector}},}Licensepycorrector 的授权协议为Apache License 2.0，可免费用做商业用途。请在产品说明中附加pycorrector的链接和授权协议。Contribute项目代码还很粗糙，如果大家对代码有所改进，欢迎提交回本项目，在提交之前，注意以下两点：在tests添加相应的单元测试使用python -m pytest来运行所有单元测试，确保所有单测都是通过的之后即可提交PR。References基于文法模型的中文纠错系统Norvig’s spelling correctorChinese Spelling Error Detection and Correction Based on Language Model, Pronunciation, and Shape[Yu, 2013]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]基于深度学习的中文文本自动校对研究与实现[杨宗霖, 2019]A Sequence to Sequence Learning for Chinese Grammatical Error Correction[Hongkai Ren, 2018]ELECTRA: Pre-training Text Encoders as Discriminators Rather Than GeneratorsRevisiting Pre-trained Models for Chinese Natural Language ProcessingRuiqing Zhang, Chao Pang et al. "Correcting Chinese Spelling Errors with Phonetic Pre-training", ACL, 2021DingminWang et al. "A Hybrid Approach to Automatic Corpus Generation for Chinese Spelling Check", EMNLP, 2018