【问题标题】:Run dependency parser on pre-initialized doc object of spacy在 spacy 的预初始化 doc 对象上运行依赖解析器
【发布时间】:2021-09-17 03:42:43
【问题描述】:

我正在尝试通过 web API 将 spacy 的依赖解析器合并到 java 中的遗留代码中。

所有其他组件标记器、标记器、merged_words、NER 都是从旧版 NLP 代码中完成的。我只对应用依赖解析器以及 spacy 3 的依赖规则匹配器感兴趣。

我尝试了以下方法

  1. 使用https://spacy.io/api/doc#init 创建一个新的文档对象。
from spacy.tokens import Doc
sent=["The heating_temperature was found to be 500 C"]
words=["The","heating_temperature", "was", "found", "to", "be", "500", "C"]
spaces=[True,True,True,True,True,True,True,False]
tags=["DT","NN","VBD","VBN","TO","VB","CD","NN"]
ents=["O","I-PARAMETER","O","O","O","O","I-VALUE","O"]
doc = Doc(nlp.vocab, words=words,spaces=spaces, tags=tags, ents=ents)
  1. 仅使用解析器创建 NLP 管道
#can use nlp.blank too
nlp2 = spacy.load("en_core_web_sm", exclude=['attribute_ruler', 'lemmatizer', 'ner', "parser","tagger"])
pipeWithParser = nlp2.add_pipe("parser", source=spacy.load("en_core_web_sm"))
processed_dep = pipeWithParser(doc) #refer similar example in https://spacy.io/api/tagger#call

但是,我得到以下依赖树

dependency tree

其中每个单词都是与第一个单词的 nmod 关系。

我错过了什么? 如果需要,我也可以使用 spacy 的标记器。我尝试使用上述类似方法包含标记器,但所有标记都标记为“NN”

【问题讨论】:

  • 如果我使用 nlp2(sentence),而不是使用 pipeWithParser(doc)。我得到了正确的输出,但我需要传入 doc 对象,这是 nlp2() 不允许的。调用的方法类似于 spacy.io/api/tagger#call 中类似示例中给出的方法,所以我认为它可以工作......

标签: nlp spacy spacy-3 dependency-parsing


【解决方案1】:

en_core_web_sm 中的parser 组件依赖于tok2vec 组件,因此在运行parser 之前,您需要在doc 上运行tok2vec,以便解析器获得正确的输入。

doc = nlp2.get_pipe("tok2vec")(doc)
doc = nlp2.get_pipe("parser")(doc)

【讨论】:

  • 感谢您的回答。但 tok2vec 已包含在管道中。
  • 但如果您在普通文档上运行 pipeWithParser(doc) 则不会。你首先需要doc = nlp2.get_pipe("tok2vec")(doc)
  • 是的,这行得通。谢谢。由于您的最新评论增加了清晰度,如果您也可以将此评论添加到您现有的答案中。我会接受的。
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多