【问题标题】:Retrieve the span of an entity from one of its tokens in spaCy从 spaCy 中的一个标记中检索实体的跨度
【发布时间】:2019-04-20 04:51:42
【问题描述】:

给定一个标记,它是具有多个标记的命名实体的一部分,是否有直接的方法来获取该实体的跨度?

例如,考虑这个带有一个两个词命名实体的句子:

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

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

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

谢谢!

【问题讨论】:

    标签: spacy named-entity-recognition


    【解决方案1】:

    您可以遍历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'] 
    

    【讨论】:

    • 谢谢!它没有为我正在寻找的东西提供解决方案,因为我仍然想保留原始令牌。尽管如此,它还是非常有用的。
    • 这太棒了!!
    【解决方案2】:

    我想这就是你想要的:

    def get_ent_from_token(token):
        return [ent for ent in doc.ents 
                if ent.start_char <= token.idx <= ent.end_char][0]
    

    附:我希望向前推进 spaCy 库将包括更多这样的基本实用程序,用于在跨度、令牌、实体、字符偏移量、令牌偏移量等之间来回转换。我倾向于浪费大量时间在这类事情上大惊小怪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多