Мой подход похож на Альберто Поляк , но немного более явный.
Мотивация состоит в том, чтобы понять, что разделение на слова не нужно - оператор Python in
с радостью найдет словов предложении.Что необходимо, так это расщепление предложений.К сожалению, предложения могут заканчиваться .
, ?
или !
, а функция Python split
не допускает использование нескольких разделителей.Таким образом, мы должны немного усложниться и использовать re
.
re
требует от нас поставить |
между каждым разделителем и escape некоторых из них, потому что оба .
и ?
имеют специальные значения по умолчанию.Решение Альберто использовало саму re
, чтобы сделать все это, и это определенно верный путь.Но если вы новичок в re
, моя жестко запрограммированная версия может быть более ясной.
Другое добавление, которое я сделал, заключалось в том, чтобы поставить конечный разделитель каждого предложения обратно на предложение, которому он принадлежит.Для этого я обернул разделители в ()
, что фиксирует их в выводе.Затем я использовал zip
, чтобы вернуть их в предложение, из которого они пришли.Срезы 0::2
и 1::2
будут брать каждый четный индекс (предложения) и объединять их с каждым нечетным индексом (разделителями).Раскомментируйте оператор print
, чтобы увидеть, что происходит.
import re
lines = "Welcome to SOF! This website securely stores data for the user. Another sentence."
keyword = "data"
sentences = re.split('(\.|!|\?)', lines)
sentences_terminated = [a + b for a,b in zip(sentences[0::2], sentences[1::2])]
# print(sentences_terminated)
for sentence in sentences_terminated:
if keyword in sentence:
print(sentence)
break
Вывод:
This website securely stores data for the user.