#nlp #spacy #spacy-3
Вопрос:
Я добавляю пользовательский компонент в nlp
конвейер в Spacy. Ниже приведены шаги, которым я следую.
- создайте сопоставитель для выбора названий автомобилей
- определите пользовательский компонент, который использует этот сопоставитель и добавляет совпадения к существующим
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. Причина заключалась в перекрывающихся сущностях. Включение автомобилей в список не является проблемой. Вы можете исправить свой ответ, чтобы я мог отметить это как ответ.