Одна потенциальная трудность в вашем примере заключается в том, что он не очень близок к естественному языку.Модели с предварительно подготовленным английским языком прошли обучение на ~ 2 млн слов общего текста в сети и в новостях, поэтому они не всегда будут выполнять идеальные текстовые операции с совершенно другой структурой.
В то время как вы могли бы обновить модель с помощью большего количества примеров QUANTITY
в ваших конкретных текстах, я думаю, что подход, основанный на правилах, на самом деле может быть лучшим и более эффективным решением здесь.
Пример в этом сообщении в блоге на самом деле очень близок к тому, что вы пытаетесь сделать:
import spacy
from spacy.pipeline import EntityRuler
nlp = spacy.load("en_core_web_sm")
weights_pattern = [
{"LIKE_NUM": True},
{"LOWER": {"IN": ["g", "kg", "grams", "kilograms", "lb", "lbs", "pounds"]}}
]
patterns = [{"label": "QUANTITY", "pattern": weights_pattern}]
ruler = EntityRuler(nlp, patterns=patterns)
nlp.add_pipe(ruler, before="ner")
doc = nlp("U.S. average was 2 lbs.")
print([(ent.text, ent.label_) for ent in doc.ents])
# [('U.S.', 'GPE'), ('2 lbs', 'QUANTITY')]
Статический распознаватель именованных сущностей учитывает предопределенные сущности иБудем «предсказывать» их.Поэтому, если вы добавляете EntityRuler
перед в конвейере, ваши пользовательские QUANTITY
сущности будут назначены первыми и будут учтены, когда распознаватель сущностей предсказывает метки для оставшихся токенов.
Обратите внимание, что в этом примере используется последняя версия spaCy, v2.1.x.Вы также можете добавить больше шаблонов для покрытия различных конструкций.Для получения дополнительной информации и вдохновения ознакомьтесь с документацией по EntityRuler
, , объединяющей модели и правила и синтаксис шаблона соответствия токенов .