SpaCy NER, кажется, неправильно распознает дефисные имена - PullRequest
1 голос
/ 04 апреля 2020

1-я вещь 1-я: я новичок в SpaCy и только начал его тестировать. Я должен сказать, что я впечатлен его простотой и качеством do c. Спасибо!

Теперь я пытаюсь определить PER во французском тексте. Кажется, для большинства это работает довольно хорошо, но я видел повторяющуюся неправильную схему: имена с дефисом не распознаются правильно (например, Пьер-Луи Дюран будет отображаться как два PER: «Пьер» и «Луи Дюран»).

См. Пример:

import spacy

# nlp = spacy.load('fr')
nlp = spacy.load('fr_core_news_md')

description = ('C\'est Jean-Sébastien Durand qui leur a dit. Pierre Dupond n\'est pas venu à Boston comme attendu. '
    'Louis-Jean s\'est trompé. Claire a bien choisi.')

text = nlp(description)
labels = set([w.label_ for w in text.ents])
for label in labels:
    entities = [e.string for e in text.ents if label==e.label_]
    entities = list(entities)
    print(label, entities)

вывод:

LOC ['Boston ']
PER ['Jean', 'Sébastien Durand ', 'Pierre Dupond ', 'Louis', 'Jean ', 'Claire ']

Это должны быть: "Жан-Себастьян Дюран" и "Луи-Жан".

Я не уверен, что делать здесь:

  1. изменить способ извлечения токенов (меня интересует побочный эффект для не PER) - я не думаю, что это проблема как PER может представлять собой совокупность нескольких токенов
  2. применить магию c где-нибудь, чтобы дефис можно было использовать в NER для PER
  3. обучить модель
  4. go обратно в школу; -)

Спасибо за вашу помощь (и да, я изучаю, читая больше, мне это нравится)!

-T C

1 Ответ

0 голосов
/ 05 апреля 2020

Сначала я думал, что это будет несоответствие между токенизатором и данными обучения, но на самом деле это проблема с тем, как регулярное выражение, которое обрабатывает некоторые слова с дефисами, загружается из сохраненной модели.

Временное исправление для моделей spacy v2.2 (что необходимо делать каждый раз после загрузки французской модели) необходимо заменить проблемную настройку токенизатора c правильной настройкой по умолчанию:

import spacy
from spacy.lang.fr import French

nlp = spacy.load("fr_core_news_md")
nlp.tokenizer.token_match = French.Defaults.token_match

description = ('C\'est Jean-Sébastien Durand qui leur a dit. Pierre Dupond n\'est pas venu à Boston comme attendu. '
    'Louis-Jean s\'est trompé. Claire a bien choisi.')

text = nlp(description)
labels = set([w.label_ for w in text.ents])
for label in labels:
    entities = [e.text for e in text.ents if label==e.label_]
    entities = list(entities)
    print(label, entities)

Вывод:

PER ['Jean-Sébastien Durand', 'Pierre Dupond']
LOC ['Boston', 'Louis-Jean', 'Claire']

(Французская модель NER обучена на данных из Википедии, поэтому она все еще не очень хорошо работает с типами сущностей для этого конкретного текста.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...