0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

纠错框架的基本结构

深度学习自然语言处理 来源:CS的陋室 作者:CS的陋室 2020-10-10 11:04 次阅读

纠错框架的基本结构

虽然纠错只是一个看着简单的任务,但是实际上已经构建成了一个非常完整的系统,根据这个系统兼顾很多事情,举几个点:

充分缩小范围,防止过纠,毕竟纠错是NLP系统的上游,过纠的代价非常大。

充分挖掘可能错误的位置,在词汇支持的情况,找到可能正确的结果,保证召回率。

各种抽取特征,能通过更加严谨的方式在多个候选中找到最优的结果。

然后我们来看看一个比较OK的纠错系统结构是什么样的,三大步骤:

错误检测:检测句子错误的部分,后续只对这个部分进行错误纠正。

候选召回:根据识别的错误进行针对性的修改,这块依赖候选集。

候选排序:错误可能有很多。召回的结果也有很多,那个才是最优解,这步需要通过一定的方式得到最优结果。

错误检测

错误检测是文本进入纠错体系的一个大门,设立他的目的有这几个:

缩小纠正范围,降低后续流程的压力。

减少过纠,保证准确率,用户自己输对了却改错了体验非常差。

换言之,我们需要在错误检测中做的是,找到句子中可能出现错误的位置,提取出来任务就完成了,那么,这块有什么方法呢。

最简单的一种方法,就是结合词典去做,这个词典其实已经有比较通用的,那就是jieba的词典(idf.txt),对于绝大部分人而言,输入的东西一般都是TOP的,那么一些未见过的,即未登录词,就很可能是错误的内容了。但需要注意的是,领域内的词汇我们需要补充,词典覆盖率要足够的高,这样识别的准确率才会够高。

第二个方法也是一个无监督的方法——用语言模型。语言模型能评判一个句子出现的概率,换言之,如果句子出现的频次足够低,那这里面就很可能有错误的词汇,再精确到句子中的每个位置,那就是一个局部的n-gram的条件概率了,如果概率比整个句子明显低,那就说明这个位置或者说这个位置附近可能存在错误点,我们可以拿出来。其实这个应该这里几个方法中门槛最低的一个了,只需要语料,不需要挖掘覆盖率足够大的词典,也不需要标注样本,直接可以做。

第三个想说的方法就是序列标注的方法。分词和NER其实都可以抽象为序列标注问题,错误检测也可以,简单的其实就是整个句子中,有错误的标注为1,没错误的标注为0,然后通过CRF之类的方法来进行预测,从而完成抽取。这个能很好的把控准确性,效果还是会比较好的,但问题在于这种标注样本,可能比常规的ner样本更难拿到。

pycorrector我前面提到过,就用了上面1、2两种方法,在开放域里面其实效果不错,但是在垂域,我们就需要更多的语料甚至是重新构建里面涉及的模型和词典。

而在我的实践中,又有如下的经验,大家可以参考:

错误检测这块由于只是纠错系统中的其中一部分,后续还有大量的步骤可以控制,所以我们并不需要对这步做非常高的准确性的要求,抱着“宁可错杀也不放过”的思路去做,保证真正错的部分能被拿出来即可,对准确率可以很大程度的放松。

无论是上面哪种方法,检测错误的时候都要注意,检测出错误的位置可能不是真的问题点,而可能识别出来的未知的附近,因此要扩大召回的话,附近的可以都挑出来试试一起处理。

候选召回

在指导错误的位置以后,我们就要开始对症下药了,那么,什么是可能的药,我们就要开始找了,这就是候选召回的主要任务,针对错误点,我们找可能正确的结果。要找到正确的结果,主要是两种方式:基于词典的和基于NLG的。

基于词典的方式是比较经典而且在现在还是比较常用的方法,说白了我们就要去找一些词汇,我们叫做“混淆集”,也就是一个简单的kv对,遇到什么词,我们就给出一些候选的结果,这个的结果非常简单,但是挖掘会非常困难,搜索领域常用的方式就是共现query,大部分情况下,用户会在没有得到正确结果的时候修正结果重新搜索,所以共现query是一个非常好的挖掘资源。

基于词典的方式纠错的量总有上限,但是总有一些难以召回的情况,因此借助一些NLG的方式,可以扩大召回,这个NLG,是一种文本生成的方式,可以根据上下文纠正的句子,给出一些可能的结果。但是这个方案的缺点是非常依赖平行样本,即一个错误、一个正确的样本,这个获取往往会比较难。

候选排序

现在对一个我句子,我们手里都有很多候选的结果,这里的候选排序主要有两个目的:

判断这么多候选结果中选出最好的几个。

最好的几个相比原来的句子要足够好,才能被纠。

这里,我们需要持续思考的是,这个排序规则改怎么定。

最简单的方式就是使用语言模型的perplexity,即混淆度,这是用来一个句子他真的是句子的打分,一般而言这个正常无错的句子ppl就会比较小,有错的句子是ppl的比较大,可以用这个指标来衡量最佳的纠错结果是什么。

光一个ppl的评判是不够的,不仅仅是ppl的相对量,还有绝对量,还有就是pl虽然下降但是还是很高,还有和ppl无关的因素,如拼音的相似度、和原句的相似度等,因此可以先升级为机器学习,把前面提到的指标抽取为特征,通过简单的机器学习进行计算。

进一步地,同样可以使用平行样本,通过深度学习的方式来衡量是否需要纠正。

其他相关

纠错只是一个系统,我们要在里面添加很多的零件完成各个我们拆解的任务,我们来看看有什么需要做的事情:

语言模型。语言模型在纠错中起到了至关重要的作用,因此一个好的语言模型非常重要,而影响语言模型效果的很大一块因素就是数据,尤其是统计语言模型,通过调整数据集的分布,例如使用特定垂域的语料进行训练,能有效提升最终的效果,但要注意不要把错误句子过多的引入到模型中。

混淆集。混淆集用于候选召回,如果正确结果无法被召回,则效果会受到很大影响,因此我们需要通过多渠道挖掘,在github、知乎等网站,加上一些论文提到的数据中收集外部数据,同时通过用户query,尤其是共现query来获取一些用户容易混淆的错误。有一篇文章提到了,混淆集是纠错的上限,正确答案召回不到,好的错误检测和候选排序都没用。

规则。纠错系统中需要大量的规则,错误检测阶段衡量错误的阈值我们要用规则卡,排序阶段我们也需要一些提权降权保证最终我们需要的内容能排在前面,例如一些专有名词的保护,”电池“不能被改为”滇池“,”嬴政“不能被改为”行政“。这些规则看着简单,但是要想提出这些规则,必须对数据有足够的了解。

小结

一连几篇讨论了纠错,对纠错问题有了比较完整的理解,可以知道一个简单的问题可以进行细化然后构建出完整的系统。最后我放几篇比较好的参考文章,大家可以继续深入阅读。

平安纠错:https://zhuanlan.zhihu.com/p/159101860

中文(语音结果)的文本纠错综述:https://blog.csdn.net/lipengcn/article/details/82556569?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2

责任编辑:lq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 框架
    +关注

    关注

    0

    文章

    399

    浏览量

    17435
  • 纠错
    +关注

    关注

    0

    文章

    5

    浏览量

    13285
  • 语言模型
    +关注

    关注

    0

    文章

    508

    浏览量

    10245

原文标题:深入讨论纠错系统

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    JavaWeb框架比较

    JavaWeb框架为开发人员提供了构建Web应用程序所需的基础设施和组件,每种框架都有其独特的特点和适用场景。以下是对几种主流JavaWeb框架的比较: Spring MVC 优点
    的头像 发表于 11-25 09:14 136次阅读

    卷积神经网络的实现工具与框架

    : TensorFlow是由Google Brain团队开发的开源机器学习框架,它支持多种深度学习模型的构建和训练,包括卷积神经网络。TensorFlow以其灵活性和可扩展性而闻名,适用于研究和生产环境。 特点: 灵活性: TensorFlow提供了丰富的API,允许用户自定义复杂的神经网络
    的头像 发表于 11-15 15:20 205次阅读

    TMS320C64x+和TMS320C674x的检错纠错机制

    电子发烧友网站提供《TMS320C64x+和TMS320C674x的检错纠错机制.pdf》资料免费下载
    发表于 10-12 11:27 0次下载
    TMS320C64x+和TMS320C674x的检错<b class='flag-5'>纠错</b>机制

    bootstrap框架和vue框架的区别

    Bootstrap和Vue都是目前非常流行的前端开发框架,它们各自具有独特的优势和特点。 设计理念 Bootstrap是一个基于HTML、CSS和JavaScript的前端开发框架,主要用于快速构建
    的头像 发表于 07-11 09:55 778次阅读

    bootstrap框架用什么软件开发

    Bootstrap是一个流行的前端框架,用于快速开发响应式和移动优先的Web应用程序。它提供了一套预定义的CSS和JavaScript组件,使得开发者可以快速构建出漂亮的用户界面
    的头像 发表于 07-11 09:50 425次阅读

    鸿蒙Ability Kit(程序框架服务)【应用启动框架AppStartup】

    `AppStartup`提供了一种更加简单高效的初始化组件的方式,支持异步初始化组件加速应用的启动时间。使用启动框架应用开发者只需要分别为待初始化的组件实现`AppStartup`提供
    的头像 发表于 06-10 18:38 667次阅读

    专家解读 | NIST网络安全框架(1):框架概览

    本文主要探讨NIST CSF框架的起源目标、内容组成,及其在网络安全风险管理中的关键作用,通过采用该框架,组织能够更有效地实施风险识别、安全保护、威胁检测和事件响应,从而构建更加坚固和弹性的网络安全基础设施。
    的头像 发表于 05-06 10:30 1313次阅读
    专家解读 | NIST网络安全<b class='flag-5'>框架</b>(1):<b class='flag-5'>框架</b>概览

    Python自动化测试框架及其应用

    Pytest是一个非常成熟的全功能的Python测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大。
    的头像 发表于 04-03 16:15 516次阅读
    Python自动化测试<b class='flag-5'>框架</b>及其应用

    谷歌模型框架是什么软件?谷歌模型框架怎么用?

    谷歌模型框架通常指的是谷歌开发的用于机器学习和人工智能的软件框架,其中最著名的是TensorFlow。TensorFlow是一个开源的机器学习框架,由谷歌的机器学习团队开发,用于构建和训练各种机器学习模型。
    的头像 发表于 03-01 16:25 807次阅读

    谷歌模型框架是什么?有哪些功能和应用?

    谷歌模型框架(Google Model Framework)并不是一个特定的框架,而是指谷歌开发的一系列软件框架,用于支持机器学习和人工智能的应用。以下是一些与谷歌模型框架相关的关键组
    的头像 发表于 02-29 18:11 1419次阅读

    R-Rhealstone框架使用教程

    本篇文章描述基于Rhealstone的系统实时性的测量基准的框架--R-Rhealstone框架
    的头像 发表于 01-18 10:54 1490次阅读
    R-Rhealstone<b class='flag-5'>框架</b>使用教程

    什么是LlamaIndex?LlamaIndex数据框架的特点和功能

    LlamaIndex是一个数据框架,用于让基于LLM的应用程序摄取、结构化和访问私有或领域特定的数据。它提供Python和Typescript版本。
    的头像 发表于 01-05 11:08 9164次阅读
    什么是LlamaIndex?LlamaIndex数据<b class='flag-5'>框架</b>的特点和功能

    什么是逻辑量子比特?怎样用其实现量子纠错呢?

    逻辑量子比特(Logical Qubit)由多个物理量子比特组成,可作为量子计算系统的基本计算单元,因其具有较强的纠错性能而备受关注。
    的头像 发表于 12-21 18:24 959次阅读
    什么是逻辑量子比特?怎样用其实现量子<b class='flag-5'>纠错</b>呢?

    是什么导致RAM中的内存数据损坏?纠错码(ECC)如何修复位翻转?

    是什么导致RAM中的内存数据损坏?纠错码(ECC)如何修复位翻转? RAM中的内存数据损坏可能由多种原因导致。其中一些原因包括电磁干扰、电压波动、温度变化等外部因素,还有由内部设计和制造缺陷
    的头像 发表于 12-15 09:58 2139次阅读

    javaweb的三大框架有哪些

    在JavaWeb开发中,有许多流行的框架可供选择。这些框架旨在提高开发效率、简化开发过程,并为开发人员提供更强大的功能和灵活性。下面是三个在JavaWeb开发中广泛使用的主要框架。 Spring
    的头像 发表于 12-03 11:47 2013次阅读