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 中的一個詞移到棧中;
- ,即棧頂兩個詞 a,b 爲 a<-b 的依賴關係,關係種類爲 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
參考: