#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