句法是指句子的各個組成部分的相互關係,句法分析分爲句法結構分析(syntactic structure parsing)和依存關係分析(dependency parsing)。句法結構分析用於獲取整個句子的句法結構,依存分析用於獲取詞彙之間的依存關係,目前的句法分析已經從句法結構分析轉向依存句法分析。瀏覽器
依存語法經過分析語言單位內成分之間的依存關係揭示其句法結構,主張句子中核心動詞是支配其它成分的中心成分,而它自己卻不受其它任何成分的支配,全部受支配成分都以某種依存關係從屬於支配者。ide
在20世紀70年代,Robinson提出依存語法中關於依存關係的四條公理:ui
- 一個句子中只有一個成分是獨立的;
- 其它成分直接依存於某一成分;
- 任何一個成分都不能依存與兩個或兩個以上的成分;
- 若是A成分直接依存於B成分,而C成分在句中位於A和B之間,那麼C或者直接依存於B,或者直接依存於A和B之間的某一成分;
一,依存關係
依存關係是一箇中心詞與其從屬之間的二元非對稱關係,一個句子的中心詞一般是動詞(Verb),全部其餘詞要麼依賴於中心詞,要麼經過依賴路徑與它關聯。url
1,依存關係spa
依存結構是加標籤的有向圖,箭頭從中心詞指向從屬,具體來講,箭頭是從head指向child,從該解析樹能夠看出,每一個Token只有一個Head。.net
2,關係標籤3d
標籤表示從屬的語法功能,名詞性的標籤是:code
- root:中心詞,一般是動詞
- nsubj:名詞性主語(nominal subject)
- dobj:直接賓語(direct object)
- prep:介詞
- pobj:介詞賓語
- cc:連詞
其餘經常使用的標籤:orm
- compound:複合詞
- advmod:狀語
- det:限定詞
- amod:形容詞修飾語
二,解析依存關係
SpaCy可以快速準確地解析句子的依存關係,而且具備豐富的API用於導航依存關係樹,SpaCy使用head和child來描述依存關係中的鏈接,識別每一個Token的依存關係:blog
- token.text:token的文本
- token.head:當前Token的Parent Token,從語法關係上來看,每個Token都只有一個Head。
- token.dep_:依存關係
- token.children:語法上的直接子節點
- token.ancestors:語法上的父節點
- _pos:詞性
- _tag:詞性
讓我使用SpaCy來對句子進行依存分析:
import spacy nlp = spacy.load('en') doc = nlp( "spaCy uses the terms head and child to describe the words" ) for token in doc: print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
打印每一個Token的依存關係和head節點,箭頭表示從屬關係,獲得的結果是:
spaCy(NNP) <-- nsubj -- uses(VBZ) uses(VBZ) <-- ROOT -- uses(VBZ) the(DT) <-- det -- head(NN) terms(NNS) <-- compound -- head(NN) head(NN) <-- dobj -- uses(VBZ) and(CC) <-- cc -- head(NN) child(NN) <-- conj -- head(NN) to(TO) <-- aux -- describe(VB) describe(VB) <-- xcomp -- uses(VBZ) the(DT) <-- det -- words(NNS) words(NNS) <-- dobj -- describe(VB)
也可使用display來顯示依存關係,在瀏覽器中輸入 http://localhost:5000 顯示依存結構:
import spacy from spacy import displacy nlp = spacy.load('en') doc = nlp( "spaCy uses the terms head and child to describe the words" ) displacy.serve(doc, style='dep')
參考文檔: