在Jupyter Notebook中使用spaCy可视化中英文依存句法分析结果

2021-8-30 16:23| 发布者: Fuller| 查看: 4149| 评论: 0

摘要: 本Notebook是上周发布的Jupyter Notebook使用Python做中英文自然语言依存句法分析实验的续篇,在上一篇的基础上加上了可视化部分。

1,本Notebook背景介绍

本Notebook是上周发布的Jupyter Notebook使用Python做中英文自然语言依存句法分析实验的续篇。

上周发布的那篇依存句法分析实验的Notebook点击量挺高的。有同学留言,建议加上可视化的部分,以更清晰的查看和比较实验结果。

今天的这篇就在上一篇的基础上加上了可视化部分。

1.1,什么是依存句法分析?

笔者简单整理了句法分析的脑图:句法分析脑图

依存文法存在一个共同的基本假设:文法结构本质上包含词和词之间的依存(修饰)关系。一个依存关系连接两个词,分别是核心词( head)和依存词( dependent)。依存关系可以细分为不同的类型,表示两个词之间的具体句法关系。

依存关系是一个核心词与它的依赖之间的二元对称关系。一个句子的核心词通常是动词,所有其他词要么依赖于核心词,要么依赖路径与它联通。

依存关系表示是一个加标签的有向图,其中节点是词汇项,加标签的弧表示依赖关系, 从中心词到依赖。

在20世纪70年代,Robinson提出依存语法中关于依存关系的四条公理:

1. 一个句子中只有一个成分是独立的;

2. 其它成分直接依存于某一成分;

3. 任何一个成分都不能依存与两个或两个以上的成分;

4. 如果A成分直接依存于B成分,而C成分在句中位于A和B之间,那么C或者直接依存于B,或者直接依存于A和B之间的某一成分;

下面是中文句子依存关系示意图:

示例一的中文句子:“吃”是中心词(ROOT)

“小猴子吃了5条香蕉”

示例二得中文句子:“宣布”是中心词(ROOT)

“苹果宣布将设立一项基金帮助美国小型开发者”

1.1.1,依存关系

依存结构是加标签的有向图,箭头从中心词指向从属,具体来说,箭头是从head指向child,从该解析树可以看出,每个Token只有一个Head。

1.1.2,关系标签

标签表示从属的语法功能,名词性的标签是:

1. root:中心词,通常是动词

2. nsubj:名词性主语(nominal subject)

3. dobj:直接宾语(direct object)

4. prep:介词

5. pobj:介词宾语

6. cc:连词

其他常用的标签:

7. compound:复合词

8. advmod:状语

9. det:限定词

10. amod:形容词修饰语


上面解释的参考文献:

1. python自然语言处理学习笔记(八)—— 句法分析

2. spaCy 第三篇:依存分析

3. 成分句法分析 & 依存句法分析 Parsing 知识图谱

1.2,能不能在python中做依存句法分析方面的实验呢?

笔者查了一下,python的spacy库提供依存句法分析方面的模块。

1.2.1,spacy库简介

spaCy是自然语言处理(NLP)任务的一个库。在众多的NLP库中,spaCy独树一帜。spaCy库具有强大的功能,同时它提供一系列优良的特性,库非常易用,以及库总是保持最新。

下面是来自spaCy官网的软件架构图:

1.3,安装第三方库

运行本Notebook,需安装spacy库及中英文的算法包,如果没有安装的需要打开一个COMMAND窗口进行安装(注:内地环境安装可能会比较耗时):

$ pip install spacy -i https://pypi.tuna.tsinghua.edu.cn/simple/

$ conda install -c conda-forge spacy-model-en_core_web_sm

$ pip install https://github.com/explosion/spacy-models/releases/download/zh_core_web_sm-3.1.0/zh_core_web_sm-3.1.0.tar.gz

1.4,本notebook所做的测试

基于测试数据,在Jupyter Notebook中使用Python做依存句法分析方面的实验。

代码参考文献:

1. spaCy官网

2. spaCy 第三篇:依存分析

3. Spacy的依存分析

2,引入spacy库

spaCy模块有几个非常重要的类:

Doc:Doc对象由Tokenizer构造,然后由管道的组件进行适当的修改。doc对象是token的序列

Span:Span对象是Doc对象的一个切片。

Token:在自然语言处理中,把一个单词,一个标点符号,一个空格等叫做一个token。

Vocab:存储词汇表和语言共享的数据。词汇表使用Lexeme对象和StringStore对象来表示。

Lexeme对象是词汇表Vocab中的一个词条(entry),可以通过similarity()函数计算两个词条的相似性;

StringStore类是一个string-to-int的对象,通过64位的哈希值来查找词汇,或者把词汇映射到64位的哈希值

当你在一个文本上调用nlp时,spaCy首先将文本分词,生成一个Doc对象。然后,Doc会经过几个不同的步骤进行处理。Pipeline通常包括一个标记器(tagger)、一个词法器(lemmatizer)、一个解析器(parser)和一个实体识别器(entity recognizer)。每个流水线组件都会返回经过处理的Doc,然后将其传递给下一个组件。

参见Spacy的依存分析

# coding:utf-8    

import spacy

from spacy import displacy


3,定义可视化选项

定义颜色,字体等

options = {"compact": True, "bg": "#09a3d5",

           "color": "white", "font": "Source Sans Pro"}


4,实验一:针对英文文本做依存句法测试

载入英文处理算法包

nlp1 = spacy.load('en_core_web_sm')


4.1,生成测试doc英文数据

为简化测试,我们把一段英文字符串传给nlp生成doc

doc = nlp1( "Technology bears fruit for nation's farmers" )


4.2,输出依存句法关系

for token in doc:

    print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))

输出结果如下:

Technology(NN) <-- nsubj -- bears(VBZ)

bears(VBZ) <-- ROOT -- bears(VBZ)

fruit(NN) <-- dobj -- bears(VBZ)

for(IN) <-- prep -- fruit(NN)

nation(NN) <-- poss -- farmers(NNS)

's(POS) <-- case -- nation(NN)

farmers(NNS) <-- pobj -- for(IN)

4.3,显示依存句法关系图

displacy.render(doc,options=options, style="dep", jupyter=True)

5,实验二:针对中文文本句子做依存句法测试

载入中文处理算法包

nlp2 = spacy.load('zh_core_web_sm')


5.1,生成测试doc中文文数据

为简化测试,我们把一段中文字符串传给nlp生成doc

doc2 = nlp2( "小猴子吃了5条香蕉" )


5.2,输出依存句法关系

for token in doc2:

    print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))


输出结果如下:

小(JJ) <-- amod -- 猴子(NN)

猴子(NN) <-- nsubj -- 吃(VV)

吃(VV) <-- ROOT -- 吃(VV)

了(AS) <-- aux:asp -- 吃(VV)

5(CD) <-- nummod -- 香蕉(NN)

条(M) <-- mark:clf -- 5(CD)

香蕉(NN) <-- dobj -- 吃(VV)

5.3,显示依存句法关系图

displacy.render(doc2,options=options, style="dep", jupyter=True)

6,实验三:针对中文文本段落做依存句法测试

doc3 = nlp2("苹果宣布将设立一项基金帮助美国小型开发者。所谓“小型开发者”资质要求是开发者须在2015年6月4日到2021年4月26日之间,在自然年内,美国商店发布的所有App全部收入累计不超过1百万美元。苹果称, 这包含99%的美国开发者,未来将披露关于此基金的细节信息。(该条款只针对美国地区)")


6.1,显示段落中已识别的句子

也就是说spaCy可以切分句子,然后针对每个句子分析句法。

sentence_spans = list(doc3.sents)

for sentence in sentence_spans:

    print(sentence)

输出结果如下:

苹果宣布将设立一项基金帮助美国小型开发者。

所谓“小型开发者”资质要求是开发者须在2015年6月4日到2021年4月26日之间,在自然年内,美国商店发布的所有App全部收入累计不超过1百万美元。

苹果称, 这包含99%的美国开发者,未来将披露关于此基金的细节信息。

(该条款只针对美国地区)


6.2,显示中文段落的词之间的依存关系

for token in doc3:

    print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))


输出结果如下:

苹果(NN) <-- nsubj -- 宣布(VV)

宣布(VV) <-- ROOT -- 宣布(VV)

将(AD) <-- advmod -- 设立(VV)

设立(VV) <-- ccomp -- 宣布(VV)

一(CD) <-- nummod -- 基金(NN)

项(M) <-- mark:clf -- 一(CD)

基金(NN) <-- dobj -- 设立(VV)

帮助(VV) <-- conj -- 设立(VV)

美国(NR) <-- nmod -- 开发者(NN)

小型(JJ) <-- amod -- 开发者(NN)

开发者(NN) <-- dobj -- 帮助(VV)

。(PU) <-- punct -- 宣布(VV)

所谓(JJ) <-- amod -- 开发者(NN)

“(PU) <-- punct -- 开发者(NN)

小型(JJ) <-- amod -- 开发者(NN)

开发者(NN) <-- compound:nn -- 要求(NN)

”(PU) <-- punct -- 开发者(NN)

资质(NN) <-- compound:nn -- 要求(NN)

要求(NN) <-- nsubj -- 超过(VV)

是(VC) <-- cop -- 超过(VV)

开发者(NN) <-- nsubj -- 超过(VV)

须(VV) <-- xcomp -- 超过(VV)

在(P) <-- case -- 26日(NT)

2015年(NT) <-- compound:nn -- 26日(NT)

6月(NT) <-- conj -- 26日(NT)

4日(NT) <-- dep -- 6月(NT)

到(CC) <-- cc -- 26日(NT)

2021年(NT) <-- compound:nn -- 26日(NT)

4月(NT) <-- compound:nn -- 26日(NT)

26日(NT) <-- nmod:prep -- 超过(VV)

之间(LC) <-- case -- 26日(NT)

,(PU) <-- punct -- 超过(VV)

在(P) <-- case -- 自然(NN)

自然(NN) <-- nmod:prep -- 超过(VV)

年内(LC) <-- case -- 自然(NN)

,(PU) <-- punct -- 超过(VV)

美国(NR) <-- nmod:assmod -- 商店(NN)

商店(NN) <-- nsubj -- 发布(VV)

发布(VV) <-- acl -- 收入(NN)

的(DEC) <-- mark -- 发布(VV)

所有(DT) <-- det -- 收入(NN)

App全部(NR) <-- compound:nn -- 收入(NN)

收入(NN) <-- nsubj -- 超过(VV)

累计(AD) <-- advmod -- 超过(VV)

不(AD) <-- neg -- 超过(VV)

超过(VV) <-- ROOT -- 超过(VV)

1百万(CD) <-- nmod:range -- 超过(VV)

美元(M) <-- mark:clf -- 1百万(CD)

。(PU) <-- punct -- 超过(VV)

苹果(NN) <-- nsubj -- 称(VV)

称(VV) <-- ROOT -- 称(VV)

,(PU) <-- punct -- 称(VV)

这(PN) <-- nsubj -- 包含(VV)

包含(VV) <-- ccomp -- 称(VV)

99%(NN) <-- nmod:assmod -- 开发者(NN)

的(DEC) <-- case -- 99%(NN)

美国(NR) <-- nmod:assmod -- 开发者(NN)

开发者(NN) <-- dobj -- 包含(VV)

,(PU) <-- punct -- 包含(VV)

未来(NT) <-- nmod:tmod -- 披露(VV)

将(AD) <-- advmod -- 披露(VV)

披露(VV) <-- conj -- 包含(VV)

关于(P) <-- case -- 基金(NN)

此(DT) <-- det -- 基金(NN)

基金(NN) <-- nmod -- 信息(NN)

的(DEG) <-- case -- 基金(NN)

细节(NN) <-- compound:nn -- 信息(NN)

信息(NN) <-- dobj -- 披露(VV)

。(PU) <-- punct -- 称(VV)

((PU) <-- punct -- 针对(P)

该(DT) <-- det -- 条款(NN)

条款(NN) <-- nsubj -- 针对(P)

只(AD) <-- advmod -- 针对(P)

针对(P) <-- ROOT -- 针对(P)

美国(NR) <-- nmod:assmod -- 地区(NN)

地区(NN) <-- dobj -- 针对(P)

)(PU) <-- punct -- 针对(P)


6.3,显示中文段落中的每个句子的依存关系图

for i in range(len(sentence_spans)):

    print("\n",sentence_spans[i])

    displacy.render(sentence_spans[i],options=options, style="dep", jupyter=True)


输出结果是:

 苹果宣布将设立一项基金帮助美国小型开发者。

 所谓“小型开发者”资质要求是开发者须在2015年6月4日到2021年4月26日之间,在自然年内,美国商店发布的所有App全部收入累计不超过1百万美元。

 苹果称, 这包含99%的美国开发者,未来将披露关于此基金的细节信息。

 (该条款只针对美国地区)


7,下载本Jupyter Notebook

下载notebook源代码请进:可视化中英文依存句法分析结果


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2024-12-19 00:48