如何在NLTK中进行依赖解析?

MrD*_*MrD 33 python grammar nlp nltk

通过NLTK书,不清楚如何从给定的句子生成依赖树.

本书的相关部分:依赖语法的子章节给出了一个示例图,但它没有说明如何解析句子来提出这些关系 - 或者我可能缺少NLP中的一些基本内容?

编辑: 我想要类似于斯坦福解析器所做的事情:给出一句"我在睡梦中拍摄大象",它应该返回如下内容:

nsubj(shot-2, I-1)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)
Run Code Online (Sandbox Code Playgroud)

ywa*_*wat 78

我们可以使用NLTK的Stanford Parser.

要求

您需要从他们的网站下载两件事:

  1. 斯坦福CoreNLP解析器.
  2. 语言模型为您所需的语言(如英语语言模型)

警告!

确保您的语言模型版本与您的Stanford CoreNLP解析器版本匹配!

截至2018年5月22日的当前CoreNLP版本为3.9.1.

下载这两个文件后,在任意位置解压缩zip文件.

Python代码

接下来,加载模型并通过NLTK使用它

from nltk.parse.stanford import StanfordDependencyParser

path_to_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_to_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'

dependency_parser = StanfordDependencyParser(path_to_jar=path_to_jar, path_to_models_jar=path_to_models_jar)

result = dependency_parser.raw_parse('I shot an elephant in my sleep')
dep = result.next()

list(dep.triples())
Run Code Online (Sandbox Code Playgroud)

产量

最后一行的输出是:

[((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
 ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
 ((u'elephant', u'NN'), u'det', (u'an', u'DT')),
 ((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
 ((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
 ((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))]
Run Code Online (Sandbox Code Playgroud)

我想这就是你想要的.

  • 如果您使用的是Python 3,请使用result .__ next __()而不是result.next() (6认同)

小智 7

我认为你可以使用基于语料库的依赖解析器而不是NLTK提供的基于语法的依赖解析器.

在Python中对甚至少量文本进行基于语料库的依赖性解析在性能方面并不理想.因此,在NLTK中,他们确实为MaltParser提供了一个包装器,MaltParser是一个基于语料库的依赖解析器.

您可能会发现有关RDF表示相关句子的其他问题.


Ale*_*vic 7

如果您需要更好的性能,那么spacy(https://spacy.io/)是最佳选择.用法很简单:

import spacy

nlp = spacy.load('en')
sents = nlp(u'A woman is walking through the door.')
Run Code Online (Sandbox Code Playgroud)

您将获得一个依赖树作为输出,您可以非常轻松地挖掘出您需要的每个信息.您还可以定义自己的自定义管道.在他们的网站上查看更多

https://spacy.io/docs/usage/

  • @Aleksander Jovanovic,我简单地试了一下,准确性很糟糕. (2认同)