拼写纠正系列
NLP 中文拼写检测实现思路
NLP 中文拼写检测纠正算法整理
NLP 英文拼写算法,如果提升 100W 倍的性能?
NLP 中文拼写检测纠正 Paper
java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
一个提升英文单词拼写检测性能 1000 倍的算法?
单词拼写纠正-03-leetcode edit-distance 72.力扣编辑距离
NLP 开源项目
nlp-hanzi-similar 汉字相似度
word-checker 中英文拼写检测
pinyin 汉字转拼音
opencc4j 繁简体转换
sensitive-word 敏感词
前言
大家好,我是老马。
下面学习整理一些其他优秀小伙伴的设计、论文和开源实现。
感受
这是 2018 年的论文,基于混淆集的方式。
局限性比较大,但是不失为一种解决方案。
论文+实现
论文地址: https://aclanthology.org/D18-1273.pdf
源码地址:https://github.com/wdimmy/Automatic-Corpus-Generation
摘要
中文拼写检查(CSC)是一项具有挑战性但意义重大的任务,它不仅在许多自然语言处理(NLP)应用中作为预处理步骤,而且在日常生活中帮助阅读和理解文本。
然而,使用数据驱动的方法进行中文拼写检查时,存在一个主要限制,即标注语料库不足,无法充分应用算法和构建模型。本文提出了一种新颖的方法,通过自动生成拼写错误构建CSC语料库,这些错误分别是由视觉或语音相似的字符引起的,分别对应OCR(光学字符识别)和ASR(自动语音识别)方法。
基于构建的语料库,针对三个标准测试集,训练并评估了不同的模型。实验结果证明了该语料库的有效性,从而验证了我们方法的有效性。
1. 引言
拼写检查是检测和纠正文本中拼写错误的关键任务(Yu和Li,2014)。这一任务对于NLP应用(如搜索引擎(Martins和Silva,2004;Gao等,2010)和自动作文评分(Burstein和Chodorow,1999;Lonsdale和Strong-Krause,2003))至关重要,因为拼写错误不仅影响阅读,还可能完全改变文本片段的含义。尤其在中文处理过程中,拼写错误可能会更严重,因为它们可能影响诸如分词(Xue,2003;Song和Xia,2012)和词性标注(Chang等,1993;Jiang等,2008;Sun,2011)等基础任务。在导致拼写错误的所有原因中,一个主要原因是日常文本(如电子邮件和社交媒体帖子)中中文输入法的误用。
表1展示了两个此类中文拼写错误的例子。第一个错误的句子包含了一个误用的字符“己”(ji2),它的形状与其正确字符“已”(yi3)相似。在第二个错误句子中,框选的拼写错误“她”(ta1)与其对应的正确字符“他”(ta1)在语音上是相同的。
- T1
我们应该认真对待这些 **己** (ji2) 经发生的事 **已** (yi3)
在我们班上, **她** (ta1) 是一个很聪明的男孩 **他** (ta1)
表1: 两个包含拼写错误的中文句子。拼写错误以红色标记。
第一个句子包含一个视觉上相似的拼写错误,即已 (yi3) 被误拼为己 (ji2)。第二个句子包含一个语音上相似的拼写错误,即他 (ta1) 被误拼为她 (ta1)。
由于可用数据集的数量有限,许多先进的监督模型在这一领域很少被采用,这阻碍了CSC的发展。目前,一些主流方法仍然专注于使用无监督方法,即基于语言模型的方法(Chen等,2013;Yu等,2014;Tseng等,2015;Lee等,2016)。
因此,CSC技术的发展受到限制,直到目前,CSC的性能仍然不令人满意(Fung等,2017)。为了提高CSC的性能,最大的挑战是缺乏标注拼写错误的大规模语料库,而这样的语料库对于训练和应用监督模型具有很高的价值。数据缺乏的问题主要是由于拼写错误的标注是一项昂贵且具有挑战性的任务。
为了解决数据不可用的问题,并促进CSC的基于数据驱动的方法,本文提出了一种新颖的方法,通过自动构建带有标注拼写错误的中文语料库。
具体而言,由于中文拼写错误主要来源于视觉和语音相似字符的误用(Chang,1995;Liu等,2011;Yu和Li,2014),我们提出了基于OCR和ASR的方法来生成上述两种类型的误用字符。
值得注意的是,与从错误句子中检测拼写错误不同,我们提出的方法旨在自动生成带有标注拼写错误的文本,类似于表1中的错误。借助OCR和ASR方法,CSC语料库可以生成带有视觉和语音拼写错误的标注文本。
在我们的实验中,定性分析表明,OCR或ASR工具包错误识别的中文字符对人类来说并不容易检测,而有趣的是,人们在日常写作中很容易犯这样的拼写错误。在定量比较中,我们将中文拼写检查视为序列标注问题,并实现了一个监督基准模型——双向LSTM(BiLSTM),以评估在三个标准测试数据集上CSC的性能。
实验结果显示,基于我们生成的语料库训练的BiLSTM模型比在标准测试数据集提供的训练数据集上训练的模型表现更好。为了进一步促进CSC任务的发展,我们通过收集每个字符的所有错误变体及其对应的正确参考构建了混淆集。
在错误纠正任务中,混淆集的有效性得到了验证,表明构建的混淆集在许多现有的中文拼写检查方案中具有重要作用(Chang,1995;Wu等,2010;Dong等,2016)。
- 图1
图1:通过基于OCR的方法生成V型错误的示例过程。在OCR检测结果中,除了赝 (yan4),其他三个字符即粟 (li4)、募 (mu4) 和 缉 (ji1),分别被错误识别为栗 (su4)、蓦 (mo4) 和 辑 (ji2)。这三个错误字符与其对应的正确字符在形状上非常相似。
2 自动数据生成
中文拼写错误主要由视觉或语音上相似的字符误用引起(Chang, 1995; Liu et al., 2011; Yu and Li, 2014)。视觉相似字符的错误(以下简称为V型错误)是由于一些视觉上相似的字符对具有显著性。原因在于,中文作为象形文字,包含超过六万多个字符。它们是由有限的部首和组件构成的。至于由语音相似字符误用引起的错误(以下简称为P型错误),我们注意到,汉字的发音通常由拼音定义,拼音由声母、韵母和声调组成(Yang et al., 2012)。在现代汉语中,只有398个音节可以对应成千上万的汉字。因此,很多汉字的发音相似,这进一步导致了P型错误的显著性。在本节的其余部分,我们分别描述如何在2.1和2.2节中生成这两种类型的错误。
2.1 基于OCR的生成方法
受到光学字符识别(OCR)工具容易误识别视觉相似字符的启发(Tong and Evans, 1996),我们故意模糊具有正确字符的图像,并使用OCR工具在其上进行处理,从而生成V型拼写错误。
具体来说,我们使用Google Tesseract(Smith, 2007)作为OCR工具包,生成过程如图1所示。
给定一个句子,首先,我们从中随机选择1至2个字符作为目标字符,进行Tesseract识别,记为Ctargets。
具体而言,除了汉字,其他字符如标点符号和外文字符会被排除,我们还会根据中文维基百科语料库的统计信息,过滤掉低频汉字。其次,我们将Ctargets从文本转化为100 × 100像素的图像,即每个生成的图像大小相同。
第三,我们随机对生成的图像区域进行高斯模糊(Bradski, 2000),目的是使OCR工具产生错误。
最后,我们使用Google Tesseract对模糊图像进行识别。如果识别结果与原字符不匹配,就会生成V型错误,并用此错误字符替换原字符,生成包含V型拼写错误的句子。通过上述步骤,我们为每个句子生成拼写错误及其正确参考。
用于OCR方法的原始文本主要来自人民日报等新闻网站的文章,这些文章经过严格的编辑过程,假设其内容是正确的。
我们通过句末标点符号(如句号“。”、问号“?”和感叹号“!”)对这些文本进行分句(Chang et al., 1993)。
最终,我们得到50,000个句子,每个句子包含8至85个字符,包括标点符号。
然后,我们使用OCR方法处理这些句子,生成一个标注语料库,其中包含约40,000个标注句子和56,857个拼写错误。值得注意的是,在我们的实验中,即使我们对图像进行部分模糊处理,OCR工具仍然能够正确检测图像中的字符,这也解释了为什么生成的标注句子的数量小于原始句子。我们将这个数据集称为D-ocr,并在表3的D-ocr列中展示其统计信息。
不良情况及解决方案
尽管基于OCR的方法运行顺利,但仍有一些值得进一步研究的情况。通过分析该方法生成的拼写错误,我们发现,在形状上,OCR工具有时会错误识别一些与正确字符相差甚远的字符。
例如,在包含字符领(ling3)的模糊图像中,Tesseract错误地识别为铈(shi4),这在形状上与领(ling3)完全不同。因此,这些情况应该被排除,因为人类不太可能犯这样的错误。
为了解决这个问题,我们提出了一种新方法,通过计算汉字笔画的编辑距离来判断两个字符是否在形状上相似。与由字母构成的英语单词类似,汉字可以分解为不同的笔画。为此,我们从在线字典获取汉字的笔画信息。
根据经验,给定两个汉字c1和c2,我们设定0.25 × (len(c1) + len(c2))为阈值η,其中len(c)表示汉字c的笔画数。如果两个字符的编辑距离超过阈值η,我们认为它们在形状上不相似。为了更清楚地说明这一点,图2展示了一个不良案例和一个良好案例。
- F2
- F3
2.2 基于ASR的生成方法
与OCR工具类似,自动语音识别(ASR)工具也可能将一些字符误识别为发音相似的其他字符(Hartley and Reich, 2005)。
为了构建包含P型错误的标注语料库,我们采用与V型错误和OCR工具类似的思路,采用了图3所示的流程。然而,鉴于现有各种语音识别数据集的可用性,我们采用了一种更简化的方法。我们利用一个公开的普通话语音语料库AIShell(Bu et al., 2017),该语料库包含约14万个句子和对应的语音数据。
我们使用Kaldi(Povey et al., 2011)语音识别工具包将这些语音转录为识别后的句子。
最后,通过将识别后的句子与原句进行对比,我们可以识别识别结果是否正确。如果不正确,这些结果将作为识别错误的结果,并用于构建包含P型拼写错误的语料库。
不良情况及解决方案
对于生成的P型错误,我们同样识别出一些可能引入大量噪声的不良情况。为提高生成语料库的质量,因此需要采取解决方案来删除这些不良情况。表2给出了三种不良情况和一种良好情况。我们将逐一描述解决这些问题的方法。
情况1:长度不同的错误识别结果
首先,我们丢弃所有识别结果与对应的参考句子长度不匹配的错误结果。这些错误结果与目标句子的长度明显不同,因此它们不符合我们的预期。情况2:发音完全不同的错误识别字符
第二类错误是识别出的字符与参考句中的字符在发音上完全不同。这些错误不符合我们生成P型错误的需求。为了处理这种情况,我们通过拼音获取汉字的发音,拼音信息来自在线中文词典。然后,我们可以很容易地识别识别错误的字符是否与原句中的字符具有相似或相同的发音。具体而言,按照拼音规则,如果两个字符具有相同的声母和韵母,但声调不同(如:da2 和 da1),则认为它们具有相似发音。情况3:错误字符超过两个
根据Chen et al.(2011)的研究,每个学生的文章平均存在两个错误,这反映了每个句子中平均不会包含超过两个拼写错误。因此,我们移除那些识别错误字符数量超过两个的识别结果,如表2中情况3所示。
通过以上步骤,我们生成了一个包含超过7千个P型拼写错误的语料库。
我们将其称为D-asr,并在表3的D-asr列中展示了其统计信息。
- T3+T4+T5
相关工作
在拼写错误检测与纠正的研究领域,大多数之前的研究主要集中在设计不同的模型以提高中文拼写检查(CSC)的性能(Chang,1995;Huang等,2007,2008;Chang等,2013)。
与这些研究不同,本工作贡献于训练数据集的生成,这是一个重要的资源,可以用来改善许多现有的CSC模型。
目前,有限的训练数据集为许多数据驱动方法设置了很高的门槛(Wang等,2013;Wang和Liao,2015;Zheng等,2016)。
根据我们的了解,至今为止,尚未有大量的常用标注数据集可供CSC使用。
一些先前的研究(Liu等,2009;Chang等,2013)指出,视觉上和语音上相似的字符是中文文本中拼写错误的主要原因,其中语音相似的拼写错误数量约是视觉相似错误的两倍。因此,我们的研究方法采用了视觉和语音相关技术。
作为从图像中提取文本信息的技术,光学字符识别(OCR)通过识别形状并分配字符来处理图像中的文本。根据Nagy(1988);McBride-Chang等(2003)的研究,识别错误的结果主要是由于某些不同中文字符的视觉相似性。
另一方面,自动语音识别(ASR)是一种基于声学的识别过程,用于处理音频流,在这个过程中,语音相似的字符通常会混淆(Kaki等,1998;Voll等,2008;Braho等,2014)。
结论与未来工作
本文提出了一种混合方法,用于自动生成带有标注拼写错误的中文语料库以供拼写检查使用。
具体来说,我们采用了基于OCR和ASR的方法,通过替换视觉上和语音上相似的字符来生成标注的拼写错误。
人类评估确认了我们提出的方法能够生成常见的错误,这些错误通常是人类会犯的,并且这些错误可以作为有效的标注拼写错误用于CSC。
在实验中,我们在生成的语料库上训练了一个神经标注模型,并在基准数据集上测试了结果,确认了语料库的质量,进一步证明了我们提出的语料库生成方法对于CSC的有效性。
通过我们提出的方法生成的大规模标注数据集,能够为改进数据驱动模型的性能提供有用的资源,因为大规模标注数据的可用性是应用任何算法或模型之前的首要步骤。在
本文中,我们没有在CSC模型设计方面投入过多的精力,这将作为未来的潜在工作。
为了促进相关研究并为其他研究者提供帮助,我们将本文的代码和数据公开,地址为:https://github.com/wdimmy/Automatic-Corpus-Generation。
致谢
作者特别感谢Xixin Wu在ASR实验中的建议和帮助。
此外,作者还感谢Li Zhong、Shuming Shi、Garbriel Fung、Kam-Fai Wong以及三位匿名审稿人对本研究的各个方面所提供的帮助和宝贵意见。
参考资料
https://github.com/wdimmy/Automatic-Corpus-Generation/blob/master/README.md