BERTc-165M-CSC

中文拼写纠错。基于 BERTc-165M 微调。

双头:cor 逐位置预测正确的字(权重与词嵌入绑定),det 判断该位置有没有错(focal loss)。只做等长替换,不处理多字少字。

指标

指标
句级 F1 0.8308

训练

  • 配方:5 epoch,batch 64,lr 5e-5,其余同 315M-CSC
  • 数据:同 315M-CSC

用法

from csc_model import BERTcForCSC

model = BERTcForCSC.from_pretrained(".")
print(model.correct("他平时喜欢锻练身体"))   # 他平时喜欢锻炼身体
print(model.correct(["句子一", "句子二"]))   # 也接列表

评测口径

指标在 SIGHAN-15 官方 707 条上测(shibing624/pycorrectorpycorrector/data/sighan2015_test.tsv 那一版)。注意 CTCDataset 里还有个 1100 条的 sighan15_test.jsonl,不是同一个东西。

判定是整句级:整句完全一致才算对,改对一半不给分。

阈值

correct(..., threshold=0.7):纠错置信度低于阈值就保留原字。调低提召回、 调高提精确率。0.7 是与 MacBERT4CSC 对齐的默认值,报告的指标都基于它。

一个反直觉的行为

correct() 只用纠错头,不用检测头。检测头是训练时的辅助信号,推理不参与。

所以会出现"模型知道这里有错、但选不出正确的字"的情况。比如「我今天很稿兴」, 稿 位置的检测分是 0.98,但纠错头的 top-1 仍是 稿 本身(0.22), 只排第 4(0.11)—— 这种时候调低阈值没有任何用,阈值只能否决改动, 不能凭空造出改动。

Tokenizer

字级 SentencePiece,BERTc-Tokenizer.pt,词表 12536(pad=12531,mask=12535)。必须用 dict="no" 加载(字模式,不挂分词词典)——挂了词典编码结果会跟训练时不一致,而且不报错。

pip install git+https://github.com/Ismantic/PieceTokenizer

文件

文件 说明
model.safetensors 骨干 + 双头
csc_model.py 推理入口 BERTcForCSC
model.py 骨干定义
tokenizer.py 字级 tokenizer
example_correct.py 示例

许可

Apache-2.0。训练语料各自的许可见对应数据集卡。

Downloads last month
34
Safetensors
Model size
0.2B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support