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

39 投票
7 回答
52479 浏览
提问于 2025-04-17 02:26

在阅读《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)

7 个回答

7

如果你想要更好的性能,那么spacy(https://spacy.io/)是最好的选择。使用起来非常简单:

import spacy

nlp = spacy.load('en')
sents = nlp(u'A woman is walking through the door.')

你会得到一个依赖树作为输出,这样你就可以很轻松地找到你需要的所有信息。你还可以定义自己的自定义处理流程。想了解更多,可以去他们的网站看看。

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

8

我觉得你可以用基于语料库的依赖解析器,代替NLTK提供的基于语法的解析器。

在Python中,即使是处理少量文本,使用基于语料库的依赖解析也不是很理想。所以在NLTK里,他们提供了一个封装器,可以使用MaltParser,这是一种基于语料库的依赖解析器。

你可能会觉得这个关于句子的RDF表示的问题也很相关。

80

我们可以使用NLTK中的斯坦福解析器。

需要准备的东西

你需要从他们的网站上下载两个东西:

  1. 斯坦福CoreNLP解析器
  2. 你想要的语言模型(比如说英语语言模型

注意事项!

确保你的语言模型版本和斯坦福CoreNLP解析器版本是匹配的!

截至2018年5月22日,当前的CoreNLP版本是3.9.1。

下载完这两个文件后,可以把压缩包解压到你喜欢的任何地方。

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())

输出结果

最后一行的输出是:

[((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$'))]

我想这就是你想要的。

撰写回答