1、句法结构(syntactic structure)分析
- 主要有两种方式:成分句法分析(Constituent Parsing)与依存句法分析(Dependency Parsing)
- 主要包括两方面的内容,一是确定语言的语法体系,即对语言中合法的句子的语法结构给与形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。
- 推荐的学习资料:《Natural Language Processing-Lecture Slides from the 2012 Stanford Coursera course by Dan Jurafsky and Christopher Manning》
数据集
- 相对于词性标注,句法分析的数据集要复杂很多,其是一种树形标注结构,称为树库。
- 中文宾州树库、清华树库、台湾中研院树库
- 每周树库都有自己的标记体系,不能混用
2、成分句法分析(Constituent Parsing)
Constituency Parsing主要用phrase structure grammer即短语语法来不断的将词语整理成嵌套的组成成分,又被称为context-free grammers,简写做CFG。
其主要步骤是先对每个词做词性分析part of speech, 简称POS,然后再将其组成短语,再将短语不断递归构成更大的短语。
举个例子
- 对于 the cuddly cat by the door, 先做POS分析,the是限定词,用Det(Determiner)表示,cuddly是形容词,用Adj(Adjective)代表,cat和door是名词,用N(Noun)表示, by是介词,用P(Preposition)表示。
- 然后the cuddly cat构成名词短语NP(Noun Phrase),这里由Det(the)+Adj(cuddly)+N(cat)构成,by the door构成介词短语PP(Preposition Phrase), 这里由P(by)+NP(the door)构成。
- 最后,整个短语the cuddly cat by the door 是NP,由NP(the cuddly cat)+ PP(by the door)构成。
3、依存句法分析(Dependency Parsing)
- 依存句法展示了词语之前的依赖关系,通常用箭头表示其依存关系,有时也会在箭头上标出其具体的语法关系,如是主语还是宾语关系等。
- 依存语法的结构没有非终结点,词与词之间直接发生依存关系,构成一个依存对,其中一个是核心词,也叫支配词,另一个叫修饰词,也叫从属词。
- 依存关系用一个有向弧表示,叫做依存弧。依存弧的方向为由从属词指向支配词,当然反过来也是可以的,按个人习惯统一表示即可。
- 依存句法有两种表现形式,一种是直接在句子上标出依存关系箭头及语法关系,另一种是将其做成树状机构(Dependency Tree Graph)。
DEP遵循的五条公理
在20世纪70年代,Robinson提出依存语法中关于依存关系的四条公理,在处理中文信息的研究中,中国学者提出了依存关系的第五条公理,如下:
1、一个句子中只有一个成分是独立的;
2、其它成分直接依存于某一成分;
3、任何一个成分都不能依存与两个或两个以上的成分;
4、如果A成分直接依存于B成分,而C成分在句中位于A和B之间,那么C或者直接依存于B,或者直接依存于A和B之间的某一成分;
5、中心成分左右两面的其它成分相互不发生关系。
句法分析的应用
句法分析是自然语言处理领域的一个关键问题,如能将其有效解决:
- 一方面,可对相应树库构建体系的正确性和完善性进行验证;
- 另一方面,也可直接服务于各种上层应用,比如搜索引擎用户日志分析和关键词识别,比如信息抽取、自动问答、机器翻译等其他自然语言处理相关的任务。
- 工业界百度和雅虎都有尝试,百度的query分析,雅虎利用句法信息做多粒度切词等等。
依存句法分析能做什么
其实许多人都有一个疑问,依存句法分析究竟可以用来干什么。
句法分析可以对语言进行深层次的理解,用来消除歧义。还可以根据分析的结果对特定的内容进行提取(信息抽取)。
本节就来利用依存句法分析实现一个意见抽取的例子,提取下列商品评论中的属性和买家评价。
from pyhanlp import *
CoNLLSentence = JClass('com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLSentence')
CoNLLWord = JClass('com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord')
IDependencyParser = JClass('com.hankcs.hanlp.dependency.IDependencyParser')
KBeamArcEagerDependencyParser = JClass('com.hankcs.hanlp.dependency.perceptron.parser.KBeamArcEagerDependencyParser')
def main():
parser = KBeamArcEagerDependencyParser()
data="菜量很多,玫瑰不错,气氛很好,不过鸡肉不嫩,总体来说还行。"
tree = parser.parse(data)
print(tree)
print("第一版")
extactOpinion1(tree)
print("第二版")
extactOpinion2(tree)
print("第三版")
extactOpinion3(tree)
def extactOpinion1(tree):
for word in tree.iterator():
if word.POSTAG == "NN" and word.DEPREL == "nsubj":
print("%s = %s" % (word.LEMMA, word.HEAD.LEMMA))
def extactOpinion2(tree):
for word in tree.iterator():
if word.POSTAG == "NN" and word.DEPREL == "nsubj":
if tree.findChildren(word.HEAD, "neg").isEmpty():
print("%s = %s" % (word.LEMMA, word.HEAD.LEMMA))
else:
print("%s = 不%s" % (word.LEMMA, word.HEAD.LEMMA))
def extactOpinion3(tree):
for word in tree.iterator():
if word.POSTAG == "NN":
if word.DEPREL == "nsubj": # ①属性
if tree.findChildren(word.HEAD, "neg").isEmpty():
print("%s = %s" % (word.LEMMA, word.HEAD.LEMMA))
else:
print("%s = 不%s" % (word.LEMMA, word.HEAD.LEMMA))
elif word.DEPREL == "attr":
top = tree.findChildren(word.HEAD, "top") # ②主题
if not top.isEmpty():
print("%s = %s" % (word.LEMMA, top.get(0).LEMMA))
if __name__ == '__main__':
main()
可以尝试搜集更多的句子,通过分析句法结构总结更多的提取规则。
代码输出结果
1 菜量 菜量 N NN _ 5 nsubj _ _
2 很多 很多 C CD _ 5 nsubj _ _
3 , , P PU _ 2 punct _ _
4 玫瑰 玫瑰 N NN _ 5 nsubj _ _
5 不错 不错 V VA _ 0 ROOT _ _
6 , , P PU _ 5 punct _ _
7 气氛 气氛 N NN _ 9 nsubj _ _
8 很 很 A AD _ 9 advmod _ _
9 好 好 V VA _ 5 conj _ _
10 , , P PU _ 5 punct _ _
11 不过 不过 A AD _ 14 advmod _ _
12 鸡肉 鸡肉 N NN _ 14 nsubj _ _
13 不 不 A AD _ 14 neg _ _
14 嫩 嫩 V VA _ 5 conj _ _
15 , , P PU _ 5 punct _ _
16 总体 总体 N NN _ 17 lobj _ _
17 来说 来说 L LC _ 19 loc _ _
18 还 还 A AD _ 19 advmod _ _
19 行 行 V VV _ 5 conj _ _
20 。 。 P PU _ 5 punct _ _
第一版
菜量 = 不错
玫瑰 = 不错
气氛 = 好
鸡肉 = 嫩
第二版
菜量 = 不错
玫瑰 = 不错
气氛 = 好
鸡肉 = 不嫩
第三版
菜量 = 不错
玫瑰 = 不错
气氛 = 好
鸡肉 = 不嫩
LTP依存分析模块所使用的依存关系标记含义
LTP依存分析模块所使用的依存关系标记含义 | 缩写 |
---|---|
定中关系 | ATT(attribute) |
数量关系 | QUN(quantity) |
并列关系 | COO(coordinate) |
同位关系 | APP(appositive) |
前附加关系 | LAD(left adjunct) |
后附加关系 | RAD(right adjunct) |
动宾关系 | VOB(verb-object) |
介宾关系 | POB(preposition-object) |
主谓关系 | SBV(subject-verb) |
比拟关系 | SIM(similarity) |
核心 | HED(head) |
连动结构 | VV(verb-verb) |
关联结构 | CNJ(conjunctive) |
语态结构 | MT(mood-tense) |
独立结构 | IS(independent structure) |
状中结构 | ADV(adverbial) |
动补结构 | CMP(complement) |
“的”字结构 | DE |
“地”字结构 | DI |
“得”字结构 | DEI |
“把”字结构 | BA |
“被”字结构 | BEI |
独立分句 | IC(independent clause) |
依存分句 | DC(dependent clause) |
4、成分句法分析和依存句法分析的不同之处
1、成分句法把句子组织成短语的形式,而依存句法主要揭示了句子中词的依赖关系。
2、两种语法结构能够揭示句子中不同的信息,所以当你在其他任务中,需要用到句子中的短语结构就用constituent ,而需要用到词与词之间的依赖关系就用dependency。
3、依存句法树能够根据成分句法树转换而来,但成分句法树不能通过依存树转化来。转换的规则是head-finding rules from Zhang and Clark 2008
head word
1、在constituent parsing中,一个长短语的head word表示最能表示整个短语的那个词,名词短语一般是名词,动词短语一般是动词。而具体怎么选,则根据不同的parser采取的方案有不同的规定,不过大部分的句子是一样的,如上图这些简单的句子,不同的parser规则,得到的树应该是一样的。
2、在Dependency Parsing中,eg:I do like eating fish.这个句子中eating fish 中心是就是eating,因为fish依赖于eating。
3、中心词的作用可以理解成在parse的过程中的一个重要的特征
参考:
《Constituent Parsing & Dependency Parsing 句法分析简介》
《CS224N笔记(五):Dependency Parsing》
《中文依存句法分析概述及应用》|
《Natural Language Processing-Lecture Slides from the 2012 Stanford Coursera course by Dan Jurafsky and Christopher Manning》
《依存分析:中文依存句法分析简介》