Spacy: Попытка установить конфликтующие документы.ents: токен может быть только частью одного объекта, поэтому убедитесь, что устанавливаемые вами объекты не перекрываются

#python #nlp #spacy

#python #nlp #spacy

Вопрос:

Я пытаюсь использовать spacy для извлечения необходимых пользовательских объектов из текста.

 import spacy
from spacy_lookup import Entity
data = {0:["count"],1:["unique count","unique"]}

def processText(text):
    nlp = spacy.blank('en')
    for i,arr in data.items():
        fLabel = "test:" str(i)
        fEntitty = Entity(keywords_list=list(set(arr)),label=fLabel)
        fEntitty.name = fLabel
        nlp.add_pipe(fEntitty)
    match_doc = nlp(text)
    print(match_doc.ents)
processText("unique count of city")
  

Но приведенный выше код выдает ошибку, подобную

 ValueError: [E103] Trying to set conflicting doc.ents: '(1, 2, 'test:0')' and '(0, 2, 'test:1')'. A token can only be part of one entity, so make sure the entities you're setting don't overlap.
  

Не только в этом случае, а также та же проблема с именем человека, что-то вроде Karthik vs Karthik reddy, Jon vs Jon Allen
Кто-нибудь, пожалуйста, может помочь мне решить эту проблему.

Заранее спасибо!!

Ответ №1:

В spaCy именованные объекты никогда не могут перекрываться. Если «Джон Аллен» — это имя, вы также не должны комментировать «Джон» в качестве имени. Итак, перед обучением вам придется исправить эти перекрывающиеся / конфликтующие случаи.

РЕДАКТИРОВАТЬ после обсуждения в комментариях: вы захотите реализовать on_match функцию для фильтрации совпадений с неперекрывающимся набором.

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

1. Спасибо за ответ. Но в режиме реального времени может быть перекрытие слов, в котором нам нужно извлечь наилучшее соответствие. Допустим, «Karthik» и «Karthik Reddy» — это два разных человека. тогда текст может быть «сколько зарплата за Картик?», Но он выдаст ту же ошибку.

2. Я не уверен, что вы имеете в виду. Перекрываются ли объекты, определяется в предложении. Вы определенно можете аннотировать «Karthik» как объект в одном предложении, а «Karthik Reddy» — в другом предложении. Но в пределах одного предложения вы не можете комментировать одно конкретное слово дважды.

3. Ошибка возникнет, когда мы попытаемся использовать nlp («Сколько зарплата для karthik»), здесь nlp тренировался со словами «karthik» и «karthik Freddy». проверьте опубликованный выше пример, там вы можете видеть, что я пытаюсь задать «»уникальное количество городов», но это выдает ошибку, поскольку перекрытие обученных объектов «count» и «unique count». Пожалуйста, если вы можете запустить приведенный выше код в вашей системе, вы сможете лучше понять.

4. Вы определили два шаблона: один — «count», а другой — «unique count». Затем вы выполняете поиск по словарю по тексту, который включает слова «количество уникальных». В результате оба ваших шаблона будут совпадать и попытаются установить для их метки слово «count». Однако «count» может получить только одну метку в качестве именованного объекта в spaCy. (обратите внимание, что здесь нет обучения, только сопоставление с образцом)

5. Вот более актуальные документы по сопоставлению на основе шаблонов и словарей: spacy.io/usage/rule-based-matching И вот еще документы по фактическому обучению более тонкой системы: spacy.io/usage/training#ner