中文文本纠错

1. 中文文本纠错任务,常见错误类型包括:

当然,针对不同业务场景,这些问题并不一定全部存在,比如拼音输入法、语音识别校对关注音似错误;五笔输入法、OCR校对关注形似错误, 搜索引擎/问答query纠错关注所有错误类型。

2. 解决方案

2.1. 规则的解决思路

依据语言模型检测错别字位置,通过拼音音似特征、笔画五笔编辑距离特征及语言模型困惑度特征纠正错别字。

  1. 中文纠错分为两步走,第一步是错误检测,第二步是错误纠正;
  2. 错误检测部分先通过结巴中文分词器切词,由于句子中含有错别字,所以切词结果往往会有切分错误的情况,这样从字粒度和词粒度两方面检测错误, 整合这两种粒度的疑似错误结果,形成疑似错误位置候选集;
  3. 错误纠正部分,是遍历所有的疑似错误位置,并使用音似、形似词典替换错误位置的词,然后通过语言模型计算句子困惑度,对所有候选集结果比较并排序,得到最优纠正词。

2.2. 深度模型的解决思路

  1. 端到端的深度模型可以避免人工提取特征,减少人工工作量,RNN序列模型对文本任务拟合能力强,RNN Attn在英文文本纠错比赛中取得第一名成绩,证明应用效果不错;
  2. CRF会计算全局最优输出节点的条件概率,对句子中特定错误类型的检测,会根据整句话判定该错误,阿里参赛2016中文语法纠错任务并取得第一名,证明应用效果不错;
  3. Seq2Seq模型是使用Encoder-Decoder结构解决序列转换问题,目前在序列转换任务中(如机器翻译、对话生成、文本摘要、图像描述)使用最广泛、效果最好的模型之一;
  4. BERT/ELECTRA/ERNIE/MacBERT等预训练模型强大的语言表征能力,对NLP届带来翻天覆地的改变,海量的训练数据拟合的语言模型效果无与伦比,基于其MASK掩码的特征,可以简单改造预训练模型用于纠错,加上fine-tune,效果轻松达到最优。

3. 模型推荐

  • Kenlm模型:本项目基于Kenlm统计语言模型工具训练了中文NGram语言模型,结合规则方法、混淆集可以纠正中文拼写错误,方法速度快,扩展性强,效果一般
  • MacBERT模型【推荐】:本项目基于PyTorch实现了用于中文文本纠错的MacBERT4CSC模型,模型加入了错误检测和纠正网络,适配中文拼写纠错任务,效果好
  • Seq2Seq模型:本项目基于PyTorch实现了用于中文文本纠错的Seq2Seq模型、ConvSeq2Seq模型,其中ConvSeq2Seq在NLPCC-2018的中文语法纠错比赛中,使用单模型并取得第三名,可以并行训练,模型收敛快,效果一般
  • T5模型:本项目基于PyTorch实现了用于中文文本纠错的T5模型,使用Langboat/mengzi-t5-base的预训练模型fine-tune中文纠错数据集,模型改造的潜力较大,效果好
  • BERT模型:本项目基于PyTorch实现了基于原生BERT的fill-mask能力进行纠正错字的方法,效果差
  • ELECTRA模型:本项目基于PyTorch实现了基于原生ELECTRA的fill-mask能力进行纠正错字的方法,效果差
  • ERNIE_CSC模型:本项目基于PaddlePaddle实现了用于中文文本纠错的ERNIE_CSC模型,模型在ERNIE-1.0上fine-tune,模型结构适配了中文拼写纠错任务,效果好
  • DeepContext模型:本项目基于PyTorch实现了用于文本纠错的DeepContext模型,该模型结构参考Stanford University的NLC模型,2014英文纠错比赛得第一名,效果一般
  • Transformer模型:本项目基于PyTorch的fairseq库调研了Transformer模型用于中文文本纠错,效果一般
     
  • 思考
     
  • 规则的方法,在词粒度的错误召回还不错,但错误纠正的准确率还有待提高,更多优质的纠错集及纠错词库会有提升,我更希望算法模型上有更大的突破。
     
  • 现在的文本错误不再局限于字词粒度上的拼写错误,需要提高中文语法错误检测(CGED, Chinese Grammar Error Diagnosis)及纠正能力,列在TODO中,后续调研。

4. 模型评估

提供评估脚本https://github.com/shibing624/pycorrector/blob/master/examples/evaluate_models/evaluate_models.py

Model Name

Model Hub Link

Backbone

GPU

Precision

Recall

F1

QPS

Rule

-

kenlm

CPU

0.6860

0.1529

0.2500

9

BERT-CSC

-

bert-base-chinese

GPU

0.8029

0.4052

0.5386

2

BART-CSC

shibing624/bart4csc-base-chinese

fnlp/bart-base-chinese

GPU

0.6984

0.6354

0.6654

58

T5-CSC

-

byt5-small

GPU

0.5220

0.3941

0.4491

111

Mengzi-T5-CSC

shibing624/mengzi-t5-base-chinese-correction

mengzi-t5-base

GPU

0.8321

0.6390

0.7229

214

ConvSeq2Seq-CSC

-

ConvSeq2Seq

GPU

0.2415

0.1436

0.1801

6

ChatGLM-6B-CSC

shibing624/chatglm-6b-csc-zh-lora

ChatGLM

GPU

0.5263

0.4052

0.4579

4

MacBERT-CSC

shibing624/macbert4csc-base-chinese

hfl/chinese-macbert-base

GPU

0.8254

0.7311

0.7754

224

  • 结论
     
  • 中文拼写纠错模型效果最好的是MacBert-CSC,模型名称是shibing624/macbert4csc-base-chinese,huggingface model:shibing624/macbert4csc-base-chinese
     
  • 中文语法纠错模型效果最好的是BART-CSC,模型名称是shibing624/bart4csc-base-chinese,huggingface model:shibing624/bart4csc-base-chinese
  • 最具潜力的模型是Mengzi-T5-CSC,模型名称是shibing624/mengzi-t5-base-chinese-correction,huggingface model:shibing624/mengzi-t5-base-chinese-correction,未改变模型结构,仅fine-tune中文纠错数据集,已经在SIGHAN 2015取得接近SOTA的效果
  • 基于ChatGLM-6B的纠错微调模型效果也不错,模型名称是shibing624/chatglm-6b-csc-zh-lora,huggingface model:shibing624/chatglm-6b-csc-zh-lora,大模型不仅能改错还能润色句子,但是模型太大,推理速度慢

5. 下载模型

5.1. 使用 transformers 库自动下载

如果你使用 transformers,模型会自动从 Hugging Face 下载到本地缓存目录(默认 ~/.cache/huggingface/transformers/)。

from transformers import AutoModelForMaskedLM, AutoTokenizer

# 模型名称
model_name = "shibing624/macbert4csc-base-chinese"

# 自动下载 tokenizer 和 model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForMaskedLM.from_pretrained(model_name)

print("模型下载完成,已加载!")

5.2. 手动下载Hugging Face上的模型

5.2.1. 下载模型文件(model.safetensors可以不用下载):

https://huggingface.co/shibing624/macbert4csc-base-chinese

5.2.2. 解压到本地目录:
mkdir -p /opt/zhanghao/shibing624/macbert4csc-base-chinese
mv ~/Downloads/* /opt/zhanghao/shibing624/macbert4csc-base-chinese

6. 使用模型

使用的天津A100环境,GPU显存80G
模型大小400M

6.1. 主动加载模型

load_macbert4csc.py

# -*- coding: utf-8 -*-
from transformers import AutoModelForMaskedLM, AutoTokenizer

# 指定本地路径
local_model_path = "/opt/zhanghao/shibing624/macbert4csc-base-chinese"

tokenizer = AutoTokenizer.from_pretrained(local_model_path)
model = AutoModelForMaskedLM.from_pretrained(local_model_path)

print("已从本地路径加载模型!")

只需运行一次,后续会从本地缓存读取,不用重复下载。

6.2. 批量纠错

# -*- coding: utf-8 -*- 


from pycorrector import MacBertCorrector


def main():
    m = MacBertCorrector()
    error_sentences = [
        '今天新情很好',
        '你找到你最喜欢的工作,我也很高心。',
        '老是较书。',
        '感谢等五分以后,碰到一位很棒的奴生跟我可聊。',
        '遇到一位很棒的奴生跟我聊天。',
        '遇到一位很美的女生跟我疗天。',
        '他们只能有两个选择:接受降新或自动离职。',
        '王天华开心得一直说话。'
    ]
    batch_res = m.correct_batch(error_sentences)
    for i in batch_res:
        print(i)
        print()

执行结果如下

6.3. 单文本纠错

# -*- coding: utf-8 -*-

from pycorrector.macbert.macbert_corrector import MacBertCorrector

# 使用 MacBERT 纠错
model_path = "/opt/zhanghao/shibing624/macbert4csc-base-chinese"
corrector = MacBertCorrector(model_path)

# 测试句子
error_sentence = "我喜欢吃平果,它是红色的。"
corrected_sentence = corrector.correct(error_sentence)

print("原句:", error_sentence)
print("纠正后:", corrected_sentence)

执行结果如下:

6.4. 未发现需要纠正的错误,输出如下

7. 运行时资源

7.1. MacBERT 模型大小

MacBertCorrector 使用的 shibing624/macbert4csc-base-chinese 大致占用:

  • 模型大小:约 400MBpytorch_model.bin
  • Tokenizer 额外占用:约 30MB
  • 总文件大小:~ 430MB

7.2. 运行时占用(显存 & 内存)

不同环境下的 运行时内存占用 估算如下:

运行环境

显存占用

RAM(内存)占用

CPU(无 GPU)

❌(无显存)

约 1GB - 2GB(下周测试,联系汪洋开一个纯CPU,16C32G

GPU(8GB 以上显存)

约 1GB - 2GB

约 500MB - 1GB

GPU(16GB 以上显存)

约 1GB

约 300MB - 500MB

7.2.1. 实测显存

nvidia-smi

7.2.2. 实测内存

在加载模型的一瞬间会

后续变为单核处理

0.4*125G=500MB

最高可以为0.8*125G=1G

7.3. 影响缓存大小的因素

  • batch_size:如果一次处理多个句子,显存/内存占用会增加。
  • 是否使用 GPU
    • GPU 运行(推荐):占用 1GB 显存 + 500MB RAM 左右。
    • CPU 运行:占用 1GB - 2GB RAM,速度较慢。
  • 文本长度
    • 句子越长,占用的缓存(显存/内存)越多。
    • 默认最大长度 512,但普通中文句子一般 小于 50。(指的是汉字个数,不是token)
  • 服务对外提供的并发能力
    • 单个并发处理多个文本,对内存和显存的消耗不是很大
    • 多并发的情况下,需要适当的增加资源,至少8倍以上,可以应对15-20左右个并发

8. 存在的问题:

8.1. 对中英文混合,和纯英文的场景很不友好

9. 和大语言模型对比:

1.性能(下周)
2.效果(下周)

4.资源(下周)用在线不考虑资源

3.可以考虑在query改写的时候把纠错给做了。glm4 ds-r1(Q2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值