Добавление новых объектов в документы в Spacy3 завершается ошибкой

#nlp #spacy #spacy-3

Вопрос:

Я добавляю пользовательский компонент в nlp конвейер в Spacy. Ниже приведены шаги, которым я следую.

  1. создайте сопоставитель для выбора названий автомобилей
  2. определите пользовательский компонент, который использует этот сопоставитель и добавляет совпадения к существующим doc.ents .

Это окончательное добавление-это то, что не удается, несмотря на предоставление типов объектов span.

 # Matcher info
cars = ['honda', 'toyota', 'yamaha', 'mazda', 'range rover', 'mercedes']
matcher = PhraseMatcher(nlp.vocab)
patterns = list(nlp.pipe(cars))
matcher.add('acar?', None, *patterns)

# Define component
@Language.component('car_check')
def car_component(doc, name='isacar?'):
    cars =[Span(doc,start, end, label='CAR')
           for match_id, start, end in matcher(doc)]
    doc.ents = list(doc.ents)   [cars]
    return doc

nlp.add_pipe('car_check',after='ner')

doc=nlp("fascinated by european cars like range rover amp; mercedes, love japanese cars like toyota and nissan ")
 

На последнем шаге я получаю следующую ошибку.

 ---->    doc.ents = list(doc.ents)   [cars]
TypeError: an integer is required
 

Почему это не удается ?

Ответ №1:

Не знаю, почему вы получаете именно эту ошибку, но проблема в том, что вы включаете список, но это уже список. cars Попробуй это:

 doc.ents = list(doc.ents)   cars
 

Также обратите внимание, что это не сработает, если у вас есть перекрывающиеся сущности.

Вы видели EntityRuler? Вы в основном делаете то же самое, так что, вероятно, было бы проще использовать его напрямую.

Комментарии:

1. Причина заключалась в перекрывающихся сущностях. Включение автомобилей в список не является проблемой. Вы можете исправить свой ответ, чтобы я мог отметить это как ответ.