坚持四项基本原则,开发鲁棒性NLP系统

2024-02-09 03:18

本文主要是介绍坚持四项基本原则,开发鲁棒性NLP系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以前说过,一个 real life 自然语言处理系统,其质量和可用度除了传统的 data quality 的衡量指标查准度(precision)和查全度(recall)外,还有更为重要的三大指标:海量处理能力(scalability), 深度(depth)和鲁棒性(robustness)(参见:《 “三好”立委要做“三有”系统 》)。 本文就简单谈一下鲁棒性。

为了取得语言处理的鲁棒性(robustness),一个行之有效的方法是实现四个形容词的所指:词汇主义(lexicalist); 自底而上(bottom-up); 调适性(adaptive);和 数据制导(data-driven) 。这四条是相互关联的,但各自重点和视角不同。系统设计和开发上贯彻这四项基本原则, 是取得鲁棒性的良好保证。有了鲁棒性,系统对于不同领域的语言,甚至对极不规范的社会媒体中的语言现象,都可以应对。这是很多实用系统的必要条件。

先说词汇主义策略。词汇主义的语言处理策略是学界和业界公认的一个有效的方法。具体说来就是在系统中增加词汇制导的个性规则的总量。自然语言的现象是如此复杂,几乎所有的规则都有例外,词汇制导是必由之路。从坚固性而言,更是如此。基本的事实是,语言现象中的所谓子语言(sublanguage),譬如专业用语,网络用语,青少年用语,他们之间的最大区别是在词汇以及词汇的用法上。一般来说,颗粒度大的普遍语法规则在各子语言中依然有效。因此,采用词汇主义策略,可以有效地解决子语言的分析问题,从而提高系统的鲁棒性。

自底而上的分析方法。这种方法对于自浅而深的管式系统 (pipeline system) 最自然。系统从单词出发,一步一步形成越来越大的句法单位,同时解析句法成分之间的关系。其结果是自动识别(构建)出来的句法结构树。很多人都知道社会媒体的混乱性,这些语言充满了错别字和行话,语法错误也随处可见。错别字和行话由词汇主义策略去对付,语法错误则可以借助自底而上的分析方法。其中的道理就是,即便是充满了语法错误的社会媒体语言,其实并不是说这些不规范的语言完全不受语法规则的束缚,无章可循。事实绝不是如此,否则人也不可理解,达不到语言交流的目的。完全没有语法的“语言”可以想象成一个随机发生器,随机抽取字典或词典的条目发射出来,这样的字串与我们见到的最糟糕的社会媒体用语也是截然不同的。事实上,社会媒体类的不规范语言(degraded text)就好比一个躁动不安的逆反期青年嬉皮士,他们在多数时候是守法的,不过情绪不够稳定,不时会”突破”一下规章法律。具体到语句,其对应的情形就是,每句话里面的多数短语或从句是合法的,可是短语(或从句)之间常常会断了链子。这种情形对于自底而上的系统,并不构成大的威胁。因为系统会尽其所能,一步一步组合可以预测(解构)的短语和从句,直到断链的所在。这样一来,一个句子可能形成几个小的句法子树(sub-trees),子树之内的关系是明确的。

朋友会问:既然有断链,既然那些子树没有形成一个完整的句法树来涵盖所分析的语句,就不能说系统真正鲁棒了,自然语言理解就有缺陷。抽象地说,这话不错。但是在实际使用中,问题远远不是想象的那样严重。其道理就是,语言分析并非目标,语言分析只是实现目标的一个手段和基础。对于多数应用型自然语言系统来说,目标是信息抽取(Information Extraction),是这些预先定义的抽取目标在支持应用(app)。抽取模块的屁股通常坐在分析的结构之上,典型的抽取规则 by nature 是基于子树匹配的,这是因为语句可以是繁复的,但是抽取的目标相对单纯,对于与目标不相关的结构,匹配规则无需cover。这样的子树匹配分两种情形,其一是抽取子树(subtree1)的规则完全匹配在语句分析的子树(subtree2)之内(i.e. subtree2 > subtree1),这种匹配不受断链的任何影响,因此最终抽取目标的质量不受损失。只有第二种情形,即抽取子树恰好坐落在分析语句的断链上,抽取不能完成,因而影响了抽取质量。值得强调的是,一般来说,情形2的出现概率远低于情形1,因此自底而上的分析基本保证了语言结构分析的鲁棒性,从而保障了最终目标信息抽取的达成。其实,对于 worst case scenario 的情形2,我们也不是没有办法补救。补救的办法就是在分析的后期把断链 patch 起来,虽然系统无法确知断链的句法关系的性质,但是patched过的断链形成了一个完整的句法树,为抽取模块的补救创造了条件。此话怎讲?具体说来就是,只要系统的设计和开发者坚持调适性开发抽取模块(adaptive extraction)的原则,部分抽取子树的规则完全可以建立在被patched的断链之上,从而在不规范的语句中达成抽取。其中的奥妙就是某样榜戏中所说的墙内损失墙外补,用到这里就是结构不足词汇补。展开来说就是,任何子树匹配不外乎check两种条件约束,一是节点之间句法关系的条件(主谓,动宾,等等),另外就是节点本身的词汇条件(产品,组织,人,动物,等等)。这些抽取条件可以相互补充,句法关系的条件限制紧了,节点词汇的条件就可以放宽;反之亦然。即便对于完全合法规范的语句,由于语言分析器不可避免的缺陷而可能导致的断链(世界上除了上帝以外不存在完美的系统),以及词汇语义的模糊性,开发者为了兼顾查准率和查全率,也会在抽取子树的规则上有意平衡节点词汇的条件和句法关系的条件。如果预知系统要用于不规范的语言现象上,那么我们完全可以特制一些规则,利用强化词汇节点的条件来放宽对于节点句法关系的条件约束。其结果就是适调了patched的断链,依然达成抽取。说了一箩筐,总而言之,言而总之,对于语法不规范的语言现象,自底而上的分析策略是非常有效的,加上调适性开发,可以保证最终的抽取目标基本不受影响。

调适性上面已经提到,作为一个管式系统的开发原则,这一条很重要,它是克服错误放大(error propagation)的反制。理想化的系统,模块之间的接口是单纯明确的,铁路警察,各管一段,步步推进,天衣无缝。但是实际的系统,特别是自然语言系统,情况很不一样,良莠不齐,正误夹杂,后面的模块必须设计到有足够的容错能力,针对可能的偏差做调适才不至于一错再错,步步惊心。如果错误是 consistent/predictable 的,后面的模块可以矫枉过正,以毒攻毒,错错为正。还有一点就是歧义的保存(keeping ambiguity untouched)策略。很多时候,前面的模块往往条件不成熟,这时候尽可能保持歧义,运用系统内部的调适性开发在后面的模块处理歧义,往往是有效的。

最后,数据制导的开发原则,怎样强调都不过分。语言海洋无边无涯,多数语言学家好像一个爱玩水的孩子,跳进大海就乐不思蜀。见水珠不见海洋,见树木不见森林,一条路走到黑,是太多语言学家的天生缺陷。如果由着他们的性子来,系统叠床架屋,其执行和维护的 overhead 会越来越大,而效果却可能越来越差(diminishing returns)。数据制导是迫使语言学家回到现实,开发真正有现实和统计意义的系统的一个保证。这样的保证应该制度化,这牵涉到开发语料库(dev corpus)的选取,baseline 的建立和维护,unit testing 和 regression testing 等开发操作规范的制定以及 data quality QA 的配合。理想的数据制导还应该包括引入机器学习的方法,来筛选制约具有统计意义的语言现象反馈给语言学家。从稍微长远一点看,自动分类用户的数据反馈,实现某种程度的粗颗粒度的自学习,建立半自动人际交互式开发环境,这是手工开发和机器学习以长补短的很有意义的思路。


适配性、数据制导的容错性开发肯定可以对付一些错字漏字的现象, 但是究竟能对付多少,那些是可以对付的,那些是难以对付的,需要具体分析。

可以看一下两极的情形:天花板和地板。

容错、纠错的系统本质上是对人的容错、纠错能力的 modeling,因此人的理解能力是系统可能逼近的天花板。理论上讲,如果人能理解错字漏字的语句,基本说明了这个不规范的句子形式内涵语义的冗余度,那么一个容错系统应该也可以做到。(当然,人的理解可能不自觉地调动常识、专业知识、联想和推理等非语言学手段,模拟起来很困难,在目前,简单地容错开发是远远达不到人的理解力的。)如果错字漏字造成真正的语句歧义,那么最好的系统最多做到分析的多路径。最后,如果错字漏字严重到人都搞不清什么意思的时候,机器自然是两眼一抹黑。

地板就是一个完全规范的“紧式”语言系统,错字漏字的地方就造成断链,局部语义无法合成为完整的理解(problem with the semantic compositionality, the key to language understanding)。所谓容错开发,就是尽可能把紧式系统松绑为“宽式”系统,把非排歧的无关紧要的条件放宽。譬如英语中的主谓一致关系的条件(第三人称单数的主语需要其谓语动词有词尾-s, 这个中小学语法课上的金科玉律就是紧式语法的条条框框,在宽式开发中一般不用)。再如汉语动词的被动语态,有些句子加了“被”字,万一这个关键的被动语态的助词漏掉了,容错系统应该仍然分析无误,如果逻辑动宾的语义搭配条件参与了分析的过程的话(如:“饭吃了” 就是 “饭被吃了”,而“我吃了” 则不一样)。
来源: http://blog.sciencenet.cn/home.php?mod=space&uid=362400&do=blog&id=516413

这篇关于坚持四项基本原则,开发鲁棒性NLP系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692970

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的