Guo:
@白 你前几天提到“算符优先”,今天又提type,猜想你的二元相偕是离散(而不是连续)的。能问下你的运算符和类型大概的数目规模吗?
完全不用“复杂特征集”,把所有不同关系都拍平在同一层,感觉颗粒度不容易掌握。
白:
(1)type是贯穿于句法和语义的;(2)算符优先是仅适用于句法的;(3)二元相谐是仅适用于语义中间件(subcat+统计)的;(4)平拍是贯穿于句法和语义的。算符的数目几十;句法cat少得可怜;subcat目前1000多。
Guo:
几件不同的事情!谢了!
白:
神奇的是,少得可怜的句法cat,居然管了这么多事儿。勾画了毛毛虫的“包络”。subcat确定了毛毛虫的细节。
李:
平拍是what
白:
把萝卜和坑搁同一个桌面上。坑不再嵌套。就是单子化的意思。
李:
哦 扁平化。
我自己在扁平化过程中,也有很多机关很好玩的,我叫做原子化。原子了,但taxonomy还在。非常轻便利索,但一样容纳知识结构。
白:
taxonomy是框架定义,不是实例定义。具体到实例都是扁平化的。
李:
本体(ontology)里面的主线 ISA 就是 taxonomy. 社科院跟刘老师做MT的时候,就是我提议的扁平化,说话30多年了。刘老师当时很高兴,给起了一个高大上的名字叫背景知识库(BGKB)。与白老师现在的中间件处于同一个地位。
白:
一个词在说人,就犯不上扯猿猴啊灵长类什么的。
李:
问题在当那个说【人】的词填坑的时候,【灵长类】啥的需要参与。当然,用大数据中间件也许可以绕过去了。但传统的优选语义的约束必须要用到 taxonomy,具体说就是,如果是用到灵长类,语义相谐给满分。
白:
萝卜和坑的subcat不一致时需要借助taxonomy一致化,具体就是求格(lattice)的下确界。
李:
就是。
理论上taxonomy往上是满分,taxonomy 向下需要打个折扣。你要的是【人】,那遇到【职业】的话,是满分。你要的是【职业】,遇到了【人】,那需要打个折扣,因为并不是所有的人都有职业。
白:
但是所谓绕过去,只是在借助subcat解决parsing问题(例如伪歧义)的意义上绕过去,解决语义问题则是绕不过去的。也就是说,大数据可以部分替代subcat来确定谁跟谁有关系,但不能进一步确定是什么关系。确定是什么关系(落到哪个槽里)还得subcat出马。
@wei 在模式匹配下的分层,我理解主要是为了方便(在nonterminal级)lookahead并引入有限的上下文相关。
其实顺着LR(k)的思路,对其稍加改造,也是可以对含有一定上下文相关规则的文法等价地单次无回溯做parsing的。
李:
等价这种东西理论上可以证明,实际上做起来就知道,模块化是怎样一个让人放心的开发策略了。哪个大型软件不是模块化的?为什么偏偏到了自然语言这个 monster,非要一锅烩呢?
这里面有一个坎儿,不是认知和策略层面的, 而是算法层面的。如果你的parsing算法的基因就是单层搜索,即便你接受模块化的好处,多层的从容和开发维护的便利,你可能还是难以改造成多层。
白:
拿具体例子说。哪个策略是算符优先做不到的。
算符优先碍着开发什么事儿了
李:
我说不过你,但你说不服我,=)
我是打死也不会回到单层去。
白:
我一张优先序大表,表上每个格子对应一个模块。
李:
对啊
白:
绝对是模块化的,但算法是按照优先序统一调度的。这没矛盾啊。
李:
事实上Brill tagger就是单层,但是里面的200条规则是有次序的,或优先级的,等价于200多个模块的多层pipeline。这个道理我懂。
白:
语言学家只需要关注一个一个模块的事情,只需要关心优先序的语言学合理性,不需要关心调度算法。这在开发上哪点不好了?
李:
也许吧,这要等到哪天我投奔白老师做个语言学码农的时候,才能体会到,是不是在单层里面也有模块化开发的感觉了。
白:
调度算法只有一锅煮才是最合理的。
李:
一锅煮合理的argument本来是立足于自然语言现象的相互纠缠,interdependency。
白:
不是的
李:
既然你一锅煮了 还是要补以休眠唤醒等机制,那么这个根基就动摇了。
Guo:
计算上不等价。算符优先,如算术表达式,计算复杂性与算符数无关。规则优先,如Brill Tagger,计算量随规则数目增加。
李:
一锅还是分层,最终都有个唤醒的问题。
白:
一锅煮是提炼了语言学无关的过程性控制策略的共性,语言学相关的,都封装在模块里了。唤醒也是语言学无关的。@Guo 我规则数为0。
李: 唤醒与语言学远距离句法有关。
可以反过来问:有什么一锅煮能解决的,分层解决不了或解决不好?
以前的例子是有的,譬如 hidden ambiguity, 尤其是汉语切词,在一锅烩中,理论上在理想状态下,这个问题是可以自然解决的。但是切词模块被分开后,这个问题就不能。解决只有靠休眠唤醒。
白:
不加反悔,都解决不好。
李:
不加反悔,理论上一锅烩的 parsing 是可以解决的。当然理论与实践有距离。所以白老师即便一锅烩,也不解决它。
白:
加了反悔,给分层带来多大架构上的冲击我不知道,但是给一锅煮+算符优先带来的架构上的冲击几乎为零。
李:
反悔与分层是天然亲密的。chemistry 很好。反悔不过看成是分层的延伸而已。不过是最后多加几层罢了。
白:
那大家殊途同归好了
李:
而且因为反悔都是在后期,条件成熟了,efficiency上极为合理优化。我现在做反悔,都是在结构上做,不在线性序列上做,那叫一个痛快,一打一个准。反悔从机制上几乎等价于抽取了。
白:
kick off也是在结构上做:一个萝卜出,一个萝卜进。坑还是原来的坑。
Guo:
分层并不天然地等价于模块化。Brill Tagger,改中间任何一条规则,后面全部规则都要重写。这是“负负得正”的负面。
李:
如果是 adaptive 目标驱动,就没有了这个负面。为什么我们多层开发的每一个模块的变动,都必须要通过目标驱动的 regression 测试呢。这些都是软件开发的老生常谈了。
白:
词典化的词负载结构框架下,没有改规则的问题,只有写词条的问题。
李:
模块化的好处是解析性好,可以理喻。一个bug来了,很容易找到出问题的模块,不会是隔靴搔痒。
白:
模块化所有人都没有意见,可以忽略。
李:
到了真地进入这个模块去debug的时候,情况就不再是局部模块了,而是全视野 目标驱动的。这样既保证了一打一个准,有保证了没有副作用。既埋头拉车,也抬头看路。所以Guo的那个顾虑不是问题。
白:
但,模块化并不必然推出分层,分层并不必然推出单向无反悔,模块化也并不必然推出算符优先哪里不work。算符优先相当于桶排序,而桶排序是线性的。
李:
撤了。今天有个 Tech Day。白老师也夜深了,good night
白:
至于目标驱动,这是软件工程的老生常谈。软件工程还说要做边界测试、压力测试、极限测试。
李:
的确是老生常谈。
“白老师也夜深了”
白:
好句
李:
这句里面,主语“白老师”,“也X了”是典型的谓语。句法主语与谓语是什么逻辑语义呢?
白:
顺杆爬,主语所在地。
李:
哈:白老师(那地儿)也夜深了。
白:
这是隔着时区说话才有的语义。
李:
这是同一个战壕战友的关切黑话
【相关】