纠错作为搜索引擎query理解领域的的不可或缺的一部分。
常见错误类型
[ ] 音似:
同音字 “度假”–>“渡假”
模糊音 “福建”–>“胡建”
方言 灰机–>飞机
[ ] 形似
高粱-高梁
壬者荣耀-王者荣耀
[ ] 多字
武当一剑师-武当一剑
[ ] 少字
猪佩奇-小猪佩奇
[ ] 知识性错误
蜡笔小熊-蜡笔小新
纠错方案
[ ] 基于规则方式
词典检测+编辑距离召回+拼音相似度排序
[ ] 基于N-gram语言模型的方式
通过语言模型的ppl来进行错误检测和纠错
[ ] 基于HMM模型的方式
HMM是关于序列的概率模型,描述由隐藏的马尔可夫链随机生成观测序列的过程假设观测序列为待纠错Query,正确Query为不可观测的状态序列。所以这与纠错不谋而合。
[ ] 基于seq2seq深度模型的方式
原始query进过embedding化后进入双向的encode,encode-decode层,最后解码出对应的纠错query。
缺点是对没见过的正确语句,也极大可能给改错,即误纠率很高。
[ ] 基于MLM深度模型的方式
例如:bert、soft-masked bert;
虽然深度模型效果还算可以,但是线上预估的时间复杂度较高,并且不可解释、不可控,实际工程应用中还是要结合传统方法。
研究现状
FASPell
faspell整体上说是分成的两部分,一个是encoder部分,一个是decoder部分,decoder也就是论文种提到的CSD,其原理其实不复杂,encoder部分基本就是bert,先利用bert对输入的句子中每个字进行预测,预测出每个位置topn的潜在文字。接下来,decoder部分从笔画相似性和拼音相似性两个维度综合对topn中的文字进行rank,从而给出模型inference出的正确结果。faspell的重点部分其实还是前面的bert预测部分,当然你要是感兴趣,换成xlnet、gpt都是可以的faspell作者在训练时指出的,就是fine-tune时bert训练数据需要人工的对其每个字均进行mask,而不是任由bert那随机产生的15%几率来mask,作者目的在于强化模型对该垂直领域具备更加强的拟合度在原文中,作者在这部分提出一个训练的概念,这个训练并不是指神经网络的那种训练,而是根据训练集找到两个权重,分别是笔画的相似性权重和拼音的相似性权重,每个预测字使用:笔画权重笔画相似度+拼音权重拼音相似度,来得出每个预测字的整体置信度。
通过训练一个以BERT为基础的深度降噪编码器(DAE)和以置信度-字音字行相似度为基础的解码器(CSD)进行中文拼写纠错。在DAE阶段,BERT可以动态生成候选集去取代传统的混淆集,而CSD通过计算置信度和字音字形相似度两个维度去取代传统的单一的阈值进行候选集的选择,提高纠错效果。
Unicode标准的Ideographic Description Sequence(IDS)表征。描述汉字更细粒度字体的笔画结构和布局形式(相同的笔画和笔画顺序,例如:“牛”和“午”相似度不为1),比起纯笔画或者五笔编码等计算方式要精细在字音上,使用了所有的CJK语言中的汉字发音,本文用了普通话(MC),粤语(CC),日语(JO),韩语(K)和越南语(V)中的发音,计算拼音的编辑距离作为相似度分值,最终做一个归一化操作。
SpellGCN
现有方法尝试纳入汉字之间的相似性知识,然而,他们将相似性知识作为外部输入资源或仅仅是启发式规则。
本文使用图卷积网络来纳入汉字相似性知识,图卷积网络建模了字之间的先验依赖知识。
解决问题:之前引入模糊集的方法只是利用模糊集来挑选候选字,而不是显示地建模字符之间的关系。
本文提出新的方法将语音和形状的相似性信息整合到语义空间中。取每个字在bert最后一层的向量,接一个全连接做多分类,主要通过graph convolutional network(GCN)对字音和字形结构关系进行学习,并且将这种字音字形的向量融入到字的embedding中,在纠错分类的时候,纠错更倾向于预测为混淆集里的字。模型训练是一个end-to-end的过程,试验显示,在公开的中文纠错数据集上有一个较大的提升。
模型也主要分两部分组成:
第一部分:特征提取器
特征提取器基于12层的bert最后一层的输出。
第二部分:纠错分类模型
通过GCN学习字音字形相似结构信息,融合字的语义信息和字的结构信息,在分类层提高纠错准确率。
接下来我们具体看下GCN的结构组成部分:
SpellGCN的目标是学习映射函数将lll层节点向量Hl∈RN×DH^l\in\
mathbb{R}^{N\timesD}H
l∈RN×D通过卷积运算映射到新的节点向量Hl+1H^{l+1}H+1
这个映射函数主要有两个组件组成Graph Convolution Operation和AttentiveGraph
Combination Operation。
Graph Convolution Operation:
第一个公式:
因为我们采用了BERT作为抽取器,它有自己的学习语义空间,
所以我们从方程中去掉激活函数,使导出的表示与原始空间保持一致,而不是完全不同的空
间。在本文的实验中,也表明非线性激活如relu对于模型是无效的,将导致效果下降(这个没
有验证)。
Attentive Graph Combination Operation:
为了同时利用发音相似图和形状相似图的,下面使用注意力机制来得到包含两者信息的混合
向量:wa∈RD是一个可学习且各层共享的向量,β\betaβ是一个用来控制注意力权重平滑的超参数。在本文中作者认为β\betaβ对注意力机制起到重要作用。
输出:
在经过图卷积和注意力合并的操作后,我们得到一个第l层的向量表示Cl。为了保持提取
器的原始语义表示,我们将前面所有层的输出进行累加得到新的输出。
soft-masked bert
该网络模型串联了一个检测模型(BiGRU)和一个纠错模型(BERT),双向的GRU模型输出每个token位置是错误词的概率,当错误概率为1时,退化为原生BERT模型纠错。
Soft-MaskedBert的大致原理是基于Bert从句子中的每一个字的候选字组中找到正确的
候选字进行纠错。
Soft-MakedBert将文本的纠错任务分为检测网络和纠错网络两个部分,纠错网络的输入
来自检测网络的输出,
通过soft masking将检测网络的输出字符特征添加mask embedding进行纠错。
假设输入的句长是128,embedding后的维度是768,batchsize就定为16好了,那么bert的embedding部分不会变,依旧是token_embedding+position_embedding+segment_embedding,得到的维度是(16,128,768),接下来将这些输入接入到一个双向的GRU里,输出是(16,128,1536)。此时接一个全链接(1536,768)再变回(16,128,768)。
此时得到的结果就是图中的pi,也就是说该tensor表示的是当前我这个字是是否是错别字
的可能性,当然此处只是检测,该改成啥它还不管。
这里要注意的是pi在计算前会经过一个sigmoid,换句话说,当这个自被认为是错别字时,
pi就接近1,否则则接近0。最终得出的ei’就是一个与bert输入同维度的embeddings:(16,128,768)。接下
来的事就都是跟bert一模一样的事了。
最后,还有个残差计算,bert的12层transformerblock的结果(16,128,768)要
与最开始的输入embedding:ei(16,128,768)进行想加,结果也是(16,128,768),然后接全链接和softmax就可以了。
因为bert的预训练模型本身就很强大,其实很多基于bert改动的网络在预训练的基础上进行finetune后的结果都不会太差。令我疑惑的是smbert最后加的残差网络,ei是带有错字信息的输入内容,好不容易纠错
完的结果最后再加一个带有错误信息的原始输入,不是很懂。
优点:
对中文纠错分成错误检测和错误纠正,并给通过soft-masking技术将两者进行融合,减少bert的过纠问题,提高准确率;
缺点:
不包括少词和多词错误形式纠错
模型没有引入字音字形相似性约束
参考论文集:https://www.pianshen.com/article/85931593325/
transform代码阅读:http://fancyerii.github.io/2019/03/09/transformer-codes/
纠错框架
pycorrector
pycorrector通用纠错模块是github上的开源项目,它提供了一种规则式检错、纠错方案,该方法因逻辑清晰、不依赖大量标注样本从而较容易实现落地,因此为广大研究者提供了良好的借鉴意义。该方案是面向通用领域开发的,思路简单、易实现,但在垂直领域中容易得到较差的表现。
错误检测:混淆集检测、OOV检测、语言模型检测;
候选召回:同音同调、同音异调、形似;
排序阶段:语言模型ppl、规则;
检测:
1.句子查找混淆词典的错词位置,加入错误点数组;
2.未登录词加入错误点数组;
3.语言模型ngram绝对离差值检测;
纠错:
1.切词
2.每个term检测错误点
3.如果当前term有错误,对每个错误点进行派生正确候选集,如果有多个候选集进行排序,选择最优的正确term, 拼装当前的term,进行下一个错误点纠错,直到所有错误点纠正完毕
4.拼装所有term返回。
百度
百度纠错系统凭借其海量用户点击语料训练了基于深度学习的序列标注模型,方法如下:
错误检测:在错误检测部分,它利用10TB的无监督语料预训练Transformer/Lstm、CRF模型,再利用对齐语料(错误句子→正确句子)进行有监督学习该序列标注模型;
候选召回:在候选召回部分,利用了对齐语料和对齐模型构建字级别、词级别、音级别的混淆字典,先利用字、音混淆字典初步召回候选,然后再利用词级别混淆字典和语言模型二次筛选候选,从而形成最终候选;
候选排序:利用上下文DNN特征和人工提取的形音、词法、语义等特征一起训练GBDT&LR的排序模型。
腾讯DCQC
腾讯提出一套针对垂直业务的通用纠错框架——DCQC(Domain Common Query Correction),由召回层和决策层两层组成。该方法可以方便扩展到其他领域。
召回层:每个领域建立属于自己的一个数据库,建立字和拼音两个维度的倒排索引,通过检索排序的方式召回一定量的候选;
决策层:人工提取用户特征、拼音特征、字形特征等5种类型特征训练svm二分类模型用于候选排序。
参考腾讯框架:https://cloud.tencent.com/developer/article/1030059
参考链接:
https://cloud.tencent.com/developer/article/1030059
https://zhpmatrix.github.io/2019/02/01/rethinking-spellchecker/
尝试方案
基于pycorrect规则离线方案
- 基于搜索日志的共现query使用规则产生一版候选集;
- 候选集加入pycorrect中进行纠错检测、纠错召回;
- 基于搜索日志全量数据跑出在线候选集,月度在亿级别;
缺点:
1、覆盖度不全,影响纠错召回能力;
2、词典过于庞大,对机器性能要求大。
具体流程:
1.共现query进行编辑距离的规则限制,按照pv,编辑距离排序;
2.实体join产生的共现候选集;
3.实体和query进行反转去重排序;
4.放入纠错框架中,进行纠错使用,预测所有浏览器query纠错。
注:session 同一个用户五分钟内的搜索算为同一个session。
基于lightGBM的纠错方案
基于实体产生ngram的候选集;
基于全量搜索日志产生纠错候选集;
采用lightGBM模型进行排序截断,产生最优的候选集;
缺点:
1、过纠率提升;
2、特征工程代价高;
3、样本标注成本高;
具体流程:
1.实体进行字符级别ngram大于一个字符,业务query和浏览器query进行部分匹配替换实体,同时用实体拼音部分匹配替换实体来扩充候选集;
2.通过训练质量模型或者排序模型截断或选择最优候选集;
3.特征包括:编辑距离,cqr ctr,BM25, 词召回,准确,精确率,距离比例,ngram ppl,pv,session num,cosession num,共现拼音比例等qanchor数据特征;
4.负样本,正样本百度打标。
lightgbm使用链接:https://lightgbm.apachecn.org/#/docs/6
shap使用链接:http://sofasofa.io/tutorials/shap_xgboost/
word2vec spark链接:https://zhuanlan.zhihu.com/p/60532089
https://yuerblog.cc/2021/01/29/pyspark-%E5%9F%BA%E4%BA%8Eword2veclsh%E5%AE%9E%E7%8E%B0%E7%9B%B8%E4%BC%BC%E5%86%85%E5%AE%B9%E6%9F%A5%E6%89%BE/
kenlm使用链接:https://blog.csdn.net/github_34781135/article/details/103568188
展望
- 引入字形特征
- 为降低过纠率,需要尝试错误检测模型
- 端到端模型