Нахождение самой длинной и цепочки в спа-центре - PullRequest
0 голосов
/ 31 октября 2019

Как я могу сопоставить самую длинную 'и цепочку', доступную в некотором тексте?

Например, рассмотрим

«На форуме были джем, ягоды и вино, хлеб, масло, сыр и молоко, даже шоколад и фисташка!»

Как я могусопоставить

'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, как указано здесь .

1 Ответ

0 голосов
/ 31 октября 2019

Попробуйте:

l = [{t.nbor(-1).i, t.i, t.nbor().i} for t in doc if t.text == 'and']
bag = set().union(*l) #The * operator unpacks an argument list
st = " ".join([t.text if t.i in bag else '\n' for t in doc])
result = [part.strip() for part in st.split('\n') if part.strip()]


# result = ['jam and berry and wine',
# 'bread and butter and cheese and milk',
# 'chocolate and pista']

Обратите внимание, что предполагается, что первый и последний токены не являются токенами 'и'.

...