Каков наилучший способ преодолеть неправильное распознавание сущности с помощью Spacy? - PullRequest
0 голосов
/ 22 марта 2019

Я тестирую такое предложение, чтобы извлечь значения сущностей: s = "Height: 3m, width: 4.0m, others: 3.4 m, 4m, 5 meters, 10 m. Quantity: 6."

sent = nlp(s)

for ent in sent.ents:
    print(ent.text, ent.label_)

И получил несколько вводящих в заблуждение значений:

3 CARDINAL 4,0 м CARDINAL 3,4 м CARDINAL 4 мКАРДИНАЛ 5 метров КОЛИЧЕСТВО 10 м КОЛИЧЕСТВО 6 КАРДИНАЛ

, а именно, номер 3m не связан с m.Это касается многих примеров, так как я не могу полагаться на этот двигатель, когда хочу отделить счетчики от количеств.

Должен ли я сделать это вручную?

1 Ответ

1 голос
/ 22 марта 2019

Одна потенциальная трудность в вашем примере заключается в том, что он не очень близок к естественному языку.Модели с предварительно подготовленным английским языком прошли обучение на ~ 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, , объединяющей модели и правила и синтаксис шаблона соответствия токенов .

...