Изменить одну сущность в Spacy - PullRequest
0 голосов
/ 25 февраля 2019

Можно ли изменить одну единственную сущность в Spacy?У меня есть несколько объектов документов в списке, а некоторые документы содержат метку «FRAUD».Однако мне нужно изменить несколько ярлыков сущностей «FRAUD» на «FALSE_ALARM».Я использую совпадение Spacy, чтобы найти сущности "FALSE_ALARM", но я не могу переопределить существующий ярлык.Я пробовал следующее:

def add_event_ent(matcher, doc, i, matches):
    match_id, start, end = matches[i]
    match_doc = doc[start:end]
    for entity in match_doc.ents:
        # k.label = neg_hash <-- says "  attribute 'label' of 'spacy.tokens.span.Span' objects is not writable"

        span = Span(doc, entity.start, entity.end, label=false_alarm_hash)
        doc.ents = list(doc.ents) + [span]  # add span to doc.ents


    ValueError: [E098] Trying to set conflicting doc.ents: '(14, 16, 
    'FRAUD')' and '(14, 16, 'FALSE_ALARM')'. A token can only be part of one entity, so make sure the entities you're setting don't overlap.

1 Ответ

0 голосов
/ 26 февраля 2019

Сообщение об ошибке сообщает вам, что происходит: spacy не позволяет перекрывающимся сущностям, и вы пытаетесь добавить новую сущность в токен, не удаляя сначала исходную сущность.Вам нужно что-то похожее на:

for entity in match_doc.ents:
    span = Span(doc, entity.start, entity.end, label=false_alarm_hash)
    doc.ents = [span if e == entity else e for e in doc.ents]

Это однострочное изменение в вашем текущем коде, чтобы заставить его работать, но понимание списка действительно неэффективно.Если у вас очень мало совпадений, вы, вероятно, захотите реструктурировать процесс обработки совпадений, чтобы сделать это без многократного повторения всего списка сущностей.Возможно, имеет смысл обрабатывать все совпадения в виде списка (matches = matcher(doc)), а не использовать функцию обратного вызова.

...