从spaCy中的其中一个令牌中检索实体的跨度

时间:2019-04-20 04:51:42

标签: spacy named-entity-recognition

给出一个具有多个令牌的命名实体的一部分的令牌,是否有直接方法来获取该实体的跨度?

例如,考虑这个句子,其中有两个名为实体的单词:

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

我猜有时候令牌可能是多个实体的一部分。

目前,我是通过创建从索引到实体索引的反向字典来实现这一点的。

谢谢!

2 个答案:

答案 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>