为什么没有spacy给任何孩子到根节点?

时间:2018-02-25 03:49:47

标签: python nlp spacy

这是我的代码:

from spacy.lang.en import English

nlp = English()
nlp.add_pipe(nlp.create_pipe('sentencizer'))
doc = nlp("The quick brown fox jumps over the lazy dog.")
for sent in doc.sents:
    print(list(sent.root.children))

我希望sent.root.children包含指向其他字词/句子片段的链接,例如lazybrown,但它是一个空数组。为什么会这样?

1 个答案:

答案 0 :(得分:2)

我认为这里的问题很简单:获取句子的根和它的子句需要依赖解析。这意味着您需要加载一个包含权重的模型来预测依赖关系。

在您的代码中,您只导入English语言类,该语言类仅包含特定于语言的规则和标记生成器。您可以下载这样的默认小英语模型(或任何other options):

python -m spacy download en

然后,您可以使用spacy.load()加载模型。在引擎盖下,这告诉spaCy找到安装为'en'的模型,检查其元数据以初始化相应的语言类(English),构建处理管道(解析器,标记器,NER),以及使权重可用以使spaCy能够进行预测。由于默认句子边界检测器使用依赖关系解析,因此它将被包含在内 - 因此无需手动将其添加到管道中。

刚刚测试了你的例子,它现在打印了一个根的孩子列表:

nlp = spacy.load('en')
doc = nlp("The quick brown fox jumps over the lazy dog.")
for sent in doc.sents:
    print(list(sent.root.children))
# [fox, over, .]