Извлеките диапазон объекта из одного из его токенов в spaCy

#spacy #named-entity-recognition

#spacy #распознавание именованных объектов

Вопрос:

Учитывая токен, который является частью именованного объекта с несколькими токенами, существует ли прямой метод для получения диапазона этого объекта?

Например, рассмотрим это предложение с одним двухсловным именем entity:

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

Я предполагаю, что иногда токен может быть частью более чем одного объекта.

На данный момент я получаю это, создавая обратный словарь из индексов в индексы объектов.

Спасибо!

Ответ №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'] 
  

Комментарии:

1. Спасибо! Это не дает решения для того, что я искал, поскольку я все еще хочу сохранить исходные токены. Тем не менее, это очень полезно.

2. Это было потрясающе!!

Ответ №2:

Я думаю, это то, что вы хотите:

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

PS Я надеюсь, что в дальнейшем библиотека spaCy будет включать в себя больше таких базовых утилит для преобразования туда и обратно между диапазонами, токенами, сущностями, смещениями символов, смещениями токенов и т. Д. Я, как правило, трачу много времени на такие вещи.