多年来 NLP 领域最广泛的两种句法分析理论分别为 转换生成语法和依存句法。

转换生成语法

短语结构文法:形式化定义为 G = (X,V,S,R) 这样一个四元组。X 是词汇集合,称为终结符。V 是标注的集合,称为非终结符。S 属于 V ,称为文法开始符。R 是有序偶对(α,β)的集合,α 是集合 (X∪V)上的字符串,但至少包含一个非终结符,β 是(X∪V) 闭包的元素。一般的,将有序偶对 (α,β) 记为 α-> β,“->” 读作“定义为”。R 中的有序偶对称为 生产式。

上下文无关文法:给定文法 G,如果对于任意生产式 v -> w,而 v 只是一个非终结符,即 A -> w, A 属于 V,属于  (X∪V)的闭集,则称文法 G 为 上下文无关文法。

转换生产语法就是根据句子文法产生式推导出句子短语结构树的推导过程,也称为推导树

举例: 比如有上下文无关文法产生式如下

(1)S-> NR,VP        (5)NN-> 会议.

(2)VP -> VV,AS,NP  (6) NR -> 张三.

(3)NP -> NN             (7)VV -> 参加.

(4)NP -> NR             (8)AS -> 了

经过分词,标注后得到的结果如下:

张三/NR 参加/VV 了/AS 会议/NN ,推导过程如下

(NR 张三) (VV 参加) (AS 了) (NN 会议)    --> 根据规则 5,6,7,8

(NP (NR 张三) ) (VV 参加) (AS 了) (NP (NN 会议))  --> 根据规则 3,4

(NP (NR 张三) ) (VP (VV 参加) (AS 了) (NP (NN 会议)))  --> 根据规则 2

(S (NP (NR 张三) ) (VP (VV 参加) (AS 了) (NP (NN 会议)))) --> 根据规则1

这就是短语结构推导树。

nltk 操作句法树如下示例:

# -*- coding:utf-8 -*-
from __future__ import unicode_literals
import sys,os
reload(sys)
sys.setdefaultencoding("utf-8")

from nltk import Tree,ParentedTree

def flatten_childtrees(trees): # 扁平化子树结构
    children = []
    for t in trees:
        if t.height() < 3:
            children.extend(t.pos())
        elif t.height() <= 3:
            children.append(Tree(t.label(),t.pos()))
        else:
            children.extend(flatten_childtrees([c for c in t]))
        
    return children
    
def flatten_deeptree(tree): # 解析 prop
    return Tree(tree.label(),flatten_childtrees([c for c in tree]))
    
def getwordposlist(tree): # 得到所有叶子节点和词性
    return [tree[pos] + "/" + tree[pos[:-1]].label() for pos in tree.treepositions('leaves')]
    
def getbranch(tree,keyword,branchlabel): # 根据给定的词汇和子树标签,得到词汇所在的一颗子树
    gspos = tuple()
    for pos in tree.treepositions('leaves'):
        if tree[pos] == keyword:gspos = pos
    indx = -1
    for count in xrange(len(gspos) - 1):
        if tree[gspos[:indx]].label() == branchlabel:
            return tree[gspos[:indx]]
        indx -= 1
        
if __name__ == "__main__":
    mytree = Tree.fromstring("(IP (IP (NP-SBJ (NN 建筑) (NN 公司)) (VP (VV 进) \
        (NP-OBJ (NN 区)))) (PU ,)(IP (NP-SBJ (ADJP (JJ 有关)) (NP (NN 部门))) (VP (ADVP (AD 先)) \
        (VP (VV 送上)(NP-OBJ (DP (DT 这些)) (NP (NN 法规性) (NN 文件)))))) (PU ,) (IP (NP-SBJ (-NONE- *pro*))\
        (VP (ADVP (AD 然后)) (VP (VE 有) (IP-OBJ (NP-SBJ (ADJP (JJ 专门)) (NP (NN 队伍))) (VP (VV 进行) \
        (NP-OBJ (NN 监督) (NN 检查))))))) (PU 。))")
    
    # 得到所有叶子节点和词性
    wordpostaglist = [word_pos[0][0] + "/" +word_pos[0][1] for word_pos in flatten_deeptree(mytree).pos()]
    for wordpostag in wordpostaglist:
        if wordpostag.find("-NONE-") == -1: # 去除空范畴
            print wordpostag
        
    # 得到所有叶子节点和词性方法二
    for wordpostag in getwordposlist(mytree):
        if wordpostag.find("-NONE-") == -1:
            print wordpostag
    
    # 找到 “公司” 所在的 IP 子树
    branch = getbranch(mytree,"公司","IP")
    print str(branch).decode("unicode-escape")
    
    # 使用 ParentTree 过滤出所需要的子树 (消除递归嵌套)
    ptree = ParentedTree.convert(mytree)
    for subptree in ptree.subtrees(): # 递归遍历所有的子树
        if subptree.label().find("NP") != -1 and \
                    mytree[subptree.treeposition()[:-1]].label().find("NP") == -1:
            print str(subptree).decode("unicode-escape")

依存句法

配价理论:动词中心论,可以把动词比作一个带钩的原子,动词用这些钩子来吸引与其数量相同的行动元(论元)作为自己的从属成分。一个动词所具有的钩子的数量,即动词所能支配的论元的数量就构成了我们所说的动词的配价。应该指出的是,不必总是要求动词依照其配价带全所有的论元,或者说让动词达到饱和状态。有些价可以不用或空缺。

谓词论元和空范畴:就是作为谓词的动词在不饱和状态下的情况称为空范畴。

(XP(-NONE-*T*))                                          XP 的移位语迹,诸如话题化
(NP(-NONE-*))                                              NP 的移位语迹
(NP(-NONE-*PRO*))                                    隐含主语的 NP 结构
(NP(-NONE-*pro*))                                       脱落论元(省略 主语/宾语)
((-NONE-*OP*))                                            用于关系结构的空 OP 算子
(WHPP(-NONE-*OP*))                                用于特殊疑问句的空 PP 算子
(XP(-NONE-*RNR*))                                    用于右侧节点提升的空语类
(XP(-NONE-*?*))                                          省略占位符

轻动词:在机构中所起的语义作用非常有限,主要扮演功能上的辅助角色的一类特殊的动词。

一个动词可同时用于轻动词和非轻动词,需要确定轻动词的语义。轻动词的论元结构和非轻动词是不同的。在轻动词结构,真正的谓语通常是轻动词支持的名词化的谓词结构。

配价词典:统计每个动词可能的语义和每种语义的价数,价质(语义角色 施事受事与事)和价形(句法位置 主语宾语状语)

依存理论概述:张三/nh 参加/v 了/u 这次/r 会议/n (LTP 分词和标注结果)

分词和标注列表形式

0

张三

nh

1

参加

v

2


u

3

这次

r

4

会议

n

加入依存关系列并给出根节点序号为 0

0

张三

nh

 

1

参加

v

0

2


u

 

3

这次

r

 

4

会议

n

 

依次补全剩下的节点的依存关系

0

张三

nh

1

1

参加

v

0

2


u

1

3

这次

r

4

4

会议

n

1

依存句法的生成

0

张三

nh

1

SBV

1

参加

v

0

HED

2


u

1

RAD

3

这次

r

4

ATT

4

会议

n

1

VOB

LTP 的依存句法解析标签

关系类型

Tag

Description

Example

主谓关系

SBV

subject-verb

我送她一束花(我 <-- 送)

动宾关系

VOB

直接宾语

我送她一束花(送 --> 花)

间宾关系

IOB

间接宾语

我送她一束花(送 --> 她)

前置宾语

FOB

前置宾语

他什么书都读 (书 <-- 读)

兼语

DBL

double

他请我吃饭(请 --> 我)

定中关系

ATT

attribute

红苹果 (红 <-- 苹果)

状中结构

ADV

adverbial

非常美丽(非常 <-- 美丽)

动补结构

CMP

complement

做完了作业(做 --> 完)

并列关系

COO

Coordinate

大山和大海(大山 --> 大海)

介宾关系

POB

preposition-object

在贸易区内(在 --> 内)

左附加关系

LAD

left adjunct

大山和大海(和 <-- 大海)

右附加关系

RAD

right adjunct

孩子们(孩子 --> 们)

独立结构

IS

independent structure

两个单句在结构上批次独立

核心关系

HED

head

指整个句子的核心