Для окна с K словами, где K относительно мало, вы можете добавить K-2 дополнительные жетоны подстановочных знаков между вашими словами. Подстановочный знак означает «любой символ», а в терминах Spacy это просто пустой диктант. Необязательно означает, что токен может присутствовать или отсутствовать, а в Spacy in кодируется как {"OP": "?"}
.
Таким образом, вы можете написать свой сопоставитель как
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, [{"LOWER": "hello"}, {"OP": "?"}, {"OP": "?"}, {"OP": "?"}, {"LOWER": "world"}])
, что означает, что вы ищете «привет», затем от 0 до 3 токенов любого вида, затем «мир».Например, для
doc = nlp(u"Hello brave new world")
for match_id, start, end in matcher(doc):
string_id = nlp.vocab.strings[match_id]
span = doc[start:end]
print(match_id, string_id, start, end, span.text)
будет напечатано
15578876784678163569 HelloWorld 0 4 Hello brave new world
И если вы хотите сопоставить и другой порядок (world??? Hello), вам нужно добавитьво-вторых, симметричный рисунок в ваш матчер.