Заменить сущность с ее меткой в ​​SpaCy - PullRequest
0 голосов
/ 05 ноября 2019

Есть ли у SpaCy какой-либо способ заменить объект, обнаруженный SpaCy NER, своим ярлыком? Например: Я ем яблоко во время игры на своем Apple Macbook.

Я обучил модель NER с помощью SpaCy для обнаружения объекта «ФРУКТЫ», и модель успешно обнаружила первое «яблоко»в качестве «ФРУКТОВ», но не второго «Яблока».

Я хочу выполнить постобработку своих данных, заменив каждую сущность ее меткой, поэтому я хочу заменить первое «яблоко» на «ФРУКТЫ»». Предложение будет звучать так: « Я ем фрукты во время игры на своем Apple Macbook. »

Если я просто использую регулярное выражение, оно также заменит второе «Яблоко» на «Фрукты». , что неверно. Есть какой-нибудь умный способ сделать это?

Спасибо!

1 Ответ

1 голос
/ 05 ноября 2019

метка сущности является атрибутом токена (см. здесь )

import spacy
from spacy import displacy
nlp = spacy.load('en_core_web_lg')

s = "His friend Nicolas is here."
doc = nlp(s)

print([t.text if not t.ent_type_ else t.ent_type_ for t in doc])
# ['His', 'friend', 'PERSON', 'is', 'here', '.']

print(" ".join([t.text if not t.ent_type_ else t.ent_type_ for t in doc]) )
# His friend PERSON is here .

Редактировать:

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

s = "His friend Nicolas J. Smith is here with Bart Simpon and Fred."
doc = nlp(s)
newString = s
for e in reversed(doc.ents): #reversed to not modify the offsets of other entities when substituting
    start = e.start_char
    end = start + len(e.text)
    newString = newString[:start] + e.label_ + newString[end:]
print(newString)
#His friend PERSON is here with PERSON and PERSON.
...