给出一个具有多个令牌的命名实体的一部分的令牌,是否有直接方法来获取该实体的跨度?
例如,考虑这个句子,其中有两个名为实体的单词:
>>> doc = nlp("This year was amazing.")
>>> doc.ents
(This year,)
>>> doc[0].ent_type_
'DATE'
>>> doc[1].ent_type_
'DATE'
比方说,我们考虑第一个标记(“ This”),是否有可能检索其一部分的实体?也许是这样的:
>>> doc[0].ents_
(This year,)
我猜有时候令牌可能是多个实体的一部分。
目前,我是通过创建从索引到实体索引的反向字典来实现这一点的。
谢谢!
答案 0 :(得分:2)
您可以遍历doc.ents
,然后将它们合并为一个令牌,因为命名实体是Span
对象。
spaCy还附带了一个方便的组件,您可以将其插入管道中以自动进行此操作:
from spacy.pipeline import merge_entities
nlp = spacy.load("en_core_web_sm") # or any other model
nlp.add_pipe(merge_entities)
print([token.text for token in nlp("John Murphy lives in New York City")])
# ['John Murphy', 'lives', 'in', 'New York City']
答案 1 :(得分:0)
我想这就是你想要的:
def get_ent_from_token(token):
return [ent for ent in doc.ents
if ent.start_char <= token.idx <= ent.end_char][0]
P.S。我希望spaCy库向前发展,将包括更多此类基本实用程序,用于在跨度,令牌,实体,字符偏移量,令牌偏移量等之间来回转换。我倾向于在这种事情上浪费大量时间。 / p>