Встроенный
spaCy displacy
визуализатор позволяет передавать один или несколько объектов Doc
и выделяет все объекты, доступные как свойство doc.ents
. doc.ents
доступны для записи, поэтому вы можете использовать PhraseMatcher
, чтобы найти своих животных в тексте, создать новый объект Span
для каждого совпадения и добавить его к существующим объектам. Вот пример:
import spacy
from spacy.matcher import PhraseMatcher
from spacy.tokens import Span
animals = ['cat', 'dog', 'fish', 'bird']
nlp = spacy.load('en_core_web_sm') # or any other model
patterns = [nlp(animal) for animal in animals] # process each word to create phrase pattern
matcher = PhraseMatcher(nlp.vocab)
matcher.add('ANIMAL', None, *patterns) # add patterns to matcher
doc = nlp("I have a cat")
matches = matcher(doc)
for match_id, start, end in matches:
# create a new Span for each match and use the match_id (ANIMAL) as the label
span = Span(doc, start, end, label=match_id)
doc.ents = list(doc.ents) + [span] # add span to doc.ents
print([(ent.text, ent.label_) for ent in doc.ents]) # [('cat', 'ANIMAL')]
Ваш Doc
объект теперь содержит диапазон сущностей для «cat», поэтому при запуске displaCy сущность будет выделена. Для получения дополнительной информации, в том числе о том, как добавить пользовательские цвета для объектов, см. документацию по визуализаторам .
.
from spacy import displacy
displacy.serve(doc, style='ent')
Одно важное замечание: каждый токен может быть только частью одной сущности, поэтому этот подход не будет работать, если у вас совпадающие совпадения или если ваши совпадения конфликтуют с сущностями, которые уже существуют в Doc
. Вы можете предотвратить это, явно отфильтровывая перекрывающиеся промежутки при выполнении итерации по matches
. Это дает вам токен start
и end
в матче, поэтому, прежде чем добавить свой диапазон к doc.ents
, вы можете проверить, есть ли уже существующий подарок, который совпадает с начальной или конечной позицией.
Для более элегантного решения вы также можете обернуть логику сопоставления в пользовательский конвейерный компонент . Это будет запускаться автоматически каждый раз, когда вы обрабатываете текст с помощью объекта nlp
.