支持中文拼写和语法错误纠正,并开源拼写和语法错误的增强工具、大模型训练代码、文本纠错相关论文和通用的文本纠错评测工具。荣获2024CCL 冠军 🏆, 2023 NLPCC-NaCGEC纠错冠军🏆, 2022 FCGEC 纠错冠军🏆 ,如有帮助,感谢star✨。
[2026/02/28] 我们在 HuggingFace 和 ModelScope 开源了 ChineseErrorCorrector3 模型体验地址 🥳,欢迎大家访问进行试用。
🤗 HuggingFace 体验地址 | 👉 ModelScope 体验地址
[2025/12/11] 我们正在加速研发全新一代 ChineseErrorCorrector4 ⚡🔥,并同步筹备论文发布!这一版本将力求打造最强的中文文本纠错基线,提供更稳、更快、更准的整体体验。期待与大家再次相遇!🎉
[2025/11/25] 发布ChineseErrorCorrector3-4B论文 🎉,更多技术细节,欢迎大家查阅。
[2025/08/08] 发布通用的文本评测工具-Common Errant(支持80种语言) 🎉,可以在高(中文、英文)、低资源(印地语、孟加拉语等)上进行文本纠错的评测。
[2025/08/06] 发布文本纠错相关论文(持续更新版) 🥳,方便大家进行研学。
[2025/08/01] 发布twnlp/ChineseErrorCorrector3-4B 🎉🎉🎉,泛化性全面提升,在开源的所有模型中,位列第一,榜单详情。
[2025/05/01] 根据建议 ,我们重新训练纠错模型(ChineseErrorCorrector2-7B),并完全开源训练步骤,支持结果复现,复现教程
[2025/03/17] 更新批量错误文本的解析,transformers批量解析 ;VLLM批量解析
[2025/03/10] 模型支持多种推理方式,包括 transformers、VLLM、modelscope。
[2025/02/25] 🎉🎉🎉使用200万纠错数据进行多轮迭代训练,发布了twnlp/ChineseErrorCorrector2-7B ,在 NaCGEC-2023NLPCC官方评测数据集 上,超越第一名华为10个点,遥遥领先, 技术详情
[2025/02] 为方便部署,使用38万开源拼写数据,发布了twnlp/ChineseErrorCorrector-1.5B
[2025/01] 使用38万开源拼写数据,基于Qwen2.5训练中文拼写纠错模型,支持语似、形似等错误纠正,发布了twnlp/ChineseErrorCorrector-7B,twnlp/ChineseErrorCorrector-32B-LORA
[2024/06] v0.1.0版本:🎉🎉🎉开源一键语法错误增强工具,该工具可以进行14种语法错误的增强,不同行业可以根据自己的数据进行错误替换,来训练自己的语法和拼写模型。详见Tag-v0.1.0
| 模型名称 | 纠错类型 | 描述 |
|---|---|---|
| twnlp/ChineseErrorCorrector3-4B | 语法+拼写 | 使用200万纠错数据进行全量训练,适用于语法纠错和拼写纠错,效果最好,推荐使用。 |
| twnlp/ChineseErrorCorrector2-7B | 语法+拼写 | 使用200万纠错数据进行多轮迭代训练,适用于语法纠错和拼写纠错,效果较好。 |
| twnlp/ChineseErrorCorrector-7B | 拼写 | 使用38万开源拼写数据,支持语似、形似等拼写错误纠正,拼写纠错效果好。 |
| twnlp/ChineseErrorCorrector-1.5B | 拼写 | 使用38万开源拼写数据,支持语似、形似等拼写错误纠正,拼写纠错效果一般。 |
| 数据集名称 | 数据链接 | 数据量和类别说明 | 描述 |
|---|---|---|---|
| ChinseseErrorCorrectData | twnlp/ChinseseErrorCorrectData | 200万 | ChineseErrorCorrector 训练数据集 |
| CSC(拼写纠错数据集) | twnlp/csc_data | W271K(279,816) Medical(39,303) Lemon(22,259) ECSpell(6,688) CSCD(35,001) | 中文拼写纠错的数据集 |
| CGC(语法纠错数据集) | twnlp/cgc_data | CGED(20,449) FCGEC(37,354) MuCGEC(2,467) NaCGEC(7,568) | 中文语法纠错的数据集 |
| Lang8+HSK(百万语料-拼写和语法错误混合数据集) | twnlp/lang8_hsk | 1,568,885 | 中文拼写和语法数据集 |
- 评估指标:F1
- CSC(Chinese Spelling Correction): 拼写纠错模型,表示模型可以处理音似、形似、语法等长度对齐的错误纠正
- CTC(CHinese Text Correction): 文本纠错模型,表示模型支持拼写、语法等长度对齐的错误纠正,还可以处理多字、少字等长度不对齐的错误纠正
- GPU:Tesla V100,显存 32 GB
| Model Name | Model Link | Base Model | Avg | SIGHAN-2015 | EC-LAW | MCSC | GPU | QPS |
|---|---|---|---|---|---|---|---|---|
| Kenlm-CSC | shibing624/chinese-kenlm-klm | kenlm | 0.3409 | 0.3147 | 0.3763 | 0.3317 | CPU | 9 |
| Mengzi-T5-CSC | shibing624/mengzi-t5-base-chinese-correction | mengzi-t5-base | 0.3984 | 0.7758 | 0.3156 | 0.1039 | GPU | 214 |
| ERNIE-CSC | PaddleNLP/ernie-csc | PaddlePaddle/ernie-1.0-base-zh | 0.4353 | 0.8383 | 0.3357 | 0.1318 | GPU | 114 |
| MacBERT-CSC | shibing624/macbert4csc-base-chinese | hfl/chinese-macbert-base | 0.3993 | 0.8314 | 0.1610 | 0.2055 | GPU | 224 |
| ChatGLM3-6B-CSC | shibing624/chatglm3-6b-csc-chinese-lora | THUDM/chatglm3-6b | 0.4538 | 0.6572 | 0.4369 | 0.2672 | GPU | 3 |
| Qwen2.5-1.5B-CTC | shibing624/chinese-text-correction-1.5b | Qwen/Qwen2.5-1.5B-Instruct | 0.6802 | 0.3032 | 0.7846 | 0.9529 | GPU | 6 |
| Qwen2.5-7B-CTC | shibing624/chinese-text-correction-7b | Qwen/Qwen2.5-7B-Instruct | 0.8225 | 0.4917 | 0.9798 | 0.9959 | GPU | 3 |
| Qwen3-4B-CTC(Our) | twnlp/ChineseErrorCorrector3-4B | Qwen/Qwen3-4B | 0.8521 | 0.6340 | 0.9360 | 0.9864 | GPU | 5 |
| Model Name | Model Link | Prec | Rec | F0.5 |
|---|---|---|---|---|
| twnlp/ChineseErrorCorrector3-4B | huggingface ; modelspose(国内下载) | 0.542 | 0.3475 | 0.4874 |
| HW_TSC_nlpcc2023_cgec(华为) | 未开源 | 0.5095 | 0.3129 | 0.4526 |
| 鱼饼啾啾Plus(北京大学) | 未开源 | 0.5708 | 0.1294 | 0.3394 |
| CUHK_SU(香港中文大学) | 未开源 | 0.3882 | 0.1558 | 0.2990 |
-
评估指标:binary_f1
pip install transformersfrom transformers import AutoModelForCausalLM, AutoTokenizer,set_seed
set_seed(42)
model_name = "twnlp/ChineseErrorCorrector3-4B"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "你是一个文本纠错专家,纠正输入句子中的语法错误,并输出正确的句子,输入句子为:"
text_input = "对待每一项工作都要一丝不够。"
messages = [
{"role": "user", "content": prompt + text_input}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=False # Switches between thinking and non-thinking modes. Default is True.
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
pip install transformers
pip install vllm==0.8.5from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
# Initialize the tokenizer
tokenizer = AutoTokenizer.from_pretrained("twnlp/ChineseErrorCorrector3-4B")
# Pass the default decoding hyperparameters of twnlp/ChineseErrorCorrector3-4B
# max_tokens is for the maximum length for generation.
sampling_params = SamplingParams(seed=42,max_tokens=512)
# Input the model name or path. Can be GPTQ or AWQ models.
llm = LLM(model="twnlp/ChineseErrorCorrector3-4B")
# Prepare your prompts
text_input = "对待每一项工作都要一丝不够。"
messages = [
{"role": "user", "content": "你是一个文本纠错专家,纠正输入句子中的语法错误,并输出正确的句子,输入句子为:"+text_input}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=False
)
# generate outputs
outputs = llm.generate([text], sampling_params)
# Print the outputs.
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") - Clone the repo
git clone https://github.com/TW-NLP/ChineseErrorCorrector
cd ChineseErrorCorrector- Install Conda: please see https://docs.conda.io/en/latest/miniconda.html
- Create Conda env:
conda create -n zh_correct -y python=3.10
conda activate zh_correct
pip install -r requirements.txt
# If you are in mainland China, you can set the mirror as follows:
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com方法一:直接启动VLLM服务,使用openai接口进行调用,只输出正确语句,部署脚本:
CUDA_VISIBLE_DEVICES=0 nohup vllm serve twnlp/ChineseErrorCorrector3-4B \
--port 8000 \
--max-model-len 1024 \
--gpu-memory-utilization 0.9 \
--seed 42 \
>chinese_corrector.log 2>&1 &cURL 调用(openai格式)
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "twnlp/ChineseErrorCorrector3-4B",
"messages": [
{
"role": "user",
"content": "你是一个文本纠错专家,纠正输入句子中的语法错误,并输出正确的句子,输入句子为:对待每一项工作都要一丝不够。"
}
],
"max_tokens": 1024,
"temperature": 0,
"seed": 42
}'方法二:使用ChineseErrorCorrector推理,有对应的后处理操作。
# 修改config.py
#(1)根据不同的模型,修改的DEFAULT_CKPT_PATH,默认为twnlp/ChineseErrorCorrector3-4B(将模型下载,放在ChineseErrorCorrector/pre_model/twnlp/ChineseErrorCorrector3-4B)
#(2)将TextCorrectConfig的USE_VLLM = True
#批量预测
python main.py
#输出:
'''
[{'source': '对待每一项工作都要一丝不够。', 'target': '对待每一项工作都要一丝不苟。', 'errors': [('够', '苟', 12)]}, {'source': '大约半个小时左右', 'target': '大约半个小时', 'errors': [('左右', '', 6)]}]
'''- Clone the repo
git clone https://github.com/TW-NLP/ChineseErrorCorrector
cd ChineseErrorCorrector- Install Conda: please see https://docs.conda.io/en/latest/miniconda.html
- Create Conda env:
conda create -n zh_correct -y python=3.10
conda activate zh_correct
pip install -r requirements.txt
# If you are in mainland China, you can set the mirror as follows:
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com# 修改config.py
#(1)根据不同的模型,修改的DEFAULT_CKPT_PATH,默认为twnlp/ChineseErrorCorrector3-4B
#(2)将TextCorrectConfig的USE_VLLM = False
#批量预测
python main.py
pip install modelscopefrom modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "tiannlp/twnlp/ChineseErrorCorrector3-4B"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "你是一个文本纠错专家,纠正输入句子中的语法错误,并输出正确的句子,输入句子为:"
text_input = "对待每一项工作都要一丝不够。"
messages = [
{"role": "user", "content": prompt + text_input}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=False # Switches between thinking and non-thinking modes. Default is True.
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
If this work is helpful, please kindly cite as:
@misc{tian2025chineseerrorcorrector34bstateoftheartchinesespelling,
title={ChineseErrorCorrector3-4B: State-of-the-Art Chinese Spelling and Grammar Corrector},
author={Wei Tian and YuhaoZhou},
year={2025},
eprint={2511.17562},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2511.17562},
}微信: NLP技术交流群。

