依存句法解析(Dependency Parsing)三种自然语言处理的不同方法|spaCy、NLTK、Stanford CoreNLP、Stanza

5,246 阅读4分钟

自然语言处理 - 依赖关系解析

使用spaCy、NLTK与Stanford CoreNLP和Stanza进行依赖关系解析的不同方法

照片:Siora PhotographyonUnsplash

什么是依赖性分析?

依赖性分析是分析一个句子的语法结构并找出相关的词以及它们之间的关系类型。

每一种关系。

  1. 有一个标题 和一个修饰标题从属关系
  2. 根据词头从属词之间的依存关系的性质进行标注。这些标签可以在Universal Dependency Relations中找到。

两个词之间的简单依赖关系

在上图中,汽车_和黑色之间存在着一种关系 和_黑色 之间存在关系,因为_黑色_ 修改了_汽车_的含义。在这里,汽车 作为 ,而_黑_是头的附属物 。这里的关系的性质是amod ,代表 "形容词修饰"。它是一个形容词或形容词短语,修饰一个名词。

实施

在 Python 中有不同的方法来实现依赖关系的解析。在这篇文章中,我们将看看三种方法。

方法1:使用spaCy

spaCy是一个用于自然语言处理的开源Python库。

要开始使用,首先安装spaCy并加载所需的语言模型。

pip install -U pip setuptools wheel

en_core_web_sm 是spaCy中最小的英语模型,大小为12MB。请参考spaCy英语模型,查看其他可用的模型。

medium.com/media/7eea4…

使用spaCy进行依赖性分析

spaCy还提供了一个名为displaCy 的内置依赖性可视化工具,你可以用它来生成句子的依赖性图。

displacy.render()函数将为该句子生成可视化效果。

**注意:**如果你在Jupyter Notebook或Google Colab中运行代码,在render()函数中使用jupyter = True。

依赖关系可视化的输出

方法2:将NLTK与斯坦福大学CoreNLP一起使用

CoreNLP是由斯坦福大学NLP小组创建的,提供了Java中的NLP工具。这个Java库可以和NLTK一起使用,在Python中解析依赖关系。

第一步是在CoreNLP网站上下载Stanford CoreNLP zip文件和Stanford CoreNLP模型jar文件。

运行这三个命令将下载所需的库并解压缩压缩文件。

wget 

一旦这些库被下载,我们就可以从NLTK导入StanfordDependencyParser。

from nltk.parse.stanford import StanfordDependencyParser

medium.com/media/b0a69…

使用NLTK和斯坦福CoreNLP进行依赖关系解析

为了将CoreNLP生成的依赖关系可视化,我们可以使用dependency.nx_graph()函数提取一个有标签和有方向的NetworkX Graph对象,或者使用dependency.to_dot()函数生成一个图形描述语言中的DOT定义。DOT定义可以用GraphViz可视化为一个图。

使用NetworkX进行可视化

# importing networkx
# Using reverse() to reverse the direction of edges as nx_graph() returns inverted edges
# nx_graph() returns numeric node labels starting from 1
nx.draw(G, with_labels=True, labels=labels, node_size=2500, node_color='#B5EAD7', font_size=10)

从NetworkX对象创建的依赖图

使用DOT定义进行可视化

!pip install graphviz
from graphviz import Source
'''

从DOT定义中创建的依赖关系图

方法3:使用Stanza

斯坦福大学NLP小组也开发了Stanza。它提供了一个可以定制的神经网络NLP管道,以及Stanford CoreNLP软件包的Python封装器,使得使用CoreNLP的功能更容易,而不需要下载jar文件。

要开始使用,请安装Stanza

pip install stanza

下一步是导入Stanza并下载所需的语言模型。你可以在这里查看所有可用的模型。

import stanza

使用stanza.Pipeline()函数初始化神经管道。第一个参数是要使用的语言。可以传递一个可选的参数processors,它可以是一个字典或一个逗号分隔的字符串,以配置管道中使用的处理器。

nlp = stanza.Pipeline('en',

你可以在Pipeline和Processors上找到所有处理器的列表。一些处理器可能需要在流水线中的其他处理器之前,否则它们将无法工作。例如,pos处理器需要tokenize和mwt处理器,所以如果我们想使用pos处理器,也需要在管道中使用这两个处理器。

现在我们将通过管道传递我们的句子,并将所有的结果存储在doc变量中。

doc = nlp(sentence)

如果我们打印doc.sentences,我们将看到每个通过管道的句子都有一个列表。每个列表都包含所有标记信息和语言学特征的结果。

例如,列表中的每一项都是一个对象,其属性表示_词组_、通用语料部分树状数据库特定语料部分形态特征头部索引、_在句子中的位置_等。

{

对于doc对象中的所有句子,我们可以调用print_dependencies()函数。这个函数将打印有三个值的图元--标记、头部的索引和关系性质。

**注意:**在我们的案例中,由于我们只有一个句子,我们直接使用doc.sentences[0]来访问它。

medium.com/media/d007c…

print_dependencies()函数的输出结果

使用Stanza进行依赖关系解析

在这篇文章中,我们看到了三种在Python中实现文本依赖关系解析的方法。谢谢你的阅读!:)

参考资料

  1. spaCy依赖性分析器- https://spacy.io/usage/linguistic-features#dependency-parse
  2. Stanford CoreNLP- https://stanfordnlp.github.io/CoreNLP/index.html
  3. Stanza依赖性分析器- https://stanfordnlp.github.io/stanza/depparse.html