一、项目背景
为了对项目当中一些query的拼写错误进行修改,防止错误数据对搜索造成的影响,尝试对query进行拼写纠错,但是目前市面上的纠错方案大部分都是中文的,用在单词类别语言上效果都不太好,而且都没有主要考虑上下文之间的关系,他们更加关心混淆字以及同音字类型纠错,这些方案等价到单词类型语言时,就变成编辑距离加上词频进行纠错,但是本框架结构,不单单是挑选词频较高的单词,更加注重上下文的关系,使得纠正完成后的query更加符合用用户的意图,还有一些用BILSTM后者CNN+LSTM来做拼写纠错,但是相对于transform来说特征抽取的能力就相对较弱,由此产生了现如今的Bert+ngram框架结构(目前正在尝试加一个GAN网络)。
- 项目概要
1、拼写纠错一般可以拆分成两个子任务:
Spelling Error Detection:按照错误类型不同,分为Non-word Errors和Real-word Errors。前者指那些拼写错误后的词本身就不合法,如错误的将“giraffe”写成“graffe”;后者指那些拼写错误后的词仍然是合法的情况,如将“there”错误拼写为“three”(形近),将“peace”错误拼写为“piece”(同音),将“two”错误拼写为“too”(同音)。
Spelling Error Correction:自动纠错,如把“hte”自动校正为“the”,或者给出一个最可能的拼写建议,甚至一个拼写建议列表
2、Non-word拼写错误
拼写错误检测Spelling error detection:任何不被词典所包含的word均被当作拼写错误(spelling error),识别准确率依赖词典的规模和质量。
拼写纠错Spelling error correction:查找词典中与error最近似的word,常见的方法有:最短加权编辑距离(Shortest weighted edit distance)和最高噪音通道概率(Highest noisy channel probability)。
3、Real-word拼写错误
拼写错误检测Spelling error detection:每个word都作为拼写成员(spelling error candidate)。
拼写纠错Spelling error correction:从发音和拼写等角度,查找与word最近似的words集合作为拼写建议,常见的方法有最高噪音通道概率(Highest noisy channel probability)和分类(Classifier)。
三、项目结构
Bert_gpt_dict版本:
用的是词典加上pycorrect+bert+编辑距离+GPT来做,但是后来发现GPT从候选词中挑选正确词的能力不够,尽管已经对GPT经过多轮的训练,但是效果依然不是很好,准确率很难提升上去,问题在于GPT是一个生成模型,而且他是一个单向Transformer结构,无法兼顾后面方向的序列,降低了对当前query的理解力,相对于双向的bert模型来说。
Soft_mask_bert版本:
我们复现了soft纠错模型,去掉了其中同音字,以及混淆字,因为对于单词来说并不存在这两项,我们只能换另外一一种策略,这里面就包含了第二版的一些策略方案,并且在汉语的纠错时,每一个字符都单独唯一的对应一个Id,但是对于单词来说这个词表实在太大,必须使用BPE分词,这就会造成模型的输出结构并不像中文一样输出单个字符,而是输出一个单词的各个词片,由于多个词片散落分布增大了模型的对于整个单词识别难度。
四、项目特点:
- 键位提高单词召回几率,有根据键位来适当的提高权重,提高模型的纠正的准确率,我们会对当前嫌疑词的候选进行挑选,如果他们中有一些的错误类型(不论是增加,删除,替换,修改),如果他们嫌疑词的错误字符是在键盘权重之中的,我们都会适当的提高权重,以此增加该类型单词的找回概率,提高模型纠正的准确率。
- ngram统计上下文关系,由于我们更加注重纠错完成之后的query是否是用户真实的意图,所有这个时候我们在进行纠错的时候就不能单单只是考虑单词的词频词频,而是更应该注重上下文的信息,虽然bert生成的候选词考虑到了上下文,但是我们候选词不单单是由bert prediction构成,还加入了编辑距离,这个时候就需要一个考虑上下文的策略去对所有候选词,进行一个最优的选取,而ngram就是一个很好的选择,这里我们为防止单个单词词频过高权重过大对整个词组的打分造成影响,修改了ngram结构,使得更加注重上下文信息,以此也可以增加模型的正确率
- 词片合成解决召回率低问题,bert模型的进行训练和预测结果时候,我们都会根据当前词片的的大小制定MASK的个数以保证bert尽可能的学到更多的东西,并且在预测的时候我们会把所有的词片进行组合穷举所有Real Word单词,以此保证模型不会对当前query造成过度纠错,降低准确率和拉低效率
- GAN网络结构提高执行效率,目前正在尝试在框架之前加上一个GAN网络结构,我们会制造一个生成器和判别器模型,以此让他们之间相互学习,以此达到提高模型的检测错误的能力,由于当前模型结构是一个bert,所以我们会取出最后的一层中第0维放到了两个线性层中,最后输出一个二维的向量,作为判断句子正确与否的标志,主要是为了让模型学习query纠错的能力,让模型更快地判断的query的准确性,以避免后续执行操作浪费的时间,
- 当前框架可以和google api进行结合,以此达到模型进行不断训练的目的,由于我们的线上会不断的产生query数据,这query数据我们都可以保存下载下来,先交给我们的google api进行处理,然后拿到他纠正之后的结果,可以对我们的数据集进行不断地扩充,以此用更多的数据来训练我们的模型,增大我们的字典库,使得我们的整个框架不断进行自我迭代,并且这些操作都可以由一个统一脚本来控制,设置一个固定的周期来进行自我升级,从而真正实现一个人工智能。
六、个人总结:
1、softmaskbert 应该更倾向于中文或者单个词不适合进行词片切分的语言,因为他在进行错误检测的时候,pi权重对于同一个词的不同词片可能会有区别,并且当错词和正确词的词片个数不相等时对于结果也会造成一些影响。我们对soft mask bert的数据集进行扩充,扩大了数据集中错误的比例分别设置为1:1,1:2,1:4,1:n,以此来增强模型对错误数据的纠正能力,但是最后试验效果还是没有很理想。
2、对于短文本进行纠错的时候应该更加考虑词与词之间的关系,以此来避免纠正完成之后的关联单词不是用户意图单词问题。
3、还有一个就是当前正在使用框架结果,bert加上n-gram前者主要用来预测,后者用来纠错,但是bert 进行预测的时候可能会有一些正确词检测错误,这种一般后续都可以解决,但是 对于一些错词 检测为正确,没被识别正确可能会造成其他影响,后续会对该类问题进行针对解决。
4、可以尝试深入到字符级进行纠错,使用一个嵌套的bert模型首先对字符级进行纠错,然后再让外层bert对整个句子进行纠错。
个人见解 不对的地方请多多指教