1. 基本概念
依存句法分析(Dependency Parsing,DP)通过分析语言单位内成分之间的依存关系,揭示其句法结构。直观来讲,就是分析句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分的关系。对句法结构进行分析,一方面是语言理解的自身需求,句法分析是语言理解的基础,另外一方面,句法分析也为其他自然语言处理任务提供支持。比如:句法驱动的统计机器翻译需要对源语言或目标语言进行句法分析。
1.1 谓词
依存句法认为“谓词”中的动词是一个句子的核心,其他成分与动词直接或者间接的产生联系。
1.2 依存理论
依存理论中,“依存”指的是词与词之间处于支配与被支配的关系,这种关系具有方向性。处于支配地位的词称之为支配者(head),处于被支配地位的成分称之为从属者(dependency)。
依存语法存在一个基本假设,句法分析核心是词与词的依存关系,一个依存关系连接两个词:head和dependency。依存关系可以细分为不同类型,表示具体的两个词的依存关系。
1.3 依存关系
关系类型 | Tag | Description | Example |
---|---|---|---|
主谓关系 | SBV | subject-verb | 我送她一束花 (我 <– 送) |
动宾关系 | VOB | 直接宾语,verb-object | 我送她一束花 (送 –> 花) |
间宾关系 | IOB | 间接宾语,indirect-object | 我送她一束花 (送 –> 她) |
前置宾语 | FOB | 前置宾语,fronting-object | 他什么书都读 (书 <– 读) |
兼语 | DBL | double | 他请我吃饭 (请 –> 我) |
定中关系 | ATT | attribute | 红苹果 (红 <– 苹果) |
状中结构 | ADV | adverbial | 非常美丽 (非常 <– 美丽) |
动补结构 | CMP | complement | 做完了作业 (做 –> 完) |
并列关系 | COO | coordinate | 大山和大海 (大山 –> 大海) |
介宾关系 | POB | preposition-object | 在贸易区内 (在 –> 内) |
左附加关系 | LAD | left adjunct | 大山和大海 (和 <– 大海) |
右附加关系 | RAD | right adjunct | 孩子们 (孩子 –> 们) |
独立结构 | IS | independent structure | 两个单句在结构上彼此独立 |
核心关系 | HED | head | 指整个句子的核心 |
2. 基本方法
-
基于转移的方法
基于转移的方法通过shift-reduce两个基本动作,将序列转为树结构。首先用一个 buffer 来存储所有未处理的输入句子,并用一个栈来存储当前的分析状态。动作可以分为:
- shift,即将 buffer 中的一个词移到栈中;
- l e f t _ a r c ( x ) left\_arc(x) left_arc(x),即栈顶两个词 a,b 为 a<-b 的依赖关系,关系种类为 x;
- r i g h t _ a r c ( x ) right\_arc(x) right_arc(x),即栈顶两个词 a,b 为 a->b 的依赖关系,关系种类为 x。后两种动作为 reduce 动作。
目前,基于转移的方法最好模型是stack lstm。 通过三个 LSTM 来分别建模栈状态、待输入序列和动作序列。 其中因为栈需要入栈和出栈,因此作者提出了一个 Stack LSTM 来建模栈状态。
论文地址: https://arxiv.org/pdf/1505.08075.pdf
-
基于图的方法
目前的依存句法分析中,最流行的方法是基于图的方法经典的方法是 Biaffine 模型。直接用神经网络来预测每两个词之间存在依存关系的概率,这样我们就得到一个全连接图,图上每个边代表了节点 a 指向节点 b 的概率。然后使用MST等方法来来将图转换为一棵树。
Biaffine 模型其实和我们目前全连接自注意力模型非常类似。Biaffine 模型十分简单,并且容易理解,并且在很多数据集上都取得了目前最好的结果。
论文地址:https://arxiv.org/pdf/1611.01734.pdf
-
联合模型(深度学习)
-
词性标注&句法分析
联合词性标注和句法分析的模型有很多,可以是基于转移的方法,也可以是基于图的方法,这里介绍一个简单思路。首先利用lstm来预测词性,然后联合词性信息和词信息一起用另外一个lstm来建模,并用Biaffine模型来做句法分析。
-
论文地址: https://arxiv.org/pdf/1807.03955.pdf
-
中文分词&句法分析
中文的句法分析是基于词级别的,所以在句法分析之前,会做分词。为了避免流水线模式的错误积累,很容易想到的就是分词和词法分析联合建模。
这里主要介绍一下邱希鹏教授实验室提出的模型:joint CWS。
其中两个关键点:
- biaffine parsing
- ‘app’ 作为特殊的依赖关系
其实方法很简单,只需要将词内部的字之间加上一个特殊的依赖关系“app”,然后将词级别的依存关系转换为字级别的依存关系。并且用 biaffine 模型来进行同时预测。
论文地址:https://arxiv.org/pdf/1904.04697.pdf
3. 常用工具
https://www.jianshu.com/p/867bd48cd9ad
3.1 LTP
-
安装
pip install pyltp
-
下载数据包
ltp_data_v3.4.0: 链接: https://pan.baidu.com/s/1aDrb95ylZHoTPKJY6K1Slw 密码: ehe2
-
测试代码
from pyltp import Parser, Postagger, Segmentor text = 'HanLP是一系列模型与算法组成的自然语言处理工具包,目标是普及自然语言处理在生产环境中的应用。' # 分词 segmentor = Segmentor() segmentor.load("/home/sunshine/datasets/other/ltp_data_v3.4.0/cws.model") tokens = segmentor.segment(text) # 词性 postagger = Postagger() postagger.load('/home/sunshine/datasets/other/ltp_data_v3.4.0/pos.model') postags = postagger.postag(tokens) # 依存句法分析 parser = Parser() parser.load('/home/sunshine/datasets/other/ltp_data_v3.4.0/parser.model') arcs = parser.parse(tokens, postags) i = 1 result = zip(tokens, postags, arcs) for item in result: print(i, item[0], item[1], item[2].head, item[2].relation) i += 1
1 HanLP ws 2 SBV 2 是 v 0 HED 3 一 m 4 ATT 4 系列 q 5 ATT 5 模型 n 8 SBV 6 与 c 7 LAD 7 算法 n 5 COO 8 组成 v 12 ATT 9 的 u 8 RAD 10 自然 n 11 ATT 11 语言 n 12 SBV 12 处理 v 2 VOB 13 工具包 n 12 VOB 14 , wp 2 WP 15 目标 n 16 SBV 16 是 v 2 COO 17 普及 v 16 VOB 18 自然 n 19 ATT 19 语言 n 20 ATT 20 处理 v 17 VOB 21 在 p 26 ATT 22 生产 v 23 ATT 23 环境 n 24 ATT 24 中 nd 21 POB 25 的 u 21 RAD 26 应用 v 20 VOB 27 。 wp 2 WP
3.2 stanfordNLP
3.2.1 StanordCoreNLP
Github地址:https://github.com/Lynten/stanford-corenlp
官网:https://stanfordnlp.github.io/CoreNLP/
-
安装
pip install stanfordcorenlp
-
安装java环境(略)
-
下载数据包
链接: https://pan.baidu.com/s/1kD3gaxVwvxZGaEN3EDedvA 提取码: m72n
数据包下载之后,解压stanford-corenlp-full-2018-02-27.zip,将stanford-chinese-corenlp-2018-02-27-models.jar拷贝至stanford-corenlp-full-2018-02-27.zip解压目录。
-
测试代码
from stanfordcorenlp import StanfordCoreNLP text = 'HanLP是一系列模型与算法组成的自然语言处理工具包,目标是普及自然语言处理在生产环境中的应用。' nlp = StanfordCoreNLP("/home/sunshine/datasets/other/standfordCoreNLP/stanford-corenlp-full-2018-02-27", lang='zh') tokens = nlp.word_tokenize(text) postags = nlp.pos_tag(text) result = nlp.dependency_parse(text) i = 1 for item in zip(tokens, postags, result): print(i, item[0], item[1][1], item[2][1], item[2][2]) i += 1
1 HanLP NR 0 12 2 是 VC 12 1 3 一 CD 12 2 4 系列 M 11 3 5 模型 NN 3 4 6 与 CC 7 5 7 算法 NN 7 6 8 组成 VV 8 7 9 的 DEC 11 8 10 自然 NN 8 9 11 语言 NN 11 10 12 处理 VV 12 11 13 工具包 NN 12 13 14 , PU 12 14 15 目标 NN 17 15 16 是 VC 17 16 17 普及 VV 12 17 18 自然 NN 19 18 19 语言 NN 17 19 20 处理 VV 17 20 21 在 P 23 21 22 生产 NN 23 22 23 环境 NN 26 23 24 中 LC 23 24 25 的 DEG 23 25 26 应用 NN 20 26 27 。 PU 12 27
-
依存句法解释
> > ROOT:要处理文本的语句 > > IP:简单从句 > > NP:名词短语 > > VP:动词短语 > > PU:断句符,通常是句号、问号、感叹号等标点符号 > > LCP:方位词短语 > > PP:介词短语 > > CP:由‘的’构成的表示修饰性关系的短语 > > DNP:由‘的’构成的表示所属关系的短语 > > ADVP:副词短语 > > ADJP:形容词短语 > > DP:限定词短语 > > QP:量词短语 > > NN:常用名词 > > NR:固有名词 > > NT:时间名词 > > PN:代词 > > VV:动词 > > VC:是 > > CC:表示连词 > > VE:有 > > VA:表语形容词 > > AS:内容标记(如:了) > > VRD:动补复合词 > > CD: 表示基数词 > > DT: determiner 表示限定词 > > EX: existential there 存在句 > > FW: foreign word 外来词 > > IN: preposition or conjunction, subordinating 介词或从属连词 > > JJ: adjective or numeral, ordinal 形容词或序数词 > > JJR: adjective, comparative 形容词比较级 > > JJS: adjective, superlative 形容词最高级 > > LS: list item marker 列表标识 > > MD: modal auxiliary 情态助动词 > > PDT: pre-determiner 前位限定词 > > POS: genitive marker 所有格标记 > > PRP: pronoun, personal 人称代词 > > RB: adverb 副词 > > RBR: adverb, comparative 副词比较级 > > RBS: adverb, superlative 副词最高级 > > RP: particle 小品词 > > SYM: symbol 符号 > > TO:”to” as preposition or infinitive marker 作为介词或不定式标记 > > WDT: WH-determiner WH限定词 > > WP: WH-pronoun WH代词 > > WP$: WH-pronoun, possessive WH所有格代词 > > WRB:Wh-adverb WH副词 > > > > 关系表示 > > abbrev: abbreviation modifier,缩写 > > acomp: adjectival complement,形容词的补充; > > advcl : adverbial clause modifier,状语从句修饰词 > > advmod: adverbial modifier状语 > > agent: agent,代理,一般有by的时候会出现这个 > > amod: adjectival modifier形容词 > > appos: appositional modifier,同位词 > > attr: attributive,属性 > > aux: auxiliary,非主要动词和助词,如BE,HAVE SHOULD/COULD等到 > > auxpass: passive auxiliary 被动词 > > cc: coordination,并列关系,一般取第一个词 > > ccomp: clausal complement从句补充 > > complm: complementizer,引导从句的词好重聚中的主要动词 > > conj : conjunct,连接两个并列的词。 > > cop: copula。系动词(如be,seem,appear等),(命题主词与谓词间的)连系 > > csubj : clausal subject,从主关系 > > csubjpass: clausal passive subject 主从被动关系 > > dep: dependent依赖关系 > > det: determiner决定词,如冠词等 > > dobj : direct object直接宾语 > > expl: expletive,主要是抓取there > > infmod: infinitival modifier,动词不定式 > > iobj : indirect object,非直接宾语,也就是所以的间接宾语; > > mark: marker,主要出现在有“that” or “whether”“because”, “when”, > > mwe: multi-word expression,多个词的表示 > > neg: negation modifier否定词 > > nn: noun compound modifier名词组合形式 > > npadvmod: noun phrase as adverbial modifier名词作状语 > > nsubj : nominal subject,名词主语 > > nsubjpass: passive nominal subject,被动的名词主语 > > num: numeric modifier,数值修饰 > > number: element of compound number,组合数字 > > parataxis: parataxis: parataxis,并列关系 > > partmod: participial modifier动词形式的修饰 > > pcomp: prepositional complement,介词补充 > > pobj : object of a preposition,介词的宾语 > > poss: possession modifier,所有形式,所有格,所属 > > possessive: possessive modifier,这个表示所有者和那个’S的关系 > > preconj : preconjunct,常常是出现在 “either”, “both”, “neither”的情况下 > > predet: predeterminer,前缀决定,常常是表示所有 > > prep: prepositional modifier > > prepc: prepositional clausal modifier > > prt: phrasal verb particle,动词短语 > > punct: punctuation,这个很少见,但是保留下来了,结果当中不会出现这个 > > purpcl : purpose clause modifier,目的从句 > > quantmod: quantifier phrase modifier,数量短语 > > rcmod: relative clause modifier相关关系 > > ref : referent,指示物,指代 > > rel : relative > > root: root,最重要的词,从它开始,根节点 > > tmod: temporal modifier > > xcomp: open clausal complement > > xsubj : controlling subject 掌控者 > > 中心语为谓词 > > subj — 主语 > > nsubj — 名词性主语(nominal subject) (同步,建设) > > top — 主题(topic) (是,建筑) > > npsubj — 被动型主语(nominal passive subject),专指由“被”引导的被动句中的主语,一般是谓词语义上的受事 (称作,镍) > > csubj — 从句主语(clausal subject),中文不存在 > > xsubj — x主语,一般是一个主语下面含多个从句 (完善,有些) > > 中心语为谓词或介词 > > obj — 宾语 > > dobj — 直接宾语 (颁布,文件) > > iobj — 间接宾语(indirect object),基本不存在 > > range — 间接宾语为数量词,又称为与格 (成交,元) > > pobj — 介词宾语 (根据,要求) > > lobj — 时间介词 (来,近年) > > 中心语为谓词 > > comp — 补语 > > ccomp — 从句补语,一般由两个动词构成,中心语引导后一个动词所在的从句(IP) (出现,纳入) > > xcomp — x从句补语(xclausal complement),不存在 > > acomp — 形容词补语(adjectival complement) > > tcomp — 时间补语(temporal complement) (遇到,以前) > > lccomp — 位置补语(localizer complement) (占,以上) > > — 结果补语(resultative complement) > > 中心语为名词 > > mod — 修饰语(modifier) > > pass — 被动修饰(passive) > > tmod — 时间修饰(temporal modifier) > > rcmod — 关系从句修饰(relative clause modifier) (问题,遇到) > > numod — 数量修饰(numeric modifier) (规定,若干) > > ornmod — 序数修饰(numeric modifier) > > clf — 类别修饰(classifier modifier) (文件,件) > > nmod — 复合名词修饰(noun compound modifier) (浦东,上海) > > amod — 形容词修饰(adjetive modifier) (情况,新) > > advmod — 副词修饰(adverbial modifier) (做到,基本) > > vmod — 动词修饰(verb modifier,participle modifier) > > prnmod — 插入词修饰(parenthetical modifier) > > neg — 不定修饰(negative modifier) (遇到,不) > > det — 限定词修饰(determiner modifier) (活动,这些) > > possm — 所属标记(possessive marker),NP > > poss — 所属修饰(possessive modifier),NP > > dvpm — DVP标记(dvp marker),DVP (简单,的) > > dvpmod — DVP修饰(dvp modifier),DVP (采取,简单) > > assm — 关联标记(associative marker),DNP (开发,的) > > assmod — 关联修饰(associative modifier),NP|QP (教训,特区) > > prep — 介词修饰(prepositional modifier) NP|VP|IP(采取,对) > > clmod — 从句修饰(clause modifier) (因为,开始) > > plmod — 介词性地点修饰(prepositional localizer modifier) (在,上) > > asp — 时态标词(aspect marker) (做到,了) > > partmod– 分词修饰(participial modifier) 不存在 > > etc — 等关系(etc) (办法,等) > > 中心语为实词 > > conj — 联合(conjunct) > > cop — 系动(copula) 双指助动词???? > > cc — 连接(coordination),指中心词与连词 (开发,与) > > 其它 > > attr — 属性关系 (是,工程) > > cordmod– 并列联合动词(coordinated verb compound) (颁布,实行) > > mmod — 情态动词(modal verb) (得到,能) > > ba — 把字关系 > > tclaus — 时间从句 (以后,积累) > > — semantic dependent > > cpm — 补语化成分(complementizer),一般指“的”引导的CP (振兴,的) > > ``` > ```
3.2.2 stanza
github: https://github.com/stanfordnlp/stanza
stanza同样是stanford发布的版本。
-
安装
pip install stanza
-
下载模型
import stanza stanza.download('zh')
我这里提供一份中文的模型包供大家下载。
链接: https://pan.baidu.com/s/1hb9ATqpOGC9sHBHZ2hNdeg 提取码: fqdm
-
测试代码
import stanza nlp = stanza.Pipeline('zh') # This sets up a default neural pipeline in English doc = nlp("HanLP是一系列模型与算法组成的自然语言处理工具包,目标是普及自然语言处理在生产环境中的应用。") doc.sentences[0].print_dependencies()
('HanLP', '14', 'nsubj') ('是', '14', 'cop') ('一', '4', 'nummod') ('系列', '5', 'clf') ('模型', '8', 'nsubj') ('与', '7', 'cc') ('算法', '5', 'conj') ('组成', '14', 'acl:relcl') ('的', '8', 'mark:relcl') ('自然', '12', 'nmod') ('语言', '12', 'compound') ('处', '13', 'nmod') ('理工', '14', 'nsubj') ('具包', '0', 'root') (',', '14', 'punct') ('目标', '17', 'nsubj') ('是', '14', 'parataxis') ('普及', '17', 'xcomp') ('自然', '20', 'nmod') ('语言', '21', 'nsubj') ('处理', '18', 'ccomp') ('在', '27', 'det') ('生产', '24', 'nmod') ('环境', '22', 'nmod') ('中', '24', 'acl') ('的', '22', 'case:dec') ('应用', '18', 'obj') ('。', '14', 'punct')
3.3 HaNLP
官网:http://hanlp.linrunsoft.com/
在线演示:http://hanlp.com/
3.3.1 pyhanlp(hanlp1.x)
Github地址:https://github.com/hankcs/pyhanlp
-
安装
pip install pyhanlp
-
下载数据包
data:链接: https://pan.baidu.com/s/169Fgb6vhfsx10O2xEomY1Q 提取码: r4zv
将下载的数据包解压至%python_lib%/site-packages/pyhanlp/static文件夹。我这里提供的是1.7.5版本,同样支持1.7.7版本的pyhanlp。
默认会自动下载相关的jar包。
-
测试代码
from pyhanlp import HanLP print(HanLP.parseDependency("HanLP是一系列模型与算法组成的自然语言处理工具包,目标是普及自然语言处理在生产环境中的应用"))
1 HanLP HanLP ws nx _ 2 主谓关系 _ _ 2 是 是 v v _ 0 核心关系 _ _ 3 一系列 一系列 n n _ 4 定中关系 _ _ 4 模型 模型 n n _ 7 主谓关系 _ _ 5 与 与 p p _ 7 状中结构 _ _ 6 算法 算法 n n _ 5 介宾关系 _ _ 7 组成 组成 v v _ 10 定中关系 _ _ 8 的 的 u u _ 7 右附加关系 _ _ 9 自然语言处理 自然语言处理 nz nz _ 10 定中关系 _ _ 10 工具包 工具包 n n _ 2 动宾关系 _ _ 11 , , wp w _ 2 标点符号 _ _ 12 目标 目标 n n _ 13 主谓关系 _ _ 13 是 是 v v _ 2 并列关系 _ _ 14 普及 普及 v v _ 13 动宾关系 _ _ 15 自然语言处理 自然语言处理 nz nz _ 19 主谓关系 _ _ 16 在 在 p p _ 19 状中结构 _ _ 17 生产环境 生产环境 n n _ 16 介宾关系 _ _ 18 中的 中的 v v _ 19 状中结构 _ _ 19 应用 应用 v vn _ 14 动宾关系 _ _
3.3.2 hanlp2.0
-
安装
pip install hanlp
hanlp2.0是基于tensorflow2.1训练的网络模型,线上提供了很多训练好的预训练模型,问题在于基本上不可能自动下载成功,需要手动下载模型并存放到相应的位置。
-
查看已经提供的模型
import hanlp for k,v in hanlp.pretrained.ALL.items(): print(k, v)
-
测试代码
tokenizer = hanlp.load('CTB6_CONVSEG') tagger = hanlp.load('CTB5_POS_RNN') syntactic_parser = hanlp.load('CTB7_BIAFFINE_DEP_ZH') pipeline = hanlp.pipeline() \ .append(hanlp.utils.rules.split_sentence, output_key='sentences') \ .append(tokenizer, output_key='tokens') \ .append(tagger, output_key='part_of_speech_tags') \ .append(syntactic_parser, input_key=('tokens', 'part_of_speech_tags'), output_key='syntactic_dependencies', conll=False) text = 'HanLP是一系列模型与算法组成的自然语言处理工具包,目标是普及自然语言处理在生产环境中的应用' doc = pipeline(text) tokens = doc.tokens[0] pos = doc.part_of_speech_tags[0] dependencies = doc.syntactic_dependencies[0] for i in range(len(tokens)): print(i, tokens[i], pos[i], dependencies[i][0], dependencies[i][1])
0 HanLP NN 2 top 1 是 VC 0 root 2 一系列 NN 6 nn 3 模型 NN 6 conj 4 与 CC 6 cc 5 算法 NN 7 nsubj 6 组成 VV 10 rcmod 7 的 DEC 7 cpm 8 自然 NN 10 nn 9 语言 NN 11 nsubj 10 处理 VV 2 ccomp 11 工具包 PU 11 punct 12 , PU 2 punct 13 目标 NN 15 top 14 是 VC 2 conj 15 普及 VV 15 ccomp 16 自然 NN 18 nn 17 语言 NN 16 dobj 18 处理 VV 16 conj 19 在 P 25 assmod 20 生产 NN 22 nn 21 环境 NN 23 lobj 22 中 LC 20 plmod 23 的 DEG 20 assm 24 应用 NN 19 dobj
4. 数据集
-
Penn Treebank
Penn Treebank是一个项目的名称,项目目的是对语料进行标注,标注内容包括词性标注以及句法分析。
-
SemEval-2016 Task 9
中文语义依存图数据:http://ir.hit.edu.cn/2461.html
下载地址:https://github.com/HIT-SCIR/SemEval-2016
-
evsam05
链接: https://pan.baidu.com/s/1cFQBNcd-HnuTPUlGT7h9wg 提取码: tjdx
-
CoNLL任务
- http://universaldependencies.org/conll18/
- http://ufal.mff.cuni.cz/conll2009-st/
- https://www.clips.uantwerpen.be/conll2008/
- https://www.clips.uantwerpen.be/conll2007/
5. 可视化工具
-
conllu.js
-
DependencyViewer.exe
参考:
https://mp.weixin.qq.com/s/AP4TCnRfIccqAxDu4FlBew
来源:oschina
链接:https://my.oschina.net/u/4393724/blog/4258422