Визуализация настраиваемых тегов NER с пространственным отображением

#python #spacy #named-entity-recognition #spacy-3

Вопрос:

Я новичок в spaCy и Python и хочу визуализировать NER с помощью этой библиотеки. Это примерный пример, который я нашел:

 import spacy
from spacy import displacy

NER = spacy.load("en_core_web_sm")

raw_text="The Indian Space Research Organisation or is the national space agency of India, headquartered in Bengaluru. It operates under Department of Space which is directly overseen by the Prime Minister of India while Chairman of ISRO acts as executive of DOS as well."

text1= NER(raw_text)

displacy.render(text1,style="ent",jupyter=True)
 

Пример визуализации

Тем не менее, у меня уже есть список настраиваемых тегов и их позиций:

  [812, 834, "POS"], [838, 853, "ORG"], [870, 888, "POS"], [892, 920, "ORG"], [925, 929, "ENGLEVEL"], [987, 1002, "SKILL"],...
 

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

Ответ №1:

Вам нужно будет добавить промежутки символов, обозначающие сущности, и прикрепить их к вашему объекту doc. Что-то вроде этого:

 import spacy
from spacy import displacy

nlp = spacy.blank('en')
raw_text = "The Indian Space Research Organisation or is the national space agency of India, headquartered in Bengaluru. It operates under Department of Space which is directly overseen by the Prime Minister of India while Chairman of ISRO acts as executive of DOS as well."
doc = nlp.make_doc(raw_text)
spans = [[812, 834, "POS"], [838, 853, "ORG"], [870, 888, "POS"], [892, 920, "ORG"], [925, 929, "ENGLEVEL"],
         [987, 1002, "SKILL"]]
ents = []
for span_start, span_end, label in spans:
    ent = doc.char_span(span_start, span_end, label=label)
    if ent is None:
        continue

    ents.append(ent)

doc.ents = ents
displacy.render(doc, style="ent", jupyter=True)
 

Измените свое raw_text и spans соответственно. Если вы даете промежуток, который начинается или заканчивается за пределами длины вашего текста doc.char_span() , возвращается None , поэтому вам нужно обработать это соответствующим образом.