Как добавить совпадения в виде сущностей и визуализировать их в пространстве? - PullRequest
0 голосов
/ 26 июня 2018

Здесь у меня есть список животных, сохраненный в CSV-файле, как показано ниже: ["кошка", "собака", "рыба", "птица" ...] и многие другие.А вот пример предложения: «У меня есть кот».

Тогда как я могу визуализировать результат матча здесь в просторе?Подробный пример кода был бы благодарен!

1 Ответ

0 голосов
/ 26 июня 2018
Встроенный

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')

example output

Одно важное замечание: каждый токен может быть только частью одной сущности, поэтому этот подход не будет работать, если у вас совпадающие совпадения или если ваши совпадения конфликтуют с сущностями, которые уже существуют в Doc. Вы можете предотвратить это, явно отфильтровывая перекрывающиеся промежутки при выполнении итерации по matches. Это дает вам токен start и end в матче, поэтому, прежде чем добавить свой диапазон к doc.ents, вы можете проверить, есть ли уже существующий подарок, который совпадает с начальной или конечной позицией.

Для более элегантного решения вы также можете обернуть логику сопоставления в пользовательский конвейерный компонент . Это будет запускаться автоматически каждый раз, когда вы обрабатываете текст с помощью объекта nlp.

...