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/pycorrector 里
pycorrector/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