Как я могу сопоставить самую длинную 'и цепочку', доступную в некотором тексте?
Например, рассмотрим
«На форуме были джем, ягоды и вино, хлеб, масло, сыр и молоко, даже шоколад и фисташка!»
Как я могусопоставить
'jam and berry and wine'
и
'bread and butter and cheese and milk'
, не зная количества разделенных 'и' терминов?
Это то, что я пробовал.
import spacy
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_sm')
matcher = Matcher(nlp.vocab)
pattern = [{'IS_ASCII': True}, {'LOWER': 'and'}, {'IS_ASCII': True}]
matcher.add("AND_PAT", None, pattern)
doc = nlp("The forum had jam and berry and wine along with bread and butter and cheese and milk, even chocolate and pista!")
for match_id, start, end in matcher(doc):
print(doc[start: end].text)
но это не делает "ленивый" тип соответствия, который мне нужен.
Я посмотрел на документацию и там упоминается OP
ключ для создания правил, но это, кажется, полезно, только если один и тот же токен повторяется последовательно.
Кроме того, совпадения должны быть жадными и не давать результата, как только будет найден приемлемый шаблон. В приведенном выше примере желаемый результат равен не , как (как в моей программе)
jam and berry
berry and wine
, а как
jam and berry and wine
Это проблема, которая может, вероятно,Решить с помощью регулярных выражений, но я надеялся на решение с использованием соответствия правил spaCy. Желательно даже без использования оператора REGEX
, как указано здесь .