NLP中的树结构
树结构的分类
NLP中常见的树结构有两种,一种是Dependency Tree即依存树,另一种是Constituency Tree(即短语结构树,为了提高准确率,Constituency Tree往往以二叉形式给出)。
下面是几个简单的例子(图片来自网络):
Constituency Tree
Constituency Tree(二叉形式)
Dependency Tree
树结构解析格式的分类
树结构解析最常用的工具是Stanford Parser(Stanford NLP)。
树结构解析的结果格式多样,但是万变不离其宗,大体有以下几种格式:
1.标注边
多见于依存树,除了标注边之外,还可以对边标注关系。以上面例子中的句子为例,可以描述为:
(ROOT,喜欢)
(喜欢,猴子)
(喜欢,香蕉)
(喜欢,吃)
(吃,香蕉)
2.递归用括号语法给出树
多见于短语结构树,除了给出树,还方便标注细粒度的信息和句子/短语成分,以Stanford Sentiment Treebank(SST)数据集某一个格式为例,可以描述为:
( ROOT
( S
( NP ( NNP bromwell ) ( NNP high ) )
( VP ( VBZ is )
( NP ( DT a ) ( NN cartoon ) ( NN comedy ) )
)
( . .)
)
)
3.父节点数组给出树
这个做法类似并查集表示森林的格式。可以表示任何一种树机构。如果父节点数组中除了父节点编号还包含其他信息,相当于标注边的表示。
Dependency parsing
依赖树的解析是一个很重要的任务,近年来NLP任务中依赖树应用越来越广泛,早年有很多句法结构树的树库,如何转化为依赖树也是一个值得研究的方向。
UAS/LAS
这是依赖树解析的评价指标,把算法标的依赖树的边和标准答案对比,标对的边的百分比就是准确率。
UAS:仅仅要求边的两个顶点标对。
LAS:要求边的顶点和关系都标对。
Transition-based denpendency parsing
Dependency tree parsing常见的方法是,把依赖树的建立算法看作一个自动机状态转化的过程,那么依赖树的建立算法可以看作在当前状态下做出最优决策算法。
初始状态 σ = [ROOT], β = w1, …, wn , A = ∅
转移操作:
- Shift σ, wi|β, A 转移到 σ|wi, β, A
- Left-Arcr σ|wi|wj, β, A 转移到 σ|wj, β, A∪{r(wj,wi)}
- Right-Arcr σ|wi|wj, β, A 转移到 σ|wi, β, A∪{r(wi,wj)}
结束状态 σ = [ROOT], β = ∅
例如下图(来自Stanford)描述了一个依赖树的建立过程:
I ate fish,对应自动机Transition为[SSLSRR]
容易知道,长为n的句子,序列中有n个S(一共n+1个结点,[ROOT]初始已经在里面了),n个L/R(一共n条边)。
注意,这样解析出来的依存树的投影结构没有边交叉(projectivity)。对于Non-projectivity的依存树,这种算法是解析不出来的。
Transition-based denpendency parsing的算法
这样转化的的好处是,我们只要训练自动机某个状态下让算法给出转移就好了。
基于概率自动机(HMM)
有一种直接的想法是,自动机可能无法确定转移,所以认为是概率转移的。那么这就是一个概率自动机,只要HMM找到路径概率最大的Finish状态就好了。概率自动机和马尔科夫过程是等价的,所以可以用HMM算法。
基于神经网络
或者直接训练状态到转移的学习算法,而每个状态可以抽feature,再使用MLP之类的神经网络来预测转移。
但是MLP只是单步转态决策单步,可能需要考虑多步。如果根据多步历史状态决策最优状态,可以用LSTM,决策多步最优状态,可以考虑beam-search,综合一下可以考虑Seq2Seq模型。
Constituency Tree转化为Dependency Tree
早期有很多基于规则或者个概率转移的Constituency Parsing算法。
也有很多Constituency Treebank,为了转化为Dependency Treebank,只需要把Constituency Tree的子树根节点上放这个子树span内的head word就可以了,这个过程可以递归完成。
例如下图(图片来自网络):
NLP中的树结构处理思路
CRF
树结构上的概率图模型,可以应用CRF
Tree-LSTM
树结构上可以应用LSTM
转化为feature-based
例如上面讲到的Transition-based就是转化为feature-based的非树结构了。
NLP中的树结构数据集
conll数据集
conll格式介绍
我们这里仅仅用conll数据集做dependency parsing,_表示不考虑标注的其他信息,数据集格式大致如下,以下为测试集第一句话的例子:
id word _ pos pos _ head label _ _
1 No _ ADV DT _ 7 discourse _ _
2 , _ PUNCT , _ 7 punct _ _
3 it _ PRON PRP _ 7 nsubj _ _
4 was _ VERB VBD _ 7 cop _ _
5 n’t _ PART RB _ 7 neg _ _
6 Black _ PROPN JJ _ 7 compound _ _
7 Monday _ PROPN NNP _ 0 root _ _
8 . _ PUNCT . _ 7 punct _ _
一种conll wrapper规范
1
2
3 1 parser, embeddings, train_examples, dev_set, test_set = \
2 load_and_preprocess_data(debug)
3
获得的train_examples是已经基于transtition-based的案例,是list,里面每一项对应一个tuple: (feature, x_one_hot_vector, x),feature格式由抽feature的函数接口决定。
然后dev_set / test_set是list,每一项对应一个dict, dict内包含word,pos , head, label信息,head是计算UAS的信息,labal计算LAS的信息。pos标注词性,word单词内容,这些不用于计分。
SST数据集
SST数据集介绍
斯坦福情感识别树库数据集(Stanford Ssentiment Treebank,简称为SST)。
数据集train/dev/test分别有8544/1101/2210个句子,给出句子的文本以及二叉树形式的句子结构树(Constituency Tree)。
给出239232(239k)个细粒度情感标签,标签是[0,1]间的实数, [0, 0.2], (0.2, 0.4], (0.4, 0.6], (0.6, 0.8], (0.8, 1.0]五个区间分别对应五分类情感。
本数据集的评价指标是句子五分类情感正确率(Fine-grained)和非中性句子的正负情感分类正确率(Binary)。
一种SST wrapper规范
1
2
3 1train, dev, test = get_data()
2
3
train/dev/test是list,里面每一项对应一棵树,这棵树class定义为:
1
2
3
4
5
6
7
8
9
10
11
12 1class TreeType:
2 def __init__(self, score, word_list, child_list):
3 # 表示结点的信息
4 self.score = score
5 self.word_list = word_list
6
7 # 子树节点列表
8 self.child_list = child_list
9
10 # 辅助计算的变量
11 ...
12