文本纠错开源项目Pycorrector
如果无法正常显示,请先停止浏览器的去广告插件。
1. 文本纠错开源项目
分享嘉宾:徐明
2. 目录
• 背景
• 纠错比赛
• 中文纠错解决方法
• 学术界方法
• 工业界方法
• 总结
3. 背景:纠错问题
包括:拼写纠错和语法纠错
• 网络微博、微信用语 — 错误率>2%
• 语音识别转文本、OCR转文本 — 错误率>8%
• 垂直领域文本输入,UGC,弹幕 — 错误率>1%
常见中文错误类型:
类别
常见应用场景:
细类
谐音字词
混淆音字词
中文拼音全拼
中文拼音缩写 case
配副眼睛-配副眼镜
流浪织女-牛郎织女
xingfu-幸福
sz-深圳
形似错字 形似字错误 高梁-高粱
多字
少字
乱序 多字
少字
词语颠倒 即减肥又又有营养-即减肥又有营养
爱有天意-假如爱有天意
伍迪艾伦-艾伦伍迪
语法错误 搭配错误 想象难以-难以想象
音似错字
• 搜索引擎
• 输入法、OCR、ASR
• 文本校对
• 内容风控
4. 纠错比赛:公开的中文纠错比赛
CGED 2020 (Chinese Grammar Error Diagnosis)
SIGHAN、NLPCC、CGED比赛介绍
SIGHAN 2015: Chinese Spelling Check Task
• 官网:http://ir.itc.ntnu.edu.tw/lre/sighan8csc.html
• 数据集:http://nlp.ee.ncu.edu.tw/resource/csc.html
Source:1986年毕业于国防科技大学计算机应用专业,获学时学位。
Target:
1986年毕业于国防科技大学计算机应用专业,获学士学位。 (时 -> 士)
NLPCC 2018 语法纠错
• 官网:https://github.com/zhaoyyoo/NLPCC2018_GEC
• 数据集:http://tcci.ccf.org.cn/conference/2018/taskdata.php
四种错误类型:
• R(多字)
• M(缺字)
• S:(错别字)
• W:(词序错误)
• 数据集:http://www.cged.tech/
• CGED包括以下几个子任务:
• 检测,句子级的二分类,判断是否有语法错误
• 识别,多标签分类,判断具体错误类别
• 位置级,识别出 start_pos,end_pos 和错误类别
• 改正,对于选词错误和缺失词进行改正
5. 纠错预处理:训练样本
样本数据集质量高于模型
无监督方法:
有监督方法:
• 随机造样本,随机删词、随机加词、随机替换词、随机乱序 •
生成模型,seq2seq
• UDA,非核心词替换 正确文本生成错误文本,利用 seq2seq 模型自动生成纠错 pair:
• EDA,简单数据增广技术,相似词、同义词替换 • 回译(bt, back translate),中文-英文-中文 • Bert Fill-Mask完形填空 + 音似形似相似度阈值
https://github.com/shibing624/textgen
paper : Improving Grammatical Error Correction with Data Augmentation by Editing Latent Representation COLING 2020
6. 纠错解决方法:思路
规则的解决方法,深度模型的解决方法,研究循序渐进
规则的解决思路
• 专家系统
• 统计语言模型 – 默认方法
错误检测
• 混淆词典匹配:支持纠错和改正误纠
高梁 -> 高粱
• 常用词典匹配:切词后不在常用词典中的疑似错词
• Ngram语言模型:某个字的前后搭配2gram和3gram的
似然概率值低于句子文本平均ppl值
深度模型的解决思路
• DeepContext
• CRF
• Seq2Seq
• BERT/ELECTRA/ERNIE/MacBERT
• SoftMaskedBert/PLOME/MLM-phonetics
候选召回
候选排序
• 混淆集结果
• 音似字典替换错字结果 梁\liang ->凉 量 粱 良 粮 …
• 形似词典替换错字结果 梁 ->粱 渠 喋
• 基于统计语言模型(kenlm)计算句子似然概率,取概
率值超过原句且最大的
P(种在高粱地里) P(种在高凉地里)
P(种在高梁地里) P(种在高渠地里)
项目地址:https://github.com/shibing624/pycorrector
7. 规则方法:检错实现
错误检测的实现逻辑
取疑似错字的位置
• 通过平均绝对离差(MAD)
• 通过平均值上下n倍标准差之间
属于正常字
8. 规则方法:纠错实现
错误纠正的实现逻辑
自定义的混淆集(confusion_custom_set)
构建候选集
• 字的混淆集(confusion_char_set)
• 词的混淆集(confusion_word_set)
9. 规则方法:英文纠错实现
英文单词错误纠正的实现逻辑
候选值生成
• 通过candidates方法获得可能的正确地拼写词
• 获取编辑距离1,2内的候选值以及当前值和子集
计算方法
• 使用当前词的频率/总得词频数量,简单粗暴
• 英语常用单词3万个,取词频高于400
10. 模型方法:Alibaba at IJCNLP-2017
将语法特征嵌入到LSTM中用于中文语法错误诊断任务
Paper:《Alibaba at IJCNLP-2017 Task 1:Embedding Grammatical Features into LSTMs for Chinese Grammatical Error Diagnosis Task》
•
将CGED问题视为序列标记问题,使用双向LSTM单元作
为RNN单元对输入序列进行建模
•
因缺少训练数据,所以特征工程非常重要
11. 模型方法:有道NLPCC-2018 CGEC
Chinese Grammatical Error Correction (CGEC) 2018年NLPCC语法纠错比赛Top1方案
Paper:有道NLPCC-2018 CGEC任务论文:A Neural Machine Translation Approach to Chinese Grammatical Error Correction
• 修正浅层错误(拼写错误、标点错误)
• 检测并改正语法错误
• Ensemble
• 基于词的模型语法错误表现好,在拼写错误表现差
• NMT模型使用不同粒度输入:char,
char+subword,subword,subword+char
•
5gram语言模型排序
12. 模型方法:Seq2Seq
基于encoder-decoder尝试端到端解决纠错问题
Seq2Seq模型结构:
Seq2Seq_attn模型结构:
pycorrector seq2seq预测结果:
sighan2015 样本:
source
target
今天是他第一次有棵可是他不局道怎么去。 今天是他第一次有课可是他不知道怎么去。
我们来家里面,然后讨润以下怎么回去。 我们来家里面,然后讨论一下怎么回去。
13. 模型方法:ConvSeq2Seq
微软亚洲研究院使用ConvSeq2Seq对英文语法纠错超过人类水平
Paper: Reaching Human-level Performance in Automatic Grammatical Error Correction: An Empirical Study
问题:
•
受到训练数据的影响,训练数据中没有见过的语法错误,
方案:
•
不能很好地改正
•
多个错误同时存在的时候,很难做到一次全部都修正
Fluency boost learning,即在训练过程增加数据,让模
型能够看到更多的错误,增强模型的泛化能力
•
Boost inference,即预测过程中进行增强,一是多轮预
测,二是循环预测
14. 模型方法:ConvSeq2Seq
Fluency Boost learning 方案
15. 模型方法:ConvSeq2Seq
Boost inference 方案
A. multi-round
B. round-way
与人类语法改错水平比较:
16. 模型方法:ConvSeq2Seq
ConvSeq2Seq模型结构
17. 模型方法:ConvSeq2Seq
ConvSeq2Seq模型实现逻辑
Git更新日志:
• fairseq -> simpletransformers
• tf->pytorch版本
• transformers 版本更新,1.x版本->2.x版本-
>4.x版本
预测结果:
18. 模型方法:Soft-Masked Bert
Soft-Masked BERT 应用于中文拼写纠错
Paper:Spelling Error Correction with Soft-Masked BERT ACL 2020 字节跳动
创新点:
• 纠错分为:检测网络(Detection)和纠正网络(Correction)
• 以检测网络的输出作为权重,将 masking 特征添加到各个输入字符,即
“Soft-Masked”
检测网络:
• 检测网络由Bi-GRU组成
• 输出是每个位置 i 可能为错别字的概率 p(i),值越大->出错概率大。
Soft Masking:
纠正网络:
• 一个基于BERT的序列多分类标记模型
• 将每个字特征过一层 Softmax 分类器,从候选词表中输出概率最大的字
符认为是每个位置的正确字符
19. 模型方法:Soft-Masked Bert
Soft-Masked BERT 应用于中文拼写纠错
损失函数由检测网络和纠正网络加权构成
https://github.com/gitabtion/BertBasedCorrectionModels
20. 模型方法:MacBert
MacBert(MLM as correction)减轻了预训练和微调阶段两者之间的差距
模型结构:
•
掩码方式的对比:
不用改动现有Bert结构,只改掩码方式:
• 使用全词掩码技术以及N-gram掩码
• 其中unigram至4-gram的概率分别为40%、30%、
20%、10%
•
对输入序列总长度15%的token进行掩码:
• 80%的情况下会替换为相似词
• 10%的情况下会替换为随机词
• 10%则不进行任何替换(负样本)
•
相似词mask优于部分mask
(bert)
MSRA 中文命名实体识别:
•
全部mask和部分mask,下
游任务性能下降明显
2.
效果:
•
1.
BERT f1 = 94.59% MacBERT f1 = 95.20%
pycorrector MacBert纠错:P:63.64% R:63.64%
21. 模型方法:ERNIE-CSC
针对中文纠错:构建预训练语言模型MLM-phonetics和微调下游纠错任务
Correcting Chinese Spelling Errors with Phonetic Pre-training ACL-IJCNLP 2021 百度
错误检测:
错误纠正:
• 输入:单词嵌入+拼音嵌入
• 错误纠正公式:
Jointly Fine-tuning:
•
联合建模的方式:
22. 模型方法:ERNIE-CSC
针对中文纠错:构建预训练语言模型MLM-phonetics和微调下游纠错任务
Pre-training MLM-phonetics(加入语音信息的Mask语言模型):
模型效果:
Taskflow一键预测:
项目地址:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/text_correction/ernie-csc
23. 模型方法:PLOME
针对中文纠错:构建预训练语言模型PLOME和微调下游纠错任务
Paper:PLOME: Pre-training with Misspelled Knowledge for Chinese Spelling Correction ACL 2021 腾讯
PLOME任务:
字符预测任务Loss:
拼音预测任务Loss:
总体Loss:
效果:
项目地址:https://github.com/liushulinle/PLOME
Mask策略:
24. 模型方法:总结
端到端纠错模型
序列标注
建模
copy
• 预测三种编辑操作:分别是保持、删词、加词
• 使用迭代序列标注方法预测token级别的编辑操作
• source和target之间有很大的交集,借鉴copy机制,基于去噪自编码预训练,然后引入序列标注和句子级别
copy做多任务
•
生成模型
解码
训练
An Empirical Study of Incorporating Pseudo Data into Grammatical Error Correction EMNLP 2019
seq2seq大部分都在copy,效率可优化,先用序列标注01二分类来识别错误spans,再用seq2seq模型纠
Improving the Efficiency of Grammatical Error Correction with Erroneous Span Detection and Correction EMNLP2020
• 句子有多个错误,一次无法全部改正,使用迭代解码策略,一直解码到无需纠正
• 正确句子不唯一,利用局部beam search增强多样性
• 直接用bert进行encoder初始化做纠错会破坏预训练的表示,训练样本越多,破坏越大,导致灾难遗忘
• 先用纠错语料finetune bert模型,再用bert输出为seq2seq的特征
• 每轮迭代动态随机增加噪声padding、词替换
Encoder-Decoder Models Can Benefit from Pre-trained Masked Language Models in Grammatical Error Correction. ACL2020
25. 工业界方法:百度中文纠错
由于端到端系统的不可控性,工业界大多采用分阶段的纠错架构,错误检测,候选召回,候选排序
三步 Pipeline:
错误检测
•
transformer/lstm+CRF 序列标注模型
候选召回
•
检测句子中错误位置和错误类型
•
模型输入层引入多种特征:词法句法分
析,字词多粒度特征
•
离线候选挖掘,利用大规模的错误对齐
纠错排序
•
deep&wide,deep结合当前错误点上
语料,通过对齐模型,得到字、词、短 下文表示,wide部分基于形音、词法、
语级混淆矩阵 语义、用户行为等特征学习原词与候选
在线候选预排序,召回大量候选,结合 词的多维度距离表示
语言模型和混淆矩阵特征对候选粗筛
•
通过 GBDT&LR 进行排序
26. 工业界方法:平安寿险纠错
分阶段的纠错架构,方便扩展和领域迁移,子模块可插拔
参考:平安寿险PAI公众号文章
27. 工业界方法:总结
Pipeline纠错模块
错误检测
候选召回
纠错排序
• 混淆集+Ngram ppl
• HMM、CRF
• 序列标注+多特征(LSTM+Transformer)
• Bert检测
• 搜索es、solr + 业务实体词
• 生成模型 seq2seq
• 混淆集
• 音似、形似召回:
• 字形、短语、词、编辑距离、公共子序列、公共子串
• 拼音、模糊音、简写拼音、乱序拼音、声母、韵母、近似字、方言
• 实体别名
• wide&deep、gbdt、fm
• 特征:音似、形似、语义等相似度、用户行为,语言模型ppl,bert语义特征,PMI
28. QA