坚持四项基本原则,开发鲁棒性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

相关文章

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1