参考一下链接:
http://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html/2
谈起依存句法分析,主流的统计句法分析一般分为两大流派——生成式和判决式。
生成式:
生成式就是生成一系列句法树,从里面挑选出概率最大的那一棵作为输出。在具体实现的时候,可以选择最大熵等模型去计算单条依存边的概率,利用最大生成树算法来挑选最佳句法树,比如《最大熵依存句法分析器的实现》。
其优点是效果好,但开销大。训练的时候常常要用一份巨大的特征模板,得到的模型中含有大量复杂的特征函数。在解码的时候,这些特征函数的储存和运算成本很高。由于是全局最优,所以可以取得较高的准确率,还可以很方便地处理非投射的句法树。不过也由于搜索的全局性和特征函数的复杂度,模型常常会过拟合,在训练集和测试集上的准确率差别很大。
判别式:
判决式一般是基于动作(或称转移)和一个分类器实现的,仿照人类从左到右的阅读顺序,判决式句法分析器不断地读入单词,根据该单词和已构建的句法子树等信息建立分类模型,分类模型输出当前状态下的最佳动作,然后判决式分析器根据最佳动作“拼装”句法树。
动作体系简介:
一般有两大体系,分别处理投射和非投射两种语言现象。
投射:(大概意思就是无交叉性)汉语和英语等都满足
所谓投射性是指:如果词p依存于词q,那么p和q之间的任意词r就不能依存到p和q所构成的跨度之外(用白话说,就是任意构成依存的两个单词构成一个笼子,把它们之间的所有单词囚禁在这个笼子里,只可内部交配,不可与外族通婚)。比如:
此处缺图。。。
非投射性:
非投射就没有上述限制了,这会导致依存边有交叉,怎么都理不顺:
Arc-standard详解:只能处理投射型的句子。
在arc-standard system中,一次分析任务由一个栈s(题外话,有些人包括维基认为栈也叫堆栈,我强烈反对,堆是heap,栈是stack,heap和stack才混称堆栈),一个队列b,一系列依存弧A构成。如果定义一个句子为单词构成的序列
,那么——
栈:
栈s是用来储存系统已经处理过的句法子树的根节点的,初始状态下。另外,定义从栈顶数起的第i个元素为si。那么栈顶元素就是s1,s1的下一个元素就是s2。
还有另外一种存放形式。此处缺图。
则称s2为左焦点词,s1为右焦点词。接下来的动作都是围绕着这两个焦点词展开的。
队列:
队列模拟的是人眼的阅读顺序,人眼从左到右阅读,系统也从左往右读入单词,未读入的单词就构成一个队列,队列的出口在左边。初始状态下队列就是整个句子,且顺序不变:b=。
依存弧:
一条依存弧(原文dependency arcs,我认为翻译成变换也许更好)有两个信息:动作类型+依存关系名称l。l视依存句法语料库中使用了哪些依存关系label而定,在arc-standard系统中,一共有如下三种动作:
此处缺图
基于神经网络的句法分析器:
看前先科普一下:反向神经网络入门:http://www.hankcs.com/ml/back-propagation-neural-network.html
后面主要是实现过程。