语言:
- 中文
标签:
- bert
- pytorch
- 中文
- pycorrector
许可证: apache-2.0
数据集:
- shibing624/CSC
库名称: transformers
管道标签: 文本到文本生成
小部件示例:
中文拼写纠错模型MacBERT(macbert4csc)
macbert4csc-base-chinese
在SIGHAN2015测试集上的评估结果:
|
正确率-精确率 |
正确率-召回率 |
正确率-F1值 |
字符级别 |
93.72 |
86.40 |
89.91 |
句子级别 |
82.64 |
73.66 |
77.89 |
由于训练数据使用了SIGHAN2015的训练集(复现论文),该模型在SIGHAN2015测试集上达到了当前最优水平。
模型架构基于softmaskedbert改进:

使用方式
本项目已集成至中文文本纠错项目pycorrector,支持macbert4csc模型调用:
from pycorrector.macbert.macbert_corrector import MacBertCorrector
m = MacBertCorrector("shibing624/macbert4csc-base-chinese")
i = m.correct('今天新情很好')
print(i)
也可直接使用transformers
调用:
import operator
import torch
from transformers import BertTokenizer, BertForMaskedLM
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = BertTokenizer.from_pretrained("shibing624/macbert4csc-base-chinese")
model = BertForMaskedLM.from_pretrained("shibing624/macbert4csc-base-chinese")
model.to(device)
texts = ["今天新情很好", "你找到你最喜欢的工作,我也很高心。"]
with torch.no_grad():
outputs = model(**tokenizer(texts, padding=True, return_tensors='pt').to(device))
def get_errors(corrected_text, origin_text):
sub_details = []
for i, ori_char in enumerate(origin_text):
if ori_char in [' ', '“', '”', '‘', '’', '琊', '\n', '…', '—', '擤']:
corrected_text = corrected_text[:i] + ori_char + corrected_text[i:]
continue
if i >= len(corrected_text):
continue
if ori_char != corrected_text[i]:
if ori_char.lower() == corrected_text[i]:
corrected_text = corrected_text[:i] + ori_char + corrected_text[i + 1:]
continue
sub_details.append((ori_char, corrected_text[i], i, i + 1))
sub_details = sorted(sub_details, key=operator.itemgetter(2))
return corrected_text, sub_details
result = []
for ids, text in zip(outputs.logits, texts):
_text = tokenizer.decode(torch.argmax(ids, dim=-1), skip_special_tokens=True).replace(' ', '')
corrected_text = _text[:len(text)]
corrected_text, details = get_errors(corrected_text, text)
print(text, ' => ', corrected_text, details)
result.append((corrected_text, details))
print(result)
输出示例:
今天新情很好 => 今天心情很好 [('新', '心', 2, 3)]
你找到你最喜欢的工作,我也很高心。 => 你找到你最喜欢的工作,我也很高兴。 [('心', '兴', 15, 16)]
模型文件结构:
macbert4csc-base-chinese
├── config.json
├── added_tokens.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tokenizer_config.json
└── vocab.txt
训练数据
SIGHAN+Wang271K中文纠错数据集
数据格式示例:
{
"id": "B2-4029-3",
"original_text": "晚间会听到嗓音",
"wrong_ids": [5,31],
"correct_text": "晚间会听到噪音"
}
如需训练macbert4csc模型,请参考pycorrector/macbert
MacBERT技术说明
MacBERT通过创新的MLM校正预训练任务改进BERT,缓解了预训练与微调阶段的差异。其核心特点包括:
- 全词掩码(WWM)
- N-gram掩码
- 句子顺序预测(SOP)
注意:MacBERT可直接替代原始BERT,主体网络架构完全兼容。
技术细节详见论文:Revisiting Pre-trained Models for Chinese Natural Language Processing
引用
@software{pycorrector,
author = {徐明},
title = {pycorrector: 文本纠错工具},
year = {2021},
url = {https://github.com/shibing624/pycorrector},
}