Skip to content

Instantly share code, notes, and snippets.

@wut0n9
Last active March 11, 2019 10:51
Show Gist options
  • Save wut0n9/c1a60e48b8a8a6abdb0425ba9df99bf0 to your computer and use it in GitHub Desktop.
Save wut0n9/c1a60e48b8a8a6abdb0425ba9df99bf0 to your computer and use it in GitHub Desktop.
文本纠错 #query_rewrite

《Chinese Spelling Error Detection and Correction Based on Language Model, Pronunciation, and Shape》[1, Yu, 2013] 论文提供了一种准确较高、召回较低的纠错方法。

  • Character级别 n-gram language model。
  • 拼音和字形召回候选
  • 词典过滤掉部分无效候选
  • 取最高语言模型打分
  • 高于既定阈值则认为是替换候选

系统流程图: 系统流程

各步骤展开,具体简述如下:

  • 判断何处有输入错误,两种方式:
    • a. 使用正向反向的character级别的ngram语言模型,对每个位置进行打分,得分低的地方标记为待纠错片段。
    • b. 切词切出独立的字符。
  • 这里的ngram语言模型为5-gram,为了避免过多召回,阈值设定较为严苛。通过语言模型判断出的可疑位置将与上下文组合进行词典查词。
  • 召回:上一步词典过滤出的最终可疑词进行同音字和形近字的召回。召回候选与前后近邻组合为词进行词典查词过滤出有效候选。
  • 打分:候选中语言模型最高分,且得分大于阈值,则胜出。

source:水滴石穿


  • 使用语言模型计算句子或序列的合理性
  • bigram, trigram, 4-gram 结合,并对每个字的分数求平均以平滑每个字的得分
  • 根据Median Absolute Deviation算出outlier分数,并结合jieba分词结果确定需要修改的范围
  • 根据形近字、音近字构成的混淆集合列出候选字,并对需要修改的范围逐字改正
  • 句子中的错误会使分词结果更加细碎,结合替换字之后的分词结果确定需要改正的字
  • 探测句末语气词,如有错误直接改正

百度中文纠错技术关键步骤(错误检测->候选召回->纠错排序)

错误检测

错误检测的目标是识别输入句子可能存在的问题,采用序列表示(Transformer/LSTM)+CRF的序列预测模型,这个模型的创新点主要包括:

  • 词法/句法分析等语言先验知识的充分应用;

  • 特征设计方面,除了DNN相关这种泛化能力比较强的特征,还结合了大量hard统计特征,既充分利用DNN模型的泛化能力,又对低频与OOV(Out of Vocabulary)有一定的区分;

  • 最后,根据字粒度和词粒度各自的特点,在模型中对其进行融合,解决词对齐的问题。

候选召回

候选召回指的是,识别出具体的错误点之后,需要进行错误纠正,为了达到更好的效果以及性能,需要结合历史错误行为,以及音形等特征召回纠错候选。

主要可分为两部分工作:

  • 离线的候选挖掘,在线的候选预排序。离线候选挖掘利用大规模多来源的错误对齐语料,通过对其模型,得到不同粒度的错误混淆矩阵。

  • 在线候选预排序主要是针对当前的错误点,对离线召回的大量纠错候选,结合语言模型以及错误混淆矩阵的特征,控制进入纠错排序阶段的候选集数量与质量。

纠错排序

纠错排序解决的是,由于纠错的正确结果具有唯一性,如何在召回的纠错候选中将正确的结果排在第一位。

百度中文纠错采用的是Deep&Wide的混合模型结构,Deep部分学习当前错误点上下文表示,Wide部分基于形音、词法、语义、用户行为等特征学习原词与候选词的多维度距离表示,另外通过GBDT&LR模型学习到更好的特征组合。

source:ccheng

source:baidu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment