再谈最小熵原理:飞象过河之句模版和语言结构 附开源NLP库

时间 : 18-11-06 栏目 : ag电子游艺 作者 : admin 评论 : 0 点击 : 12 次

  在前一文从无监督构建词库看「最小熵原理」,套路是如何炼成的中,我们以最小熵原理为出发点进行了一系列的数学推导,最终得到 (2.15) 和 (2.17) 式,它告诉我们两个互信息比较大的元素我们应该将它们合并起来,这有利于降低学习难度。于是利用这一原理,我们通过邻字互信息来实现了词库的无监督生成。

  当然不一定相邻,我们学习语言的时候,不仅仅会学习到词语、词组,还要学习到固定搭配,也就是说词语怎么运用才是合理的,这是语法的体现,是本文所要探究的,希望最终能达到一定的无监督句法分析的效果。

  对于大多数人来说,并不会真正知道什么是语法,他们脑海里就只有一些固定搭配、定式,或者更正式一点可以叫模版。大多数情况下,我们是根据模版来说出合理的话来。而不同的人的说话模版可能有所不同,这就是个人的说话风格,甚至是口头禅。

  当然,虽然可以抽取尽可能多的模版,但有限的模版是无法覆盖千变万化的语言想象的,所以更重要的是基于模版的嵌套使用。比如X 的 Y 是什么这个模版,X 可以用模版A 和 B来代替,从而得到(A 和 B)的 Y 是什么。如此以来,模版相互嵌套,就可以得到相当多句子了。

  刚才我们说随便用两个名词代进去,可是按照我们的思路,到现在为止我们也就只会构建词库,我们连什么是名词都不知道,更不知道应该把名词填进去。事实上,我们不需要预先知道什么,我们可以通过大料的语料来抽取每个候选位置的等价类,其中 X 的候选词组成一个词语等价类,Y 的候选词也组成一个词语等价类,等等。

  在构建词库那里,我们的统计对象是字,现在我们的统计对象是词,此外,词语是由相邻的字组成的,但句子模版却未必是由相邻的词组成的(否则就退化为词或词组),所以我们还要考虑跨词共现,也就是 Word2Vec 中的 Skip Gram 模型。

  有向无环图(Directed Acyclic Graph,DAG)其实是 NLP 中经常会遇到的一个图论模型。事实上,一元分词模型也可以直接抽象为有向无环图上的最短路径规划问题。而这里的候选模版集构建,也需要用到有向无环图。

  注意,事实上X 的 X、X 怎么 X这种两个占位符夹住一个词的模版是平凡的,它只不过是告诉我们这个词可以插入到句子中使用。因此,为了看出效果,我们排除掉这一类模版,得到:

  回顾分词算法,分词只是一个句子的切分问题,切分出来的词是没有洞(占位符)的,而如果要识别句子中用了哪些模版,这些模版是有洞的,并且还可能相互嵌套,这就造成了识别上的困难。然而,一旦我们能够完成这个事情,我们就得到了句子的一个层次结构分解,这是非常有吸引力的目标。

  语言的投射性大概意思是指如果句子可以分为几个语义块,那么这些语义块是不交叉的。也就是说,假如第 1、2、3 个词组成一个语义块、第 4、5 个词组成一个语义块,这种情况是允许的,而第 1、2、4 个词组成一个语义块、第 3、5 个词组成一个语义块,这种情况是不可能的。大多数语言,包括汉语和英语,基本上都满足投射性。

  咋看之下这个假设不够合理,但仔细思考就会发现,这个假设已经足够描述大多数句子的结构了。读者可能有疑虑的是有没有可能并行地使用两个句模版,而不是嵌套?答案是:应该不会。

  因为如果出现这种情况,只需要将并行本身视为一个模版就行了,比如将X 和 X也视为一个模版,那么X 和 X这个模版中的两个语义块就是并行的了,甚至它可以与自身嵌套得到X 和(X 和 X)描述更多的并行现象。

  也正因为我们对语言结构做了这种假设,所以一旦我们识别出某个句子的最优句模版组合,我们就得到了句子的层次结构--因为根据假设,模版是按照嵌套的方式组合的,嵌套意味着递归,递归就是一种层次树的结构了。

  从词、词组都句模版,我们都像是在玩拼图:拼着拼着发现这两块合在一起效果还行,那么就将它合起来吧。因为将互信息大的项合起来,作为一个整体来看,就有助于降低整体的信息熵,也就能降低整体的学习难度。

  因为我们在 NLP 中,面对的句子千变万化,但事实上句式却是有限的,这也意味着句模版也是有限的,如果有必要,我们可以对各个句模板的占位符含义进行人工标注,这就能将句模板的结构跟常规的句法描述对应起来了。通过有限的句模版来对句子进行(无限的)分解,能让 NLP 可面对的场景更加灵活多变一些。

  也许以往的传统自然语言处理中,也出现过类似的东西,但本文所描述的内容纯粹是无监督的结果,并且也有自洽的理论描述,算是一个比较完整的框架,初步的结果也差强人意,因此值得进一步去思考它的应用价值。

  的确,形式上确实如此。但为了将这个想法推广至同时具备理论和实用价值,却并不是那么简单和顺畅的事情。比如,在句模版生成时,如何不遗漏地得到所有的候选模版,这便是一个难题;其次,在得到句模版(不管是自动生成还是人工录入)后,如何识别出句子中的句模版,这更加艰难了,不论在理论思考还是编程实现上,都具有相当多的障碍,需要对树结构、递归编程有清晰的把握。我也是陆陆续续调试了半个多月,才算是把整个流程调通了,但估计还不完备。

  我们要从两个角度看待这个事情。一方面,我们有成功的例子,对应纯粹无监督挖掘的探索,我们哪怕只能得到一小部分成功的结果,也是值得高兴的;另外一方面,对于失败的例子,我们需要思考失败的原因,并且考虑解决方案。

  回顾目前主流的句法分析工作,不管是有监督的还是无监督的,它们基本上都要结合词性来完成句法分析。所以这给我们提供了一个方向:最小熵系列下一步的工作就是要探究词语的聚类问题,以便更好地捕捉词义和语言共性。

  为了方便对结果进行调用以及可视化,输出结果已经被封装为一个 SentTree 类。这个类有三个属性:template(当前主模版)、content(当前主模版覆盖的字符串)、modules(语义块的 list,每个语义块也是用 SentTree 来描述)。总的来说,就是按照本文对语言结构的假设来设计的。

本文标签

除非注明,文章均为( admin )原创,转载请保留链接: http://www.treslola.com/?p=348

再谈最小熵原理:飞象过河之句模版和语言结构 附开源NLP库:等您坐沙发呢!

发表评论


-----===== 博主信息 =====-----

为您推荐

0