xxxxxxxxxx
## 本Notebook背景介绍
此前介绍了一篇论文范例《[基于依存句法分析的科技政策领域主题词表无监督构建](https://www.gooseeker.com/doc/article-644-1.html)》,该研究作者为了解决科技政策领域词表构建的问题,提出了一种基于依存句法分析的科技政策文本关键词抽取算法。在此基础上,提出文本主题词指数来构建文本主题词,利用同义词识别算法及百科知识发现和确定词与词的同义关系,采用字面匹配的方法判别上下位词,最终汇合四个部分形成科技政策领域主题词表。。
什么是依存句法分析? 能不能在python中做依存句法分析方面的实验呢?
本Notebook将回答这2个问题。
### 什么是依存句法分析?
笔者简单整理了句法分析的脑图:

依存文法存在一个共同的基本假设:文法结构本质上包含词和词之间的依存(修饰)关系。一个依存关系连接两个词,分别是核心词( head)和依存词( dependent)。依存关系可以细分为不同的类型,表示两个词之间的具体句法关系。
依存关系是一个核心词与它的依赖之间的二元对称关系。一个句子的核心词通常是动词,所有其他词要么依赖于核心词,要么依赖路径与它联通。
依存关系表示是一个加标签的有向图,其中节点是词汇项,加标签的弧表示依赖关系, 从中心词到依赖。
在20世纪70年代,Robinson提出依存语法中关于依存关系的四条公理:
1. 一个句子中只有一个成分是独立的;
2. 其它成分直接依存于某一成分;
3. 任何一个成分都不能依存与两个或两个以上的成分;
4. 如果A成分直接依存于B成分,而C成分在句中位于A和B之间,那么C或者直接依存于B,或者直接依存于A和B之间的某一成分;
下面是中文句子依存关系示意图:

#### 依存关系
依存结构是加标签的有向图,箭头从中心词指向从属,具体来说,箭头是从head指向child,从该解析树可以看出,每个Token只有一个Head。
#### 关系标签
标签表示从属的语法功能,名词性的标签是:
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自然语言处理学习笔记(八)—— 句法分析](https://www.jianshu.com/p/2a07c77b460a)
2. [spaCy 第三篇:依存分析](https://www.cnblogs.com/ljhdo/p/5076717.html)
3. [成分句法分析 & 依存句法分析 Parsing 知识图谱](https://blog.csdn.net/APTX___Yellow/article/details/107889941)
### 能不能在python中做依存句法分析方面的实验呢?
笔者查了一下,python的spacy库提供依存句法分析方面的模块。
spacy库简介:
spaCy是自然语言处理(NLP)任务的一个库。在众多的NLP库中,spaCy独树一帜。spaCy库具有强大的功能,同时它提供一系列优良的特性,库非常易用,以及库总是保持最新。
下面是来自[spaCy官网](https://spacy.io/api)的软件架构图:

### 第三方库
运行本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
### 本notebook所做的测试
基于测试数据,在Jupyter Notebook中使用Python做依存句法分析方面的实验。
代码参考文献:
1. [spaCy官网](https://spacy.io/api)
2. [spaCy 第三篇:依存分析](https://www.cnblogs.com/ljhdo/p/5076717.html)
3. [Spacy的依存分析](https://blog.csdn.net/sinat_36226553/article/details/115165857)
此前介绍了一篇论文范例《基于依存句法分析的科技政策领域主题词表无监督构建》,该研究作者为了解决科技政策领域词表构建的问题,提出了一种基于依存句法分析的科技政策文本关键词抽取算法。在此基础上,提出文本主题词指数来构建文本主题词,利用同义词识别算法及百科知识发现和确定词与词的同义关系,采用字面匹配的方法判别上下位词,最终汇合四个部分形成科技政策领域主题词表。。
什么是依存句法分析? 能不能在python中做依存句法分析方面的实验呢? 本Notebook将回答这2个问题。
笔者简单整理了句法分析的脑图:
依存文法存在一个共同的基本假设:文法结构本质上包含词和词之间的依存(修饰)关系。一个依存关系连接两个词,分别是核心词( head)和依存词( dependent)。依存关系可以细分为不同的类型,表示两个词之间的具体句法关系。
依存关系是一个核心词与它的依赖之间的二元对称关系。一个句子的核心词通常是动词,所有其他词要么依赖于核心词,要么依赖路径与它联通。
依存关系表示是一个加标签的有向图,其中节点是词汇项,加标签的弧表示依赖关系, 从中心词到依赖。
在20世纪70年代,Robinson提出依存语法中关于依存关系的四条公理:
下面是中文句子依存关系示意图:
依存结构是加标签的有向图,箭头从中心词指向从属,具体来说,箭头是从head指向child,从该解析树可以看出,每个Token只有一个Head。
标签表示从属的语法功能,名词性的标签是:
其他常用的标签:
上面解释的参考文献:
笔者查了一下,python的spacy库提供依存句法分析方面的模块。
spacy库简介:
spaCy是自然语言处理(NLP)任务的一个库。在众多的NLP库中,spaCy独树一帜。spaCy库具有强大的功能,同时它提供一系列优良的特性,库非常易用,以及库总是保持最新。
下面是来自spaCy官网的软件架构图:
运行本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
基于测试数据,在Jupyter Notebook中使用Python做依存句法分析方面的实验。
代码参考文献:
xxxxxxxxxx
## 引入spacy库
spaCy模块有4个非常重要的类:
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的依存分析](https://blog.csdn.net/sinat_36226553/article/details/115165857)
spaCy模块有4个非常重要的类:
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,然后将其传递给下一个组件。
# coding:utf-8
import spacy
from spacy import displacy
help(displacy.render)
nlp1 = spacy.load('en_core_web_sm')
doc = nlp1( "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_))
nlp2 = spacy.load('zh_core_web_sm')
doc = nlp2( "小猴子吃了5条香蕉" )
for token in doc:
print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
x
import spacy
from spacy import displacy
options = {"colors": {"ORG": "yellow"},"compact":True,"bg":"red","compact":True}
displacy.render(doc, style="ent", options=options,jupyter=True)
x
options = {"compact": True, "bg": "#09a3d5",
"color": "yellow", "font": "Source Sans Pro"}
displacy.render(doc, style="dep", options=options,jupyter=True)
doc3 = nlp2("苹果宣布将设立一项基金帮助美国小型开发者。所谓“小型开发者”资质要求是开发者须在2015年6月4日到2021年4月26日之间,在自然年内,美国商店发布的所有App全部收入累计不超过1百万美元,苹果称, 这包含99%的美国开发者,未来将披露关于此基金的细节信息。(该条款只针对美国地区)")
for token in doc3:
print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
for token in doc3:
print('{0}'.format(token.text))
sentence_spans = list(doc3.sents)
displacy.render(sentence_spans, options=options,style="dep",jupyter=True)
svg = displacy.render(doc3, style="dep")
output_path = Path("/images/sentence.svg")
output_path.open("w", encoding="utf-8").write(svg)