|||
昨天是个好日子。
上班路上从车里所摄。几乎透明的大厦融化在硅谷腹地圣塔克拉拉的蓝天白云之间。
下班路上从车里所摄,又见火烧云,震慑心魂。
重点不在硅谷的景色,而在心情。景色都是过眼烟云。
昨天是个好日子,是因为终于解决了一个 “NLP-hard” 的 problem,这就好似当年在社科院单身宿舍的时候,老做噩梦,觉得自己怕是要打一辈子光棍了,人海茫茫,寻啊觅啊却不敢张口 -- 那人却在灯火阑珊处!
(我以前写过一篇 《朝华午拾:今天是个好日子》,谈的是类似的经历,那是在NLP落地产品的时候,与产品经理谈自己的突破,那也有众里寻他千百度的感受。不过那次谈话的故事只能假语村言,不能细说突破点,你懂的。总之,最后成就了我们的舆情挖掘系统,虽然产品还没能大卖,仅在财富500强圈子里使用,但绝对是世界上舆情最精准的系统。这次不同,这次突破是“学术上”的,是毛毛虫的突破。)
先看看这个 NLP 问题有多 hard:
希拉里竞选难倒NLPer。如果希拉里当选,她就是全世界唯一一个既干过美国总统又干过美国总统的女人!而她老公也将成为全世界唯一一个既干过美国总统又干过美国总统的男人!瞧着美国人吹嘘所谓一旦希拉里当了总统,克总和希总都是既干过总统又干过总统的得意样,中国人满脸不屑道:听说过武媚娘吗?那是一个既干过皇帝又干过皇帝他爹还干过皇帝他儿子并干过皇帝且生过皇帝的女人。
这是微信这段时间疯传的段子。对不起,带点儿色儿,属于成人笑话,不登大雅之堂。但是对于 NLP,这个段子极为经典地呈现出自动分析的挑战,所以我比作 NLP-hard problem。不是同行不知晓,这个段子真心难。
NLP parsing 初步尝试如下,也只有先乱闯一气了:
这是昨天听了段子后的瞎撞,其中似乎有“休眠沉睡唤不醒”的 parse,譬如第一句数量结构(“唯一一个”) 与 中心词太远 (“VP的女人”):VP里纠缠着很长的偶VPs并列,其中“V+N1+的+N2”到底是 VP 还是 NP 不到最后与数量结构碰头是难以决定的,语义限制也不管用(“干”是个万能动词,什么都能干,谁都能干)。
真够绕的,“既 ... 又 ... 还 ... 并 ... 且 ...”,VPs并列一气用了五个,居然连词不重样,咱汉语真有点邪门。如上所示,我们的自动分析器走的是 VP 的线路, VP[V+[N2+de_N2]],等到 “唯一一个” 开始寻找 hosting head N 的时候,NP “美国总统的女人”已经被 V“干过” 吃进去成为 VP 里面的宾语成分(O)了,当时想,这时候,如果有个休眠唤醒的机制就好了。这个机制可以想象出来,但实现起来还是要在“毛毛虫机制”上下点非传统的功夫来。在白老师微信群里这么自言自语着,一拍脑袋,wait,现有的机制在语义中间件上应该可以做部分反悔重做或弥补的工作的。然后这么一试。得来全不费工夫!
“@白硕 哈哈哈哈”,唤醒休眠,仰天大笑!会心一笑呼老哥,不由得我不想起李白来(“仰天大笑出门去,我辈岂是蓬蒿人”(李白·《南陵 别儿童入京》)。天道酬勤,此所谓,地球上怕就怕执着二字。突破就发生在下班前。原来那“毛毛虫”就在灯火阑珊处,难怪晚霞火烧了半边天。
昨夜无眠,想了一宿,可以负责地说,deep parsing formalism 机制当中最大的挑战之一,现已有了一个通用的解决办法了。这个挑战就是结构歧义(另一个挑战是语词歧义,所谓 WSD,不过那玩意儿不是NLP应用的拦路虎,见【NLP 迷思之四:词义消歧(WSD)是NLP应用的瓶颈】)。
遇到结构歧义,特别是上例中的远距离结构歧义和埋藏很深的结构歧义(埋藏不深的结构歧义,如英语著名的 PP-attachment 难题,我们早已在机制上有了休眠唤醒的解决之道),以前的困惑是,究竟是: (1) 条件不成熟霸王硬上弓去解决它(譬如不怕叠床架屋,调用世界知识和常识推理,去硬闯), 还是 (2) 输出 nondeterministic 的结果,带着瓶瓶罐罐向下跑(学界曾经流行过一阵PCFG,带着不同概率的非确定性的分析路径,多局限于实验室的研究); 还是(3)先“休眠”,keep ambiguity untouched,等到条件成熟的时候再唤醒修正?
三条路子我最近几个月都在尝试。反正闲着也是闲着,现在这种远离AI热炒的环境比较淡定从容,难得闹市一隅闲,可以细细琢磨这些机制上的事儿(其实也累得狗死,属自虐,不足为外人道也),而不是像我的有些哥们儿救火一样在创业。
路线(1) 试了,肯定有效,但是常常负担太重,可以见机利用。具体说就是,一定要在句法做得很透,形式的路子快山穷水尽的时候,然后在句法框架下引入常识才妥。可以一点点带入,控制使用,避免背负沉重的包袱(白老师所谓大炮打蚊子)。这个工作我们利用董老师的HowNet(【知网】)在做,借助本体常识帮助deep parsing 排歧。
(2)的挑战在于两个方面:一是 nondeterministic 如何表达合适,二是瓶瓶罐罐怎么带着跑?
现在的初步结论是,这个办法如果不带着跑是可以用的。对于 PP-attachment 这样的结构歧义,完全可以一个孩子指向两个老子作为结构歧义的表达,违背所谓“一个孩子只允许有一个老子”的依存关系(dependency)天条。其实汉语的所谓“兼语式”早就违背了这条原则,所谓兼语就是既做前一个V的孩子(宾语),又做后一个V的孩子(主语),这与 PP attach 到 V 做状语,同时也可 attach 到 NP 做定语,从机制上并无二致。问题是,这样一来,parsing 的重点变成歧义的识别和表达,而不是歧义的解决,行吗?
不错,就是这样。
这个路线是正确的,因为句法擅长的是识别,那就发挥其所长。歧义的表达则是人自己与自己玩 encoding,这个是系统内部的协调,虽然有难度,但白老师也说过,做得初一,就做得十五,不就是一个绕来绕去的 dag (directed acyclic graph)一样的数据结构吗?dag 从我刚入行就被我导师那一辈反复洗脑过,当时叫“有向直接联系”,查查当年 MT 的老论文,这个术语恐怕是出现最多的说法了。当时就受教了这么一个原则,圣旨一样被反复强调,源自语言学(句法学)界,叫做:有向直接联系的大原则是,一个老子可以有 n (n>=0)个孩子,但一个孩子最多有一个老子。(【科普小品:文法里的父子原则】)
这个原则在句法上有其道理,在汉语的兼语现象上遇到了一点挑战。汉语的兼语,在西方语言中,由于这个句法大原则的作用,或者变成了宾语,或者变成了主语,总之不能再是句法意义的“兼语”,这个得益于西语的形态(inflection)帮助。到了汉语,缺乏形态,于是违反原则的兼语就堂而皇之进入句法,被句法学家(不得不)认可为合法了。“我请他离开”: 兼语“他”既是主语也是宾语。
到了英语呢,就必须从良,不可脚踩两条船:
(1) I asked him to leave
(2) I asked that he leave.
虽然两句话表达的核心意思不变,穿上英语句法外套表达的时候,不得不在主语(he)或宾语(him)之间做个选择。从这个现象可以看出,所谓的一个孩子最多只能有一个老子,其实不是一个深刻的原则,它更像是是语言学内部归纳法得出的heuristic,没有什么碰不得的。
这个原则的好处是,它不仅高度归纳概括了很多语言的结构规律,而且它对结构歧义具有显式的警示效应。PP-attachement 之所以为结构歧义,其所以有两个可能的解读,可以解释为这个PP孩子出现在有两个老子的结构语境中。于是,排除歧义、理解自然语言,就可以形式化为遵循“父子原则”而必须在两条句法依存关系中做出二选一的抉择。
但是这个原则我们知道在逻辑上不是没有缺陷的。其一是,语义逻辑上的多老子是常态,很多所谓隐藏的逻辑语义的 args ( hidden 逻辑主语,逻辑宾语等) 之类是对这个原则的违反。应该说,它只是语言学里面句法的原则或heuristic,并不通用到语义逻辑的层面。其二是,这个原则忽视了过程性: 语言理解是一个过程,在过程的某个步骤,连人都不知道这个孩子属于谁,那时候只好给这个孩子选一个候选老子系列,留待理解的深层去做决断。所以适当表达这种多老子的现象是多层次自然语言理解过程中的题中应有之义,而不能固执原则,否定这种表达的需求。上面提到的 (2) 和 (3)都是在肯定和强调语言理解的阶段性。其三是,双关语的存在证明了,世界上没有一个原则是没有例外的,一个孩子有多个老子甚至在理解的深层也有理由存在,而且这种存在可以传达给信息接受的一方:
I saw a girl with the telescope
因此成为仅次于乔老爷的 "green ideas" 的 NLP 名句(【从 colorless green ideas sleep furiously 说开去】)。
以上这个科普式回顾,啰嗦了些,不过这是对 NLP hard 的突破的一个足够重要的背景铺垫。
长话短说,路线(2) 的最大问题不是方向,也不是违反原则,而是表达了,下一步怎么办?
如果是在parsing的一开始就这样表达,甚至有人主张把切词的歧义也包括进来,那么parsing往下走很多层直到深度分析,目前没有看到任何机制可以有效对付这种组合爆炸。那么什么时候表达 non-deterministic 歧义结构,什么时候清理这些歧义呢?这些都是需要研究的问题。最后,即便机制上解决了这个组合爆炸的问题,人脑是豆腐,带着这些不同层次的瓶瓶罐罐跑,不出三层,开发者自己就被绕糊涂了,再资深的语言学家也经不住这个啊。开发者都糊涂,这系统还怎么调试?变成 nontractable 了。因此,路线2只能有限利用,譬如 PP attachment 可以考虑用。用完了,句法就完了,不再往下跑,然后由语义中间件(semantic middleware)系统接手去解决,或者直接进入语用(pragmatic app)去解决(或选择不解决)。
语义可以解决也就是调用语义限制(selection restriction),带入某种知识。语用可能解决是因为聚焦了,领域知识可以带入。而且因为聚焦,本来的问题也许在雷达之外,无需解决(解决了也是白解决)。同样因为聚焦,如果尚在雷达上,语用阶段可以充分使用用词驱动(word-driven)规则应对。词驱动因为就事论事非常 powerful and effective,但只有到了语用阶段才最得心应手,因为词规则无穷无尽,只有聚焦了才变得有限,才容易掌控、值得重用。最后,语用阶段,很多节点的语词多义变成单义了,这也为结构排歧创造了更好的条件。所有这些 arguments 都指向了一个方向,就是,结构歧义不必在句法阶段硬做,留待语义中间件和语用产品开发阶段去做,条件成熟多了。句法的重点就是搭建一个结构环境,这样本来的线性local的局限就被突破,远距离在句法树上变成近邻。在结构的基础上解决远距离的歧义问题成为可能。
所有这些都不是空谈,每一个论点都可以举出无数的parsing实例,但今儿这里只谈大面,无法 illustrate 细节了。
好,转入主题,现在谈昨天的 NLP hard 的突破。希望这个突破可以与 NP-hard 某一天的突破相提并论,呵呵。简而言之,“NLP hard” 的突破就是,对于几乎一切的结构歧义,我们都可以先休眠,把 deterministic 进行到底,然后利用一个机制去唤醒被休眠的结构,修正早期的结构错误。这个机制昨天只是小试,没有发现任何真正的挑战。回头写个 specs 让工程师做一些局部功能的改进,就可以堂而皇之大规模地做任何远距离和纵深度的结构重整了。
不破不立,到了“后句法阶段”,立足于deterministic的结构基础,对于这个基础做任何受控的调整,加枝添叶,剪枝去叶,都不是问题。因为这个机制我们早已在多年的毛毛虫探索中基本实现了,但是一直思路没有打开,想不到可以这样放开手脚的应用。过去两三个月一直困扰的休眠唤醒的问题,一直担心深度休眠唤不醒的问题,一夜间烟消云散。机制有了,后面就是纯粹的力气活,怎么玩都可以(【立委科普:结构歧义的休眠唤醒演义】)。
从宏观上,自然语言也是一种表达,所有的歧义全部隐藏其中。determinstic parsing 不过就是为语言搭建一个桥梁,作为语义理解的基础,并不一定要做理解的目的地。 在这个过程中,一个句子的歧义部分可以被 localize,没有歧义的地方被排除出雷达。到了休眠唤醒的步骤,就针对这个 localized 的子树(subtree),再做一遍 parsing 不就得了。这时候,要节点(node)信息有节点信息,要结构信息有结构路径(arc),还有什么做不成的?以前担心的唤不醒,是误认为 deterministic 的结构一旦决定了,无法动摇。哪里有这回事儿。parsing 对线性语句是增量操作,原句还在,把原句结构化了而已,原句在,意义就在,歧义也自然在,一切秘密安眠无忧。唤不醒是因为警钟不够响,你在耳朵旁放个炸弹,看还有什么唤不醒的?
一个可能的歧义路径会不会在后面丢失了,永远找不回来了,这等价于唤不醒了。理论上不存在这种情况。因为语言理解的对象是有限的字符串(语句),有限的节点,和有限的初步连接(deterministic parses,包括“耍流氓”的 Topic 和 Next 连接)。在这个有限的类似 dag 的数据结构里,理论上,我可以从任何一个节点经过一个 reasonable 有限路径达到任意另一个节点,去建立新的结构联系(移情别恋)。我也可以从任何一个节点到已经连接的任何节点,去毁掉这个连接(绝交)。前者是间接路径,后者是直接路径,都是 reachable 的。至于怎么保证在不破不立的结构重塑和结构排歧过程中,防止语言学家胡来滥交,乱闯 “禁地”,这个目前来看是实践层面的问题。通过实践,最后我们总可以发现怎样界定机制层面的禁区,来保证哪怕质量不高的语言学家,也不至于伤害系统。在当前,这个不怕,可以探索。
我的牛完了,,各位晚安。
【相关】
【从 colorless green ideas sleep furiously 说开去】
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-14 20:38
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社