每天给你送来NLP技术干货!


来自:NLP日志
提纲
1 简介
2 检测任务
3 纠正任务
4 总结
参考文献

1 简介

在很多中文NLP相关的落地场景都会涉及到文本纠错的相关技术,例如跟各种形式机器人的语音或者文字对话,或者用手机扫描相关的PDF或者图片,或者跟人聊天时用输入法打字等等,无论是通过ASR识别的语音信息,通过OCR识别得到的图片信息,还是用户真实通过输入法的文字,都有可能出现错误。这些错误会影响文本的可读性,不利于人和机器的理解,如果这些错误不加处理,会传播到后续的环节,影响后续任务的效果。常见的中文错误类型包括以下几种,
    a) 发音相近,眼睛蛇 vs 眼镜蛇
    b)字形相近,高粱 vs 高梁
    c) 词序颠倒,和平 vs 平和
    d) 拼音全拼或者缩写,Shenzhen vs 深圳
    e) 不符合语境,流浪法师是一个法师 vs 六郎法师是一个法师
    f) 不符合常识,广州海珠区 vs 深圳海珠区
在不同的场景下出现的不同的错误类型的占比也不尽相同,但是无论哪种错误,都会影响文本的质量,妨碍人或者机器的阅读理解。而NLP的大部分模型都是通过高质量的中文数据训练得到的,训练语料中没见过这些错误类型,所以如果推理时的文本输入带有这些错误,一定程度上会影响模型的理解,从而使得模型的推理效果大打折扣。
    中文文本纠错任务就是检测出文本中的错误并且进行纠正,这跟小学语文老师给大家改作文的方式如出一辙,不仅要注明那个位置出错了,还要给出相应的改正措施。中文文本纠错任务包括两部分,一方面是检测任务,一方面是纠正任务,必须同时正确检测到错误的位置并且完成纠正才能算完整的纠错。任何一部分出了差错都会影响最后的效果,尤其是检测模块误判了没有出错的位置并且进行了误纠,就会将正确的内容改成不正确的,会让文本变得更加糟糕。为了更加合理的评估不同模型的纠错效果,一般都会分别计算检测任务跟纠正任务的准确率,包括准确率,精确率和F1,进而做一个整体的评估。同时中文文本纠错任务一般都是基于字为基本单位的。如果是以词为基本单位的,一方面是分词过程有可能引入别的错误,另一方面是文字的错误也会影响分词的效果。但是对于中文,词所蕴含的语义信息往往更加丰富,所以有时候虽然纠错任务是以字为基本单位的,但是可以将词的信息作为字的额外特征加到模型中去,进一步丰富字的信息。

2 检测任务

中文文本纠错任务中的检测任务负责对文本的所有字进行判断,判断每个字是否有错误。看起来像是一个标准的序列标注任务,每个位置有两种可能,正确 或者 错误。检测任务能采用的模型有很多,传统的方法用特征工程+HMM或者CRF,或者用神经网络来编码文本的信息,然后再加上一个全连接层或者CRF。检测任务存在的价值主要是为了检测那些可能出现错误的位置,后续任务再针对那些出错的位置进行排查即可。没有检测任务的话,就需要对每个位置进行纠正,那样可能的组合数量就非常庞大,耗时就难以被接受。

3 纠正任务

    经过检测任务可以得到所有可能错误的位置,纠正网络需要对所有可能出错位置进行纠正(存在一种可能,纠正前的结果跟纠正后的结果一致,相当于不会去改变某个位置的字),这里可以选择的纠正的方法有多种。

3.1 传统方法

    a) 通过规则生成可能的候选项。借助于混淆集可以生成可能错误位置上的候选,网上有通用领域下常见中文错误的混淆集,涵盖包括发音或者字形容易混淆的情形。如果想要在垂直领域上有更好的纠错效果的话也需要去统计具体场景下相关的错误,并制作相关的混淆集。混淆集的方法就是相比比较笨重,候选项的可能选择有限。
    b) 比较不同候选项之间的差异,选择其中最合适的候选项作为最终的纠正结果。这里通常是利用语言模型计算不同候选项的得分从而选取最合适的结果,例如选择其中使得3-gram平均得分最高的候选项。

3.2 掩码语言模型

MLM语言模型的预训练任务就有利用上下文信息来预测当前位置上的词的任务,所以可以利用MLM语言模型来生成错误位置上可能的候选,并选取其中概率最大的候选作为当前的结果。但是由于中文文本纠错场景跟MLM语言模型的预训练任务之间有所差异,为了保证纠正效果,需要将MLM语言模型在文本纠错任务下做进一步微调。

4 总结

在真实场景中,如何构建纠错模型需要具体问题具体分析。
    a) 能用规则解决的就用规则解决,安全高效简单。例如我的场景下就是某些专有名词经常识别错误,那么这种时候就用规则解决就行。
    b)多考虑规则加模型相结合的方式。完全依赖模型的方法风险系数比较高,完全依赖规则的方式就很笨重,缺乏泛化能力,很多稍微灵活点的case无法处理。
    c) 传统的文本纠错系统会把检测任务跟纠正任务作为pipeline的方式依次执行,基于规则的方式可以没有检测任务,直接利用混淆集+语言模型去纠正,但基于模型的方式则不推荐这样做,因为MLM模型并没有充足的检测能力,直接做纠正很容易导致误纠。
    d) 现在有不少sota的方法都是联合检测任务跟纠正任务直接做成端到端的系统,进而避免pipeline方式的错误传播。
    e) 基于MLM语言模型的方法里,预测错误大部分来自于前面检测任务的错误,这也说明了MLM模型非常适用于纠正任务。
    f) 目前看来两种主要类型错误,现有的方法都不能很好处理。第一种是需要强大推理能力才能解决的,例如“他主动拉姑娘的手,心里很高心,嘴上却故作生气”中要把“高心”改成“高兴”还是“寒心”?另一种是需要具备现实世界的知识才能解决的,例如“芜湖:女子落入青戈江,众人齐救援。”需要知道相关的地理知识才能把“青戈江”纠正为“青弋江”。
(PS:想要直接上手的朋友可以参考一个百度大佬的项目,https://github.com/shibing624/pycorrector,个人觉得这是中文文本纠错做的最全面的一个开源项目了)
最近文章
继续阅读
阅读原文