Macbert4csc V2
模型简介
该模型主要用于中文拼写纠错,支持多种领域文本的纠错任务,包括文言文和常见高频错误如'地得的'等。
模型特点
特定架构设计
在BertForMaskedLM后新增错误检测分支(分类任务),训练与推理时采用不同策略
高效训练策略
使用MFT(动态mask 0.2的非错误tokens)训练,det_loss权重为0.3
多领域适用性
使用多种领域数据训练,适合作为预训练模型,可用于专有领域数据的继续微调
文言文支持
训练数据包含文言文数据,支持文言文纠错
高频错误处理
对'地得的'等高频错误具有较高的识别率和纠错率
模型能力
中文文本拼写纠错
多领域文本纠错
文言文纠错
高频错误识别
使用案例
通用文本纠错
日常文本纠错
纠正日常文本中的拼写错误
示例:'少先队员因该为老人让坐' → '少先队员应该为老人让坐'
专业领域纠错
纠正专业领域文本中的拼写错误
示例:'机七学习是人工智能领遇最能体现智能的一个分知' → '机器学习是人工智能领域最能体现智能的一个分支'
特定错误类型处理
'地得的'纠错
专门处理中文中常见的'地得的'使用错误
示例:'希望你们好好的跳无' → '希望你们好好地跳舞'
🚀 macbert4csc_v2
macbert4csc_v2是一款用于中文拼写纠错的模型,采用了特定架构和训练策略,可通过多种方式调用,在多个测评数据集上表现良好,适用于多种领域的文本纠错任务。
🚀 快速开始
本模型可用于中文拼写纠错测评和文本纠错,权重使用方面有其独特特点。项目地址在https://github.com/yongzhuo/macro-correct 。
本模型权重为macbert4csc_v2,使用macbert4csc架构(pycorrector版本),其特点是在BertForMaskedLM后新加一个分支用于错误检测任务(分类任务,不交互);训练时使用了MFT(动态mask 0.2的非错误tokens),同时det_loss的权重为0.3;推理时舍弃了macbert后面的部分(det-layer)。
使用方式有两种:
- 使用transformers调用;
- 使用macro-correct项目调用;详情见三、调用(Usage)。
✨ 主要特性
- 特定架构:在BertForMaskedLM后新加一个分支用于错误检测任务(分类任务,不交互)。
- 训练策略:训练时使用了MFT(动态mask 0.2的非错误tokens),同时det_loss的权重为0.3。
- 推理优化:推理时舍弃了macbert后面的部分(det-layer)。
- 多领域适用性:使用多种领域数据训练,比较均衡,适合作为第一步的预训练模型,可用于专有领域数据的继续微调。
- 文言文支持:训练数据中存在文言文数据,训练好的模型支持文言文纠错。
- 高频错误处理:对“地得的”等高频错误具有较高的识别率和纠错率。
📦 安装指南
文档未提及安装步骤,故跳过此章节。
💻 使用示例
基础用法
使用macro-correct
import os
os.environ["MACRO_CORRECT_FLAG_CSC_TOKEN"] = "1"
from macro_correct import correct
### 默认纠错(list输入)
text_list = ["真麻烦你了。希望你们好好的跳无",
"少先队员因该为老人让坐",
"机七学习是人工智能领遇最能体现智能的一个分知",
"一只小鱼船浮在平净的河面上"
]
text_csc = correct(text_list)
print("默认纠错(list输入):")
for res_i in text_csc:
print(res_i)
print("#" * 128)
"""
默认纠错(list输入):
{'index': 0, 'source': '真麻烦你了。希望你们好好的跳无', 'target': '真麻烦你了。希望你们好好地跳舞', 'errors': [['的', '地', 12, 0.6584], ['无', '舞', 14, 1.0]]}
{'index': 1, 'source': '少先队员因该为老人让坐', 'target': '少先队员应该为老人让坐', 'errors': [['因', '应', 4, 0.995]]}
{'index': 2, 'source': '机七学习是人工智能领遇最能体现智能的一个分知', 'target': '机器学习是人工智能领域最能体现智能的一个分支', 'errors': [['七', '器', 1, 0.9998], ['遇', '域', 10, 0.9999], ['知', '支', 21, 1.0]]}
{'index': 3, 'source': '一只小鱼船浮在平净的河面上', 'target': '一只小鱼船浮在平静的河面上', 'errors': [['净', '静', 8, 0.9961]]}
"""
使用transformers
# !/usr/bin/python
# -*- coding: utf-8 -*-
# @time : 2021/2/29 21:41
# @author : Mo
# @function: transformers直接加载bert类模型测试
import traceback
import time
import sys
import os
os.environ["USE_TORCH"] = "1"
from transformers import BertConfig, BertTokenizer, BertForMaskedLM
import torch
# pretrained_model_name_or_path = "shibing624/macbert4csc-base-chinese"
# pretrained_model_name_or_path = "Macropodus/macbert4mdcspell_v1"
# pretrained_model_name_or_path = "Macropodus/macbert4csc_v1"
pretrained_model_name_or_path = "Macropodus/macbert4csc_v2"
# pretrained_model_name_or_path = "Macropodus/bert4csc_v1"
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
max_len = 128
print("load model, please wait a few minute!")
tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path)
bert_config = BertConfig.from_pretrained(pretrained_model_name_or_path)
model = BertForMaskedLM.from_pretrained(pretrained_model_name_or_path)
model.to(device)
print("load model success!")
texts = [
"机七学习是人工智能领遇最能体现智能的一个分知",
"我是练习时长两念半的鸽仁练习生蔡徐坤",
"真麻烦你了。希望你们好好的跳无",
"他法语说的很好,的语也不错",
"遇到一位很棒的奴生跟我疗天",
"我们为这个目标努力不解",
]
len_mid = min(max_len, max([len(t)+2 for t in texts]))
with torch.no_grad():
outputs = model(**tokenizer(texts, padding=True, max_length=len_mid,
return_tensors="pt").to(device))
def get_errors(source, target):
""" 极简方法获取 errors """
len_min = min(len(source), len(target))
errors = []
for idx in range(len_min):
if source[idx] != target[idx]:
errors.append([source[idx], target[idx], idx])
return errors
result = []
for probs, source in zip(outputs.logits, texts):
ids = torch.argmax(probs, dim=-1)
tokens_space = tokenizer.decode(ids[1:-1], skip_special_tokens=False)
text_new = tokens_space.replace(" ", "")
target = text_new[:len(source)]
errors = get_errors(source, target)
print(source, " => ", target, errors)
result.append([target, errors])
print(result)
"""
机七学习是人工智能领遇最能体现智能的一个分知 => 机器学习是人工智能领域最能体现智能的一个分支 [['七', '器', 1], ['遇', '域', 10], ['知', '支', 21]]
我是练习时长两念半的鸽仁练习生蔡徐坤 => 我是练习时长两年半的个人练习生蔡徐坤 [['念', '年', 7], ['鸽', '个', 10], ['仁', '人', 11]]
真麻烦你了。希望你们好好的跳无 => 真麻烦你了。希望你们好好地跳舞 [['的', '地', 12], ['无', '舞', 14]]
他法语说的很好,的语也不错 => 他法语说得很好,德语也不错 [['的', '得', 4], ['的', '德', 8]]
遇到一位很棒的奴生跟我疗天 => 遇到一位很棒的女生跟我聊天 [['奴', '女', 7], ['疗', '聊', 11]]
我们为这个目标努力不解 => 我们为这个目标努力不懈 [['解', '懈', 10]]
"""
📚 详细文档
一、测评(Test)
1.1 测评数据来源
地址为Macropodus/csc_eval_public,所有训练数据均来自公网或开源数据,训练数据为1千万左右,混淆词典较大。
1.gen_de3.json(5545): '的地得'纠错,由人民日报/学习强国/chinese-poetry等高质量数据人工生成;
2.lemon_v2.tet.json(1053): relm论文提出的数据,多领域拼写纠错数据集(7个领域);包括game(GAM)、encyclopedia (ENC)、contract (COT)、medical care(MEC)、car (CAR)、novel (NOV)和news (NEW)等领域;
3.acc_rmrb.tet.json(4636): 来自NER - 199801(人民日报高质量语料);
4.acc_xxqg.tet.json(5000): 来自学习强国网站的高质量语料;
5.gen_passage.tet.json(10000): 源数据为qwen生成的好词好句,由几乎所有的开源数据汇总的混淆词典生成;
6.textproof.tet.json(1447): NLP竞赛数据,TextProofreadingCompetition;
7.gen_xxqg.tet.json(5000): 源数据为学习强国网站的高质量语料,由几乎所有的开源数据汇总的混淆词典生成;
8.faspell.dev.json(1000): 视频字幕通过OCR后获取的数据集;来自爱奇艺的论文faspell;
9.lomo_tet.json(5000): 主要为音似中文拼写纠错数据集;来自腾讯;人工标注的数据集CSCD - NS;
10.mcsc_tet.5000.json(5000): 医学拼写纠错;来自腾讯医典APP的真实历史日志;注意论文说该数据集只关注医学实体的纠错,常用字等的纠错并不关注;
11.ecspell.dev.json(1500): 来自ECSpell论文,包括(law/med/gov)等三个领域;
12.sighan2013.dev.json(1000): 来自sighan13会议;
13.sighan2014.dev.json(1062): 来自sighan14会议;
14.sighan2015.dev.json(1100): 来自sighan15会议;
1.2 测评数据预处理
测评数据都经过全角转半角,繁简转化,标点符号标准化等操作。
1.3 其他说明
1.指标带common的极为宽松指标,同开源项目pycorrector的评估指标;
2.指标带strict的极为严格指标,同开源项目[wangwang110/CSC](https://github.com/wangwang110/CSC);
3.macbert4mdcspell_v1模型为训练使用mdcspell架构 + bert的mlm - loss,但是推理的时候只用bert - mlm;
4.acc_rmrb/acc_xxqg数据集没有错误,用于评估模型的误纠率(过度纠错);
5.qwen25_1 - 5b_pycorrector的模型为shibing624/chinese - text - correction - 1.5b,其训练数据包括了lemon_v2/mcsc_tet/ecspell的验证集和测试集,其他的bert类模型的训练不包括验证集和测试集;
二、重要指标
2.1 F1(common_cor_f1)
model/common_cor_f1 | avg | gen_de3 | lemon_v2 | gen_passage | text_proof | gen_xxqg | faspell | lomo_tet | mcsc_tet | ecspell | sighan2013 | sighan2014 | sighan2015 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
macbert4csc_pycorrector | 45.8 | 42.44 | 42.89 | 31.49 | 46.31 | 26.06 | 32.7 | 44.83 | 27.93 | 55.51 | 70.89 | 61.72 | 66.81 |
bert4csc_v1 | 62.28 | 93.73 | 61.99 | 44.79 | 68.0 | 35.03 | 48.28 | 61.8 | 64.41 | 79.11 | 77.66 | 51.01 | 61.54 |
macbert4csc_v1 | 68.55 | 96.67 | 65.63 | 48.4 | 75.65 | 38.43 | 51.76 | 70.11 | 80.63 | 85.55 | 81.38 | 57.63 | 70.7 |
macbert4csc_v2 | 68.6 | 96.74 | 66.02 | 48.26 | 75.78 | 38.84 | 51.91 | 70.17 | 80.71 | 85.61 | 80.97 | 58.22 | 69.95 |
macbert4mdcspell_v1 | 71.1 | 96.42 | 70.06 | 52.55 | 79.61 | 43.37 | 53.85 | 70.9 | 82.38 | 87.46 | 84.2 | 61.08 | 71.32 |
qwen25_1 - 5b_pycorrector | 45.11 | 27.29 | 89.48 | 14.61 | 83.9 | 13.84 | 18.2 | 36.71 | 96.29 | 88.2 | 36.41 | 15.64 | 20.73 |
2.2 acc(common_cor_acc)
model/common_cor_acc | avg | gen_de3 | lemon_v2 | gen_passage | text_proof | gen_xxqg | faspell | lomo_tet | mcsc_tet | ecspell | sighan2013 | sighan2014 | sighan2015 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
macbert4csc_pycorrector | 48.26 | 26.96 | 28.68 | 34.16 | 55.29 | 28.38 | 22.2 | 60.96 | 57.16 | 67.73 | 55.9 | 68.93 | 72.73 |
bert4csc_v1 | 60.76 | 88.21 | 45.96 | 43.13 | 68.97 | 35.0 | 34.0 | 65.86 | 73.26 | 81.8 | 64.5 | 61.11 | 67.27 |
macbert4csc_v1 | 65.34 | 93.56 | 49.76 | 44.98 | 74.64 | 36.1 | 37.0 | 73.0 | 83.6 | 86.87 | 69.2 | 62.62 | 72.73 |
macbert4csc_v2 | 65.22 | 93.69 | 50.14 | 44.92 | 74.64 | 36.26 | 37.0 | 72.72 | 83.66 | 86.93 | 68.5 | 62.43 | 71.73 |
macbert4mdcspell_v1 | 67.15 | 93.09 | 54.8 | 47.71 | 78.09 | 39.52 | 38.8 | 71.92 | 84.78 | 88.27 | 73.2 | 63.28 | 72.36 |
qwen25_1 - 5b_pycorrector | 46.09 | 15.82 | 81.29 | 22.96 | 82.17 | 19.04 | 12.8 | 50.2 | 96.4 | 89.13 | 22.8 | 27.87 | 32.55 |
2.3 acc(acc_true, thr = 0.75)
model/acc | avg | acc_rmrb | acc_xxqg |
---|---|---|---|
macbert4csc_pycorrector | 99.24 | 99.22 | 99.26 |
bert4csc_v1 | 98.71 | 98.36 | 99.06 |
macbert4csc_v1 | 97.72 | 96.72 | 98.72 |
macbert4csc_v2 | 97.89 | 96.98 | 98.8 |
macbert4mdcspell_v1 | 97.75 | 96.51 | 98.98 |
qwen25_1 - 5b_pycorrector | 82.0 | 77.14 | 86.86 |
二、结论(Conclusion)
1.macbert4csc_v1/macbert4csc_v2/macbert4mdcspell_v1等模型使用多种领域数据训练,比较均衡,也适合作为第一步的预训练模型,可用于专有领域数据的继续微调;
2.比较macbert4csc_pycorrector/bertbase4csc_v1/macbert4csc_v2/macbert4mdcspell_v1,观察表2.3,可以发现训练数据越多,准确率提升的同时,误纠率也会稍微高一些;
3.MFT(Mask - Correct)依旧有效,不过对于数据量足够的情形提升不明显,可能也是误纠率升高的一个重要原因;
4.训练数据中也存在文言文数据,训练好的模型也支持文言文纠错;
5.训练好的模型对“地得的”等高频错误具有较高的识别率和纠错率;
四、论文(Paper)
- 2024 - Refining: Refining Corpora from a Model Calibration Perspective for Chinese
- 2024 - ReLM: Chinese Spelling Correction as Rephrasing Language Model
- 2024 - DICS: DISC: Plug - and - Play Decoding Intervention with Similarity of Characters for Chinese Spelling Check
- 2023 - Bi - DCSpell: A Bi - directional Detector - Corrector Interactive Framework for Chinese Spelling Check
- 2023 - BERT - MFT: Rethinking Masked Language Modeling for Chinese Spelling Correction
- 2023 - PTCSpell: PTCSpell: Pre - trained Corrector Based on Character Shape and Pinyin for Chinese Spelling Correction
- 2023 - DR - CSC: [A Frustratingly Easy Plug - and - Play Detection - and - Reasoning Module for Chinese](https://aclanthology.org/2023.findings - emnlp.771)
- 2023 - DROM: Disentangled Phonetic Representation for Chinese Spelling Correction
- 2023 - EGCM: An Error - Guided Correction Model for Chinese Spelling Error Correction
- 2023 - IGPI: Investigating Glyph - Phonetic Information for Chinese Spell Checking: What Works and What’s Next?
- 2023 - CL: Contextual Similarity is More Valuable than Character Similarity - An Empirical Study for Chinese Spell Checking
- 2022 - CRASpell: [CRASpell: A Contextual Typo Robust Approach to Improve Chinese Spelling Correction](https://aclanthology.org/2022.findings - acl.237)
- 2022 - MDCSpell: [MDCSpell: A Multi - task Detector - Corrector Framework for Chinese Spelling Correction](https://aclanthology.org/2022.findings - acl.98)
- 2022 - SCOPE: Improving Chinese Spelling Check by Character Pronunciation Prediction: The Effects of Adaptivity and Granularity
- 2022 - ECOPO: The Past Mistake is the Future Wisdom: Error - driven Contrastive Probability Optimization for Chinese Spell Checking
- 2021 - MLMPhonetics: [Correcting Chinese Spelling Errors with Phonetic Pre - training](https://aclanthology.org/2021.findings - acl.198)
- 2021 - ChineseBERT: [ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information](https://aclanthology.org/2021.acl - long.161/)
- 2021 - BERTCrsGad: [Global Attention Decoder for Chinese Spelling Error Correction](https://aclanthology.org/2021.findings - acl.122)
- 2021 - ThinkTwice: [Think Twice: A Post - Processing Approach for the Chinese Spelling Error Correction](https://www.mdpi.com/2076 - 3417/11/13/5832)
- 2021 - PHMOSpell: [PHMOSpell: Phonological and Morphological Knowledge Guided Chinese Spelling Chec](https://aclanthology.org/2021.acl - long.464)
- 2021 - SpellBERT: [SpellBERT: A Lightweight Pretrained Model for Chinese Spelling Check](https://aclanthology.org/2021.emnlp - main.287)
- 2021 - TwoWays: [Exploration and Exploitation: Two Ways to Improve Chinese Spelling Correction Models](https://aclanthology.org/2021.acl - short.56)
- 2021 - ReaLiSe: Read, Listen, and See: Leveraging Multimodal Information Helps Chinese Spell Checking
- 2021 - DCSpell: DCSpell: A Detector - Corrector Framework for Chinese Spelling Error Correction
- 2021 - PLOME: [PLOME: Pre - training with Misspelled Knowledge for Chinese Spelling Correction](https://aclanthology.org/2021.acl - long.233)
- 2021 - DCN: [Dynamic Connected Networks for Chinese Spelling Check](https://aclanthology.org/2021.findings - acl.216/)
- 2020 - SoftMaskBERT: Spelling Error Correction with Soft - Masked BERT
- 2020 - SpellGCN: SpellGCN:Incorporating Phonological and Visual Similarities into Language Models for Chinese Spelling Check
- 2020 - ChunkCSC: [Chunk - based Chinese Spelling Check with Global Optimization](https://aclanthology.org/2020.findings - emnlp.184)
- 2020 - MacBERT: Revisiting Pre - Trained Models for Chinese Natural Language Processing
- 2019 - FASPell: [FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE - Decoder Paradigm](https://aclanthology.org/D19 - 5522)
- 2018 - Hybrid: [A Hybrid Approach to Automatic Corpus Generation for Chinese Spelling Checking](https://aclanthology.org/D18 - 1273)
- 2015 - Sighan15: [Introduction to SIGHAN 2015 Bake - off for Chinese Spelling Check](https://aclanthology.org/W15 - 3106/)
- 2014 - Sighan14: [Overview of SIGHAN 2014 Bake - off for Chinese Spelling Check](https://aclanthology.org/W14 - 6820/)
- 2013 - Sighan13: [Chinese Spelling Check Evaluation at SIGHAN Bake - off 2013](https://aclanthology.org/W13 - 4406/)
五、参考(Refer)
- [nghuyong/Chinese - text - correction - papers](https://github.com/nghuyong/Chinese - text - correction - papers)
- destwang/CTCResources
- wangwang110/CSC
- [chinese - poetry/chinese - poetry](https://github.com/chinese - poetry/chinese - poetry)
- [chinese - poetry/huajianji](https://github.com/chinese - poetry/huajianji)
- garychowcmu/daizhigev20
- yangjianxin1/Firefly
- Macropodus/xuexiqiangguo_428w
- Macropodus/csc_clean_wang271k
- Macropodus/csc_eval_public
- shibing624/pycorrector
- iioSnail/MDCSpell_pytorch
- gingasan/lemon
- [Claude - Liu/ReLM](https://github.com/Claude - Liu/ReLM)
六、引用(Cite)
如需引用此项目,可参考当前GitHub项目。例如,使用BibTeX格式:
@software{macro-correct,
url = {https://github.com/yongzhuo/macro-correct},
author = {Yongzhuo Mo},
title = {macro-correct},
year = {2025}
🔧 技术细节
本模型权重为macbert4csc_v2,使用macbert4csc架构(pycorrector版本),其特点是在BertForMaskedLM后新加一个分支用于错误检测任务(分类任务,不交互);训练时使用了MFT(动态mask 0.2的非错误tokens),同时det_loss的权重为0.3;推理时舍弃了macbert后面的部分(det-layer)。
📄 许可证
本项目采用Apache 2.0许可证。
Phi 2 GGUF
其他
Phi-2是微软开发的一个小型但强大的语言模型,具有27亿参数,专注于高效推理和高质量文本生成。
大型语言模型 支持多种语言
P
TheBloke
41.5M
205
Roberta Large
MIT
基于掩码语言建模目标预训练的大型英语语言模型,采用改进的BERT训练方法
大型语言模型 英语
R
FacebookAI
19.4M
212
Distilbert Base Uncased
Apache-2.0
DistilBERT是BERT基础模型的蒸馏版本,在保持相近性能的同时更轻量高效,适用于序列分类、标记分类等自然语言处理任务。
大型语言模型 英语
D
distilbert
11.1M
669
Llama 3.1 8B Instruct GGUF
Meta Llama 3.1 8B Instruct 是一个多语言大语言模型,针对多语言对话用例进行了优化,在常见的行业基准测试中表现优异。
大型语言模型 英语
L
modularai
9.7M
4
Xlm Roberta Base
MIT
XLM-RoBERTa是基于100种语言的2.5TB过滤CommonCrawl数据预训练的多语言模型,采用掩码语言建模目标进行训练。
大型语言模型 支持多种语言
X
FacebookAI
9.6M
664
Roberta Base
MIT
基于Transformer架构的英语预训练模型,通过掩码语言建模目标在海量文本上训练,支持文本特征提取和下游任务微调
大型语言模型 英语
R
FacebookAI
9.3M
488
Opt 125m
其他
OPT是由Meta AI发布的开放预训练Transformer语言模型套件,参数量从1.25亿到1750亿,旨在对标GPT-3系列性能,同时促进大规模语言模型的开放研究。
大型语言模型 英语
O
facebook
6.3M
198
1
基于transformers库的预训练模型,适用于多种NLP任务
大型语言模型
Transformers

1
unslothai
6.2M
1
Llama 3.1 8B Instruct
Llama 3.1是Meta推出的多语言大语言模型系列,包含8B、70B和405B参数规模,支持8种语言和代码生成,优化了多语言对话场景。
大型语言模型
Transformers 支持多种语言

L
meta-llama
5.7M
3,898
T5 Base
Apache-2.0
T5基础版是由Google开发的文本到文本转换Transformer模型,参数规模2.2亿,支持多语言NLP任务。
大型语言模型 支持多种语言
T
google-t5
5.4M
702
精选推荐AI模型
Llama 3 Typhoon V1.5x 8b Instruct
专为泰语设计的80亿参数指令模型,性能媲美GPT-3.5-turbo,优化了应用场景、检索增强生成、受限生成和推理任务
大型语言模型
Transformers 支持多种语言

L
scb10x
3,269
16
Cadet Tiny
Openrail
Cadet-Tiny是一个基于SODA数据集训练的超小型对话模型,专为边缘设备推理设计,体积仅为Cosmo-3B模型的2%左右。
对话系统
Transformers 英语

C
ToddGoldfarb
2,691
6
Roberta Base Chinese Extractive Qa
基于RoBERTa架构的中文抽取式问答模型,适用于从给定文本中提取答案的任务。
问答系统 中文
R
uer
2,694
98