【发布时间】:2019-06-14 14:10:00
【问题描述】:
我正在尝试在一个句子中合并名词短语块,然后获取合并文档中每个标记的 pos 标签。但是,对于每个合并的跨度,我似乎得到了跨度中第一个标记的 pos 标记(通常是 DET 或 ADJ)而不是 NOUN。
代码如下:
def noun_chunk_retokenizer(doc):
with doc.retokenize() as retokenizer:
for chunk in doc.noun_chunks:
retokenizer.merge(chunk)
return doc
nlp = spacy.load('en_core_web_sm')
nlp.add_pipe(noun_chunk_retokenizer)
query = "when is the tennis match happening?"
[(c.text,c.pos_) for c in nlp(query)]
这是我得到的结果:
[('when', 'ADV'),
('is', 'VERB'),
('the tennis match', 'DET'),
('happening', 'VERB'),
('?', 'PUNCT')]
但我希望“网球比赛”被标记为“名词”,这就是它在 displacy 演示中的工作方式:https://explosion.ai/demos/displacy?
似乎应该有一个“标准”的方式来做到这一点,但我不确定如何。
【问题讨论】:
-
尝试将
attrs={"POS": "NOUN"}添加到merge方法中:retokenizer.merge(chunk, attrs={"POS": "NOUN"}) -
我想通了,nvm。 merge_noun_chunks 已经是一个内置的管道组件,我可以直接使用它而不是编写一个函数来完成它。仍然很想知道这到底是如何工作的。
-
这里是链接,以防其他人有同样的问题:spacy.io/usage/processing-pipelines#built-in
标签: python python-3.x spacy