#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 будет включать в себя больше таких базовых утилит для преобразования туда и обратно между диапазонами, токенами, сущностями, смещениями символов, смещениями токенов и т. Д. Я, как правило, трачу много времени на такие вещи.