草庐IT

中文文本智能纠错知多少?

移动Labs 2023-03-28 原文
作者|徐婧扬,单位:中国移动智慧家庭运营中心

​Labs 导读

中文文本纠错是针对中文文本拼写错误等进行检测与纠正的一项工作,是自然语言处理的重要应用领域之一。中文文本纠错的应用场景很多,诸如在搜索引擎,问答/对话系统,输入法等领域作为一个前置模块,或作为OCR和ASR检测的后置模块,亦或是公文写作场景,辅助进行公文审阅校对,纠错的质量对后续的处理非常重要。

Part 01  中文错别字类型有哪

我们把常见的中文错别字总结分为三类:

  1. 拼写错误,由于输入法,音转软件等原因导致的用字/词错误,其主要表现为错误使用了同音字,形近字等,也是纠错领域当前研究比较集中的方向;
  2. 语法错误,该类错误主要是由于疏忽或对语言运用不熟悉导致的,如字词缺失、冗余、乱序等,其错误片段相对较大,目前也有一些针对简单句法错误的研究;
  3. 语义错误,该类错误可能由于对某些知识不了解或组织语言能力欠缺等导致,要解决该类问题,通常需要引入外部知识、常识等,当前涉及这部分的研究也比较少。
表1

整体处理难度上:拼写错误 < 语法错误 < 语义错误。

Part 02  智能文本纠错的框架

文本纠错常见思路分为两种:一种是多模型pipeline方法,一种是端到端的方法。

2.1 多模型pipeline方法

把纠错任务分解为错误检测→候选召回→打分排序三个关键步骤,如图1,每个模型解决具体的特定问题,然后通过Pipeline的方式串联,得到最后结果。这种方法的优点是方便针对各个步骤进行重点突破和优化,但也存在明显的缺点是错误会逐级传递,比如,在检测模块识别了非错别字的位置,那么纠错模块针对该位置的纠正也一定是不正确的。

图1

检错模块

检错模块的主要目标是错误识别,识别并定位出文本中的错误字/词位置,若存在则将错误向后传递。

候选召回

候选召回阶段针对检错模块识别到的错误点,结合历史错误信息,以及近音、近形等特征形成纠错候选集合。

纠错模块

纠错模块主要解决候选集合的排序问题,由于纠错的正确结果具有唯一性,该模块的任务是将正确的结果排在第一位。

2.2 端到端的方法

此方法是直接建模原始“错误句子”到修正后的“正确句子”的处理过程,一般这个过程类似于机器翻译任务,如图2,即将错误的句子翻译成正确的句子,一般使用seq2seq类深度学习模型。该方法优点是避免人工提取特征,减少人工工作量,缺点是无法控制特定问题点优化对整个流程的影响。

图2 h代表隐藏层,c代表编码器和解码器之间的状态向量

Part 03  智能文本纠错的一些方案 

3.1 多模型pipeline方法

检错模块

(1)基于规则:例如,抽取ngram级别的拼音,构建实体词与拼音映射词表,将抽取的拼音映射到实体词,比较和原词是否一致。

(2)基于语言模型:利用bert模型的MLM任务,将当前词用mask符号代替,然后做预测,若真实字不在topk内即为错。

候选召回

(1)基于规则:近音候选词召回、字音编辑距离召回。

(2)基于语言模型:利用语言模型等计算错误词可能的topk正确答案。

纠错模块

(1)粗排序:通过构造的特征来对候选词进行粗打分。特征主要包括:语料频率比值、编辑距离等。

(2)精排序:采用机器学习模型等对候选进行打分,同时在特征工程方面也进行了更精细化地处理。

3.2 端到端的方法

(1)FASPell,爱奇艺发布在EMNLP2019的基于词的中文纠错的方法。

(2)Soft-Masked BERT,字节发表在ACL 2020的中文纠错方法。

(3)MLM-phonetics MLM-phonetics,在soft-masked BERT的基础上做的优化。

(4)Dynamic Connected Networks,哈工大&讯飞发表在ACL2021的方法。

(5)Transformer-NMT,网易有道NLPCC2018冠军方案。

(6)ErnieCSC,百度在ACL 2021上提出结合拼音特征的Softmask策略的纠错方案。

(7)MacBert4csc,MacBERT模型改变网络结构的中文文本纠错模型。

图3  文本纠错检错阶段的标注

Part 04  未来方向与挑战 

最后总结一下文本纠错任务的一些挑战和未来方向:

当前的两大方案,pipeline的机制会导致错误逐级放大,同时串联链越长则耗时越长。端到端方案当前缺少足够的标注语料,另外不方便扩展与领域迁移。

文本纠错后续可探索利用知识图谱完善整个纠错任务,或探索融入实体词纠正到模型中,另外该领域还需积累大量的高质量标注样本和混淆集资源。​

有关中文文本智能纠错知多少?的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  3. 亚特兰蒂斯的回声(中文版): chatGPT 的杰作 - 2

    英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古

  4. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  5. ruby-on-rails - rspec - 我怎样才能让 "pendings"有我的文本而不仅仅是 "No reason given" - 2

    我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason

  6. ruby - 如何为 pbcopy 生成富文本链接 - 2

    我一直在玩一个脚本,它在Chrome中获取选定的文本并在Google中查找它,提供四个最佳选择,然后粘贴相关链接。它以不同的格式粘贴,具体取决于当前在Chrome中打开的页面-DokuWiki打开的DokuWiki格式,普通网站的HTML,我想要我的WordPress所见即所得编辑器的富文本。我尝试使用pbpaste-Preferrtf来查看没有其他样式的富文本链接在粘贴板上的样子,但它仍然输出纯文本。在文本编辑中保存文件并进行试验后,我想出了以下内容text=%q|{\rtf1{\field{\*\fldinst{HYPERLINK"URL"}}{\fldrsltTEXT}}}|te

  7. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

    我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

  8. ruby - 如何将一段文本可逆地压缩成更少的 ASCII 字符? - 2

    我想获取任意的ASCII文本字符串,例如“Helloworld”,并将其压缩为字符数较少(尽可能少)的版本,但要采用可以解压缩的方式。压缩版本应仅由ascii字符组成。有没有一种方法可以做到这一点,尤其是在Ruby中? 最佳答案 如果知道只会使用ASCII字符,那就是每个字节的低7位。通过位操作,您可以将每8个字节混合成7个字节(节省12.5%)。如果您可以将其放入更小的范围(仅限64个有效字符),则可以删除另一个字节。但是,因为您希望压缩形式也只包含ASCII字符,所以会丢失一个字节-除非您的输入可以限制为64个字符(例如,有损压

  9. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

    多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

  10. ruby - 使用 Nokogiri 和 Ruby 从 html 文档获取链接和 href 文本? - 2

    我正在尝试使用nokogirigem提取页面上的所有url及其链接文本,并将链接文本和url存储在散列中。FooBar我想回去{"Foo"=>"#foo","Bar"=>"#bar"} 最佳答案 这是一个单行:Hash[doc.xpath('//a[@href]').map{|link|[link.text.strip,link["href"]]}]#=>{"Foo"=>"#foo","Bar"=>"#bar"}拆分一点可以说更具可读性:h={}doc.xpath('//a[@href]').eachdo|link|h[link.t

随机推荐