赞
踩
文本纠错相关资料
1.http://www.doc88.com/p-8038708924257.html
2.http://blog.csdn.net/glanderlice/article/details/53005791
3.https://www.zhihu.com/question/37258748
4.自然语言处理中的N-Gram模型详解
http://blog.csdn.net/baimafujinji/article/details/51281816
5.中文纠错实战
http://blog.csdn.net/jccg3030/article/details/54909290
6.NLP自然语言处理相关技术说明及样例(附源码)
https://segmentfault.com/a/1190000010320214
7.基于seq2seq模型的中文纠错任务
http://media.people.com.cn/n1/2017/0112/c409703-29018801.html
8.词自动纠错
http://blog.csdn.net/helihongzhizhuo/article/details/50498693
9.搜索引擎关键字智能提示的一种实现
https://tech.meituan.com/pinyin-suggest.html
10.RNNLM toolkit 下载 0.3e版本使用示例 rnnlm-0.4b版本使用实例
http://blog.csdn.net/u011500062/article/details/50802892
11.开源语言模型工具包
http://www.vipzhuanli.com/pat/books/201410778108.3/2.html?page=1
12.中文相似度匹配算法
https://blog.csdn.net/chndata/article/details/41114771
13.中文(语音结果)的文本纠错综述 Chinese Spelling Check
https://blog.csdn.net/lipengcn/article/details/82556569
14.中文文本纠错算法走到多远了?
https://blog.csdn.net/sinat_26917383/article/details/86737361
15.文本纠错 N-gram 修改提示
https://blog.csdn.net/qq_25439417/article/details/83111345
简述 bert
Bert 是一个预训练语言模型,它主要有两个任务。第一个任务是将数据集中的句子随机遮掩一部分,通过训练,来预测这些词是什么,加强了句子内部之间的联系;第二个任务是判断两个句子是否是连续的上下句,通过训练来识别,加强了句子外部之间的联系。
bert 的创新点在于它将双向 Transformer 用于语言模型,Transformer 的 encoder 是一次性读取整个文本序列,而不是从左到右或从右到左地按顺序读取,这个特征使得模型能够基于单词的两侧学习,相当于是一个双向的功能。
bert 相较于rnn,lstm可以并发进行,并且可以提取不同层次的信息,反应更全面的句子语义。相较于 word2vec,根据句子上下文获取词义,避免了歧义出现。缺点就是模型参数太多,而且模型太大,少量数据训练时,容易发生过拟合。
Bert怎样实现mask的
在句子中随机遮盖15%的单词,通过学习来预测这些词是什么,同时15%的词中有80%用[mask]来替换,10%用原词,剩余的10%用随机词来替换。
在判断两个句子是否连续,从数据集选择两个句子,其中一个句子是上一个句子的下一句的概率为50%,剩下的50%是由数据中随机选取的一句话
为什么选取的15%的词中有80%用[mask]来替换,10%用原词,剩余的10%用随机词来替换
不全部用mask来遮掩,是因为下游任务微调中不会出现mask,这样会导致预训练模型和下游任务不匹配。同时在预测时,因为不知道这个词是否是正确的,会使模型更加依赖上下文,有一定的纠错能力。
bert的模型结构
bert 是由transformer的编码器构成的。
小Bert是由12个transformer的编码器组成,大bert是由24个transformer的编码器组成,同时相较于transformer的输入而言,bert的输入多了segment id。
bert的输入
bert的输入是三部分,input_id segment_id 和position_id
input_id 就是将输入转换成词表中的id
segment_id就是区分句子是第几个句子
position_id是记录句子中词的顺序
形式:[cls]上一句话,[sep]下一句话.[sep]
bert的输出
bert的输出有两种,一种是get_sequence_out(),获取的是整个句子每一个token的向量表示,输出shape是[batch_size, seq_length, hidden_size];
另一种是get_pooled_out(),获取的是整个句子中的[cls]的表示,输出shape是[batch size,hidden size]。
bert的优点和缺点及可以改进的地方
优点
bert将双向 Transformer 用于语言模型,Transformer 的 encoder 是一次性读取整个文本序列,而不是从左到右或从右到左地按顺序读取,这个特征使得模型能够基于单词的两侧学习,相当于是一个双向的功能。
bert 相较于rnn,lstm可以并发进行,并且可以提取不同层次的信息,反应更全面的句子语义。相较于 word2vec,根据句子上下文获取词义,避免了歧义出现。
缺点
bert模型参数太多,而且模型太大,少量数据训练时,容易发生过拟合。
bert模型预训练会出现mask,而在下游的微调任务中并不会出现,使得不匹配。
bert模型会将词分成词根一样的词片,若随机遮掩一些词的时候,若遮掩住中间的的词片,则会发生不是根据上下文的语义预测的。
eg:是根据probability 这个词被切分成”pro”、”#babi”和”#lity”3 个 WordPiece。有可能出现的一种随机 Mask 是把”#babi” Mask 住,但是”pro”和”#lity”没有被 Mask。这样的预测任务就变得容易了,因为在”pro”和”#lity”之间基本上只能是”#babi”了。这样它只需要记住一些词(WordPiece 的序列)就可以完成这个任务,而不是根据上下文的语义关系来预测出来的。类似的中文的词”模型”也可能被 Mask 部分(其实用”琵琶”的例子可能更好,因为这两个字只能一起出现而不能单独出现),这也会让预测变得容易。
为了解决这个问题,很自然的想法就是词作为一个整体要么都 Mask 要么都不 Mask,这就是所谓的 Whole Word Masking。
分词模块:FullTokenizer
BasicTokenizer类
进行unicode转换、标点符号分割、小写转换、中文字符分割、去除重音符号等操作,最后返回的是关于词的数组
WordpieceTokenizer类
WordpieceTokenizer的目的是将合成词分解成类似词根一样的词片。
例如[“unaffable”]切分为[“un”, “##aff”, “##able”]}这么做的目的是防止因为词的过于生僻没有被收录进词典最后只能以[UNK]代替的局面,因为英语当中这样的合成词非常多,词典不可能全部收录。
elmo、GPT、bert三者之间有什么区别?
特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
单/双向语言模型:GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子
源码中Attention后实际的流程是如何的?
Transform模块中:在残差连接之前,对output_layer进行了dense+dropout后再合并input_layer进行的layer_norm得到的attention_output
所有attention_output得到并合并后,也是先进行了全连接,而后再进行了dense+dropout再合并的attention_output之后才进行layer_norm得到最终的layer_output
文本纠错,是自然语言处理领域检测一段文字是否存在错别字、以及将错别字纠正过来的技术,一般用于文本预处理阶段,同时能显著缓解智能客服等场景下语音识别(ASR)不准确的问题。
本文将通过以下几个章节简要介绍文本纠错相关知识。
生活中常见的文本错误可以分为(1)字形相似引起的错误(2)拼音相似引起的错误 两大类;如:“咳数”->“咳嗽”;“哈蜜”->“哈密”。错别字往往来自于如下的“相似字典”。
其他错误还包括方言、口语化、重复输入导致的错误,在ASR中较为常见。
现有的NLP技术已经能解决多数文本拼写错误。剩余挑战、纠错难点主要在于,部分文本拼写错误需要常识背景(world-knowledge)才能识别。例如:
“求胜欲”和“求生欲”在自然语言中都是正确的,但是结合上下文语境来分析,显然后者更为合适。
最后,文本纠错技术对于误判率有严格的要求,一般要求低于0.5%。如果纠错方法的误判率很高(将正确的词“纠正”成错误的),会对系统和用户体验有很差的负面效果。
错别字纠正已经有很多年的研究历史。常用的方法可以归纳为错别字词典、编辑距离、语言模型等。
构建错别字词典人工成本较高,适用于错别字有限的部分垂直领域;编辑距离采用类似字符串模糊匹配的方法,通过对照正确样本可以纠正部分常见错别字和语病,但是通用性不足。
所以,现阶段学术界和工业界研究的重点一般都是基于语言模型的纠错技术。2018年之前,语言模型的方法可以分为传统的n-gram LM和DNN LM,可以以字或词为纠错粒度。其中“字粒度”的语义信息相对较弱,因此误判率会高于“词粒度”的纠错;“词粒度”则较依赖于分词模型的准确率。
为了降低误判率,往往在模型的输出层加入CRF层校对,通过学习转移概率和全局最优路径避免不合理的错别字输出。
2018年之后,预训练语言模型开始流行,研究人员很快把BERT类的模型迁移到了文本纠错中,并取得了新的最优效果。
BERT与以往深度学习模型的主要区别在于:预训练阶段使用了“掩码语言模型”MLM和“判断s1是否为s2下一句”NSP两个任务,特征抽取使用12层双向Transformer,更大的训练语料和机器「More Money,More Power」。其中,MLM任务使得模型并不知道输入位置的词汇是否为正确的词汇(10%概率),这就迫使模型更多地依赖于上下文信息去预测词汇,赋予了模型一定的纠错能力。
一种简单的使用方式为,依次将文本s中的每一个字c做mask掩码,依赖c的上下文来预测c位置最合适的字(假设词表大小为20000,相当于在句子中的每一个位置做了一个“20000分类”)。设置一个容错阈值k=5,如果原先的字c出现在预测结果的top5中,就认为该位置不是错别字,否则是错别字。
当然这种方法过于粗暴,很可能造成高误判率。作为优化,我们可以使用模型预训练的方式对BERT进行微调,显著改进纠错效果。纠错的领域最好和微调领域相同(如果需要在新闻类文章中纠错,可以使用“人民日报语料”对模型微调)。
为了弥补baseline方法的不足,最大限度发挥BERT功效,复旦大学的研究人员在2020 ACL上发表了最新论文——“Spelling Error Correction with Soft-Masked BERT”。
论文提出的模型主要创新点在于两点:
(1)将文本纠错划分为检测网络(Detection)和纠正网络(Correction)两部分,纠正网络的输入来自于检测网络输出。
(2)以检测网络的输出作为权重,将 masking 特征添加到各个输入字符,即“Soft-Masked”。
论文简要分析
具体来看,模型Input是字粒度的word-embedding,可以使用BERT-Embedding层的输出或者word2vec。检测网络由Bi-GRU组成,充分学习输入的上下文信息,输出是每个位置 i 可能为错别字的概率 p(i),值越大表示该位置出错的可能性越大。
检测网络 与 Soft Masking
Soft Masking 部分,将每个位置的特征以 p(i) 的概率乘上 masking 字符的特征,以(1-p(i))的概率乘上原始的输入特征,最后两部分相加作为每一个字符的特征,输入到纠正网络中。原文描述:
纠正网络
纠正网络部分,是一个基于BERT的序列多分类标记模型。检测网络输出的特征作为BERT 12层Transformer模块的输入,最后一层的输出+Input部分的Embedding特征(残差连接)作为每个字符最终的特征表示。
最后,将每个字特征过一层 Softmax 分类器,从候选词表中输出概率最大的字符认为是每个位置的正确字符。
整个网络的训练端到端进行,损失函数由检测网络和纠正网络加权构成。
实验结果
作者在“SIGHAN”和“NEWs Title”两份数据集上做了对比实验。其中“SIGHAN”是2013年开源的中文文本纠错数据集,规模在1000条左右。“NEWs Title”是从今日头条新闻标题中自动构建的纠错数据集(根据文章开头展示的相似字形、相似拼音字典),有500万条语料。
Soft-Masked BERT 在两份数据集上几乎都取得了最好结果。同时我们发现,Finetune对于原始BERT的表现具有巨大的促进作用。
论文代码作者暂未开源,但是论文的模型和思路应该是非常清晰易懂的,实现起来不会太难。这儿先立个flag,有时间自己来实现一下。
笔者简单调研发现,文本纠错网上已经有不少的开源工具包供大家使用了。其中最知名的应该是pycorrector,支持kenlm、rnn_crf、seq2seq、BERT等各种模型。结合具体领域的微调和少量规则修正,应该可以满足大部分场景中的文本纠错需求了。
Demo中笔者使用了经人民日报语料微调过的BERT模型,通过pycorrect加载来做基于MLM的文本纠错。识别结果还算可以,甚至“金字塔”这种需要常识的错别字都纠正出来了。
当然pycorrect还支持各种语言模型和DNN模型,供大家自行把玩了: )
此外,笔者还找到一个基于京东客服机器人语料做的中文纠错模型。
https://github.com/taozhijiang/chinese_correct_wsd
主要解决同音字自动纠错问题,比如:
不过仓库上一次更新在5年前,年代久远估计效果有限。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。