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

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

先说词汇主义策略。词汇主义的语言处理策略是学界和业界公认的一个有效的方法。具体说来就是在系统中增加词汇制导的个性规则的总量。自然语言的现象是如此复杂,几乎所有的规则都有例外,词汇制导是必由之路。从坚固性而言,更是如此。基本的事实是,语言现象中的所谓子语言(sublanguage),譬如专业用语,网络用语,青少年用语,他们之间的最大区别是在词汇以及词汇的用法上。一般来说,颗粒度大的普遍语法规则在各子语言中依然有效。因此,采用词汇主义策略,可以有效地解决子语言的分析问题,从而提高系统的鲁棒性。
自底而上的分析方法。这种方法对于自浅而深的管式系统最自然。系统从单词出发,一步一步形成越来越大的句法单位,同时解析句法成分之间的关系。其结果是自动识别(构建)出来的句法结构树。很多人都知道社会媒体的混乱性,这些语言充满了错别字和行话,语法错误也随处可见。错别字和行话由词汇主义策略去对付,语法错误则可以借助自底而上的分析方法。其中的道理就是,即便是充满了语法错误的社会媒体语言,其实并不是说这些不规范的语言完全不受语法规则的束缚,无章可循。事实绝不是如此,否则人也不可理解,达不到语言交流的目的。完全没有语法的“语言”可以想象成一个随机发生器,随机抽取字典或词典的条目发射出来,这样的字串与我们见到的最糟糕的社会媒体用语也是截然不同的。事实上,社会媒体类的不规范语言(degraded text)就好比一个躁动不安的逆反期青年嬉皮士,他们在多数时候是守法的,不过情绪不够稳定,不时会”突破”一下规章法律。具体到语句,其对应的情形就是,每句话里面的多数短语或从句是合法的,可是短语(或从句)之间常常会断了链子。这种情形对于自底而上的系统,并不构成大的威胁。因为系统会尽其所能,一步一步组合可以预测(解构)的短语和从句,直到断链的所在。这样一来,一个句子可能形成几个小的句法子树(sub-tree),子树之内的关系是明确的。朋友会问:既然有断链,既然子树没有形成一个完整的句法树来涵盖所分析的语句,就不能说系统真正鲁棒了,自然语言理解就有缺陷。抽象地说,这话不错。但是在实际使用中,问题远远不是想象的那样严重。其道理就是,语言分析并非目标,语言分析只是实现目标的一个手段和基础。对于多数应用型自然语言系统来说,目标是信息抽取(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越来越大,效果可能越来越小。数据制导是迫使语言学家回到现实,开发真正有现实和统计意义的系统的一个保证。这样的保证应该制度化,这牵涉到开发语料库(dev corpus)的选取,baseline 的建立和维护,unit testing 和
regression testing 等开发操作规范的制定以及 data quality QA 的配合。理想的数据制导还应该包括引入机器学习的方法,来筛选制约具有统计意义的语言现象反馈给语言学家。从稍微长远一点看,自动分类用户的数据反馈,实现某种程度的粗颗粒度的自学习,建立半自动人际交互式开发环境,这是手工开发和机器学习以长补短的很有意义的思路。
以上所述,每一条都是经验的总结,背后有成百上千的实例可以详加解说。不过,网文也不是科普投稿,没时间去细细具体解说了。做过的自然有同感和呼应,没做过的也许不明白,等做几年就自然明白了,又不是高精尖的火箭技术。

作者 liwei999

《坚持四项基本原则,开发鲁棒性NLP系统》有11条评论
  1. 深有同感,词汇主义、自下而上、延时容错、数据制导。不过我觉得这些都是从系统设计的角度来应付语言万千变化的复杂现象的(有些现实无力的感觉),真实情况是我们从未认真思考语言复杂现象隐藏的简单机制。
    如果我们揭开语言底层简单的转换和衔接规则,那么系统的设计自然也就简单很多了,鲁棒性不就自然解决了。

    [回复]

    liwei999 回复:

    "揭开语言底层简单的转换和衔接规则".

    good luck to you
    I hope I can see that happen in my life time

    [回复]

    kingsten_88 回复:

    感谢上帝所赐,语言机制本人有些许收获,我将它总结为如下公式:范畴=1象×2向×3相=6维。现在大局已定,只察细节了。

    [回复]

    zzl 回复:

    大神,您说的太抽象了,可否为我这个凡夫俗子解释一下您的理论

    srrc 回复:

    这让我想起了HNC的理论,可惜还是看不明白。还是用归纳总结的自底向上方法容易理解点。

  2. 自然语言理解的机器认知形式系统
    HNC我没有深入研究,也就不多说了。至于我所书的公式,没有什么神奇的,只是表明语言内部各个单元粘合的根基是靠范畴,而范畴是根据上下文的范畴动态确立下来的,当然每一个结合之处都会有6个维度的发展方向(3个相态,每一个相态有2个方向),在没有上下文的前提下,这6个方向都是有可能的。

    传统上,句法分析是以建立句法结构为目标的,但是,即便是建立句法结构,也是难以解决许多概念的指引关系,这是中心词驱动的弊端,要记住,语言的换位和缺位往往是通过比喻意义显示出来的,通过范畴,就不会再关注词类和结构了,只需要关注什么是一个独立表达的单元,事实上,真正参与运算的范畴最多可能就二十多个。

    范畴并不神秘,但是需要对语言最高形式的架构要所领悟,不要被一些细分的属性所困惑。另外需要提到一点,语言单元的输出是多向输出,上面也提到了6维,这是目前生成语法所没有的特性。好了,简单的说,理论不神。

    [回复]

    liwei999 回复:

    talking about NLP or NLU, these are universal questions:

    (1) what is the input and output of your system no matter what theory is behind? (I guess the input is the character string.)
    (2) what is the algorithm or procedure to make computers map input to your output?
    (3) how is your output used for any apps?

    [回复]

    kingsten_88 回复:

    理论研究自然是为实践服务,以上问题一一解释:
    1)输入就是字符串,但其中字符或者字符的组合的“含义”不是固守“字典”的定义,而是有所演绎的。输出自然是概念(范畴的实例化)之间的关系,主要是相互之间的制约方向和话题焦点。
    2)算法分为两部分,一部分是建立语言范畴之间离合聚分的基本形式表达,另一部分是需要人类不断积累和学习的生活常识。
    3)输出信息按需定制,可以直接应用于局部的应用,也可以适用于人工智能系统的输入(人工智能信息的传输媒介就是范畴化的语言),可以用于记忆,也就可以用于决策。

    [回复]

    liwei999 回复:

    谢谢。

    我大概是工匠做太久了,对理论是一头雾水。
    不好意思,撤了。

    Jianqiang Ma 回复:

    范畴是指categorial grammar里的category?

    [回复]

    kingsten_88 回复:

    同字不同意,范畴语法的范畴归根结底是语法功能化类别,此处所指是指称事物“属性全象”的类别,如“车”、“汽车”、“公共汽车”。

    [回复]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注