【NLP】句法分析学习笔记(一)

1、句法结构(syntactic structure)分析

  1. 主要有两种方式:成分句法分析(Constituent Parsing)与依存句法分析(Dependency Parsing)
  2. 主要包括两方面的内容,一是确定语言的语法体系,即对语言中合法的句子的语法结构给与形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。
  3. 推荐的学习资料:《Natural Language Processing-Lecture Slides from the 2012 Stanford Coursera course by Dan Jurafsky and Christopher Manning》

数据集

  1. 相对于词性标注,句法分析的数据集要复杂很多,其是一种树形标注结构,称为树库。
  2. 中文宾州树库、清华树库、台湾中研院树库
  3. 每周树库都有自己的标记体系,不能混用

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)

【NLP】句法分析学习笔记(一)_第1张图片

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》
《依存分析:中文依存句法分析简介》

你可能感兴趣的:(NLP,dep,con,依存语法分析,成分句法分析)