Я предлагаю использовать spacy.matcher.Matcher
и получать соответствующие предложения после каждого совпадения.
Посмотреть пример демонстрации:
import spacy
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_sm')
matcher = Matcher(nlp.vocab)
corpus = "onions are being cut. However, a great big cut to the onions have been observed"
doc = nlp(corpus)
pattern = [{'LEMMA': 'cut'},
{'IS_ALPHA': True, 'OP': '*'},
{'LEMMA': 'onion'}]
matcher.add('pat', None, pattern)
matches = matcher(doc)
for match_id, start, end in matches:
string_id = nlp.vocab.strings[match_id] # Get string representation
span = doc[start:end] # The matched span
print("Match ID: {}\nString ID: {}\nStart: {}\nEnd: {}\nText: {}\nSentence: {}".format(
match_id, string_id, start, end, span.text, span.sent))
Вывод:
Match ID: 5387953638794962156
String ID: pat
Start: 10
End: 14
Text: cut to the onions
Sentence: However, a great big cut to the onions have been observed
Обратите внимание, что шаблон pattern = [{'LEMMA': 'cut'},{'IS_ALPHA': True, 'OP': '*'},{'LEMMA': 'onion'}]
соответствует строке, которая начинается с cut
слово леммы ({'LEMMA': 'cut'}
), затем содержит 0 или более вхождений любых буквенных слов ({'IS_ALPHA': True, 'OP': '*'}
) и затем имеет лемму onion
слово.