Как преобразовать комбинированные пространственные теги в формат BIO?

Как я могу преобразовать это в формат BIO? Я пробовал использовать spacy biluo_tags_from_offsets, но не смог уловить все сущности, и я думаю, что знаю причину.

tags = biluo_tags_from_offsets(doc, annot['entities'])

Бакалавр наук (бакалавр наук) - эти два элемента объединены вместе, но при наличии пробела текст разбивается на части. Итак, теперь слова будут похожи на (BSc(Bachelor, of, science), и поэтому spacy biluo_tags_from_offsets терпит неудачу и возвращает -

Теперь, когда он проверяет (80, 83, 'Degree'), он не может найти только слово BSc. Точно так же он снова потерпит неудачу для (84, 103, 'Degree').

Как я могу исправить эти сценарии? Пожалуйста, помогите, если кто-нибудь сможет.


EDUCATION: · Master of Computer Applications (MCA) from NV, *********, *****. · BSc(Bachelor of science) from NV, *********, *****

{'entities': [(13, 44, 'Degree'), (46, 49, 'Degree'), (80, 83, 'Degree'), (84, 103, 'Degree')]}

person user_12    schedule 23.09.2020    source источник
comment
Можете ли вы попробовать объединить токены с Doc.retokenize(), как в stackoverflow.com/a/63982729/4317058? Интересно посмотреть, будет ли предварительно обученная модель распознавать новые комбинированные токены.   -  person Sergey Bushmanov    schedule 23.09.2020
comment
@SergeyBushmanov Не могли бы вы предоставить рабочий пример, я не смог правильно понять его по той ссылке, что именно делает этот ретокенизатор ()   -  person user_12    schedule 23.09.2020
comment
@SergeyBushmanov Я читал онлайн, что spacy не поддерживает перекрывающиеся объекты? Могу ли я как-нибудь решить эти проблемы? Мне не удалось найти хороших статей с рабочим примером того, как решить эту проблему? Если вы знакомы, пожалуйста, помогите мне.   -  person user_12    schedule 23.09.2020
comment
Вы также можете проверить это spacy.io/api/pipeline-functions#merge_entities   -  person Sergey Bushmanov    schedule 23.09.2020
comment
@SergeyBushmanov Я прочитал это во время исследования. Но в моем случае перекрывающиеся объекты - это две разные метки. Как объединить две сущности в одно слово? Я не могу понять, как это исправить. Если вы знакомы с рабочим процессом, пожалуйста, помогите мне. Я застрял в этом на несколько недель. В моем наборе данных есть две проблемы: одна - я перечислен выше, другая - перекрывающиеся объекты.   -  person user_12    schedule 23.09.2020
comment
Подумайте о представлении минимального воспроизводимого примера с входными данными и желаемым выходом.   -  person Sergey Bushmanov    schedule 23.09.2020


Ответы (1)


Как правило, вы передаете свои данные в biluo_tags_from_offsets(doc, entities), где entities похожи на [(14, 44, 'ORG'), (51, 54, 'ORG')]. Вы можете редактировать этот параметр по своему усмотрению (вы можете начать с редактирования doc.ents и продолжить оттуда). Вы можете добавлять, удалять, комбинировать любые объекты в этом списке, как в примере ниже:

import spacy
from spacy.gold import biluo_tags_from_offsets
nlp = spacy.load("en_core_web_md")

text = "I have a BSc (Bachelors of Computer Sciences) from NYU"
doc = nlp(text)
print("Entities before adding new entity:", doc.ents)

entities = []
for ent in doc.ents:
    entities.append((ent.start_char, ent.end_char, ent.label_))
print("BILUO before adding new entity:", biluo_tags_from_offsets(doc, entities))

entities.append((9,12,'ORG')) # add a desired entity

print("BILUO after adding new entity:", biluo_tags_from_offsets(doc, entities))

Entities before adding new entity: (Bachelors of Computer Sciences, NYU)
BILUO before adding new entity: ['O', 'O', 'O', 'O', 'O', 'B-ORG', 'I-ORG', 'I-ORG', 'L-ORG', 'O', 'O', 'U-ORG']
BILUO after adding new entity: ['O', 'O', 'O', 'U-ORG', 'O', 'B-ORG', 'I-ORG', 'I-ORG', 'L-ORG', 'O', 'O', 'U-ORG']

Если вы хотите, чтобы процесс слияния объектов был основан на правилах, вы можете попробовать entityruler со следующим упрощенным примером (взято из ссылки выше):

from spacy.lang.en import English
from spacy.pipeline import EntityRuler

nlp = English()
ruler = EntityRuler(nlp)
patterns = [{"label": "ORG", "pattern": "Apple"},
            {"label": "GPE", "pattern": [{"LOWER": "san"}, {"LOWER": "francisco"}]}]
ruler.add_patterns(patterns)
nlp.add_pipe(ruler)

doc = nlp("Apple is opening its first big office in San Francisco.")
print([(ent.text, ent.label_) for ent in doc.ents])

а затем снова передать список переопределенных (объединенных в вашем случае) сущностей в biluo_tags_from_offsets, как в первом фрагменте кода

person Sergey Bushmanov    schedule 23.09.2020
comment
@ user_12 Это ответ на ваш вопрос? Было ли это полезно? Пожалуйста, обратите внимание на stackoverflow.com/help/someone-answers - person Sergey Bushmanov; 06.01.2021