1. 核心模块解析​

项目代码结构清晰,核心模块位于 pycorrector 目录下:

​1.1 纠错模型实现​

  • 统计模型 (KenLM)​

    • 代码路径: pycorrector/corrector.pyCorrector

    • 功能:基于 N-Gram 语言模型 + 混淆集进行纠错

    • 关键方法:

      • detect(): 错误检测

      • correct(): 错误纠正

      • 依赖文件: zh_giga.no_cna_cmn.prune01244.klm(默认语言模型)

基于规则的语言纠错模型

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

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

  • 深度学习模型 (MacBERT/T5/GPT等)​

    • 代码路径: pycorrector/macbert/, pycorrector/t5/, pycorrector/gpt/

    • 示例:

      • MacBERT​ → pycorrector/macbert/macbert_corrector.pyMacBertCorrector

      • T5​ → pycorrector/t5/t5_corrector.pyT5Corrector

      • GPT​ → pycorrector/gpt/gpt_corrector.pyGptCorrector

    • 功能:调用预训练模型进行端到端纠错

基于深度学习的语言纠错模型

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

​1.2 工具模块​

  • 文本处理工具

    • 代码路径: pycorrector/utils/text_utils.py

    • 功能:简繁转换、同音字替换、形似字生成等

    • 关键函数:

      • traditional2simplified(): 繁体转简体

      • get_homophones_by_char(): 生成同音字

  • 评估模块

    • 代码路径: pycorrector/utils/evaluation.py

    • 功能:计算纠错准确率、召回率、F1值


​2. 关键代码示例​

​2.1 KenLM 纠错调用​

from pycorrector import Corrector

corrector = Corrector()
result = corrector.correct("少先队员因该为老人让坐")
print(result)
  • 输出:

    {
      "source": "少先队员因该为老人让坐",
      "target": "少先队员应该为老人让座",
      "errors": [("因该", "应该", 4), ("坐", "座", 10)]
    }

​2.2 MacBERT 纠错调用​

from pycorrector import MacBertCorrector

corrector = MacBertCorrector("shibing624/macbert4csc-base-chinese")
result = corrector.correct("今天新情很好")
print(result)
  • 输出:

    {
      "source": "今天新情很好",
      "target": "今天心情很好",
      "errors": [("新", "心", 2)]
    }

​3. 训练代码指引​

​3.1 MacBERT 模型训练​

  • 代码路径: examples/macbert/train.py

  • 关键步骤:

    1. 加载预训练模型 hfl/chinese-macbert-base

    2. 在纠错数据集(如 SIGHAN+Wang271K)上微调

    3. 保存模型至 output/macbert4csc

​3.2 T5 模型训练​

  • 代码路径: examples/t5/train.py

  • 关键配置:

    model = T5ForConditionalGeneration.from_pretrained("Langboat/mengzi-t5-base")
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=train_dataset,
        eval_dataset=eval_dataset
    )

​4. 数据集处理​

  • 数据加载​:

    • 代码路径: pycorrector/data_reader.py

    • 支持格式: JSON(需包含 original_textwrong_idscorrect_text 字段)

  • 自定义数据集示例:

    [
      {
        "id": "example_1",
        "original_text": "这是一个测试句子。",
        "wrong_ids": [3],
        "correct_text": "这是一个测试样例。"
      }
    ]

​5. 扩展与二次开发​

​5.1 添加新模型​

  1. pycorrector/ 下新建模块(如 my_model/

  2. 实现 detect()correct() 方法

  3. __init__.py 中暴露接口

​5.2 自定义混淆集​

  • 创建 my_confusion.txt

    苹果 苹果  # 白名单
    未 末  # 纠错规则
  • 调用时加载:

    corrector = Corrector(custom_confusion_path_or_dict="my_confusion.txt")

​6. 性能优化建议​

  • GPU 加速​:所有深度学习模型默认支持 GPU(需安装 PyTorch GPU 版本)

  • 批处理​:使用 correct_batch() 替代单句处理

  • 语言模型轻量化​:替换为 people2014corpus_chars.klm(140MB)


​7. 完整代码文档​

  • GitHub 地址: https://github.com/shibing624/pycorrector

  • 详细文档​:查阅 docs/ 目录下的技术文档