iwqn
@iwqn
Программист-самоучка

Как разделить текст на предложения на Python?

В Питоне я полный новичок, поэтому прошу помочь и не ругаться.

На входе имеется файл с текстом в котором могут быть абзацы, переносы строк, несколько пробелов, троеточие, и собственно предложения текста.

Как бы мне грамотно поделить текст на предложения и получить их в массив?

Прошу не ругаться а дать пример кода, который работает, примеры которые я нагуглил работают некорректно, оставляя в некоторых элементах массива по 2-3 предложения вместо одного.

Текст я для примера взял вот отсюда royallib.com/get/txt/bianki_vitaliy/rasskazi_i_ska...
  • Вопрос задан
  • 18990 просмотров
Решения вопроса 4
import re

text = '''
Первое предложение.

Второе предложение!

Третье предложение?

Четвёртое предложение...

Пятое предложение.

Ещё одно предложение…
'''

split_regex = re.compile(r'[.|!|?|…]')
sentences = filter(lambda t: t, [t.strip() for t in split_regex.split(text)])
for s in sentences:
    print(s)

Вывод:
Первое предложение
Второе предложение
Третье предложение
Четвёртое предложение
Пятое предложение
Ещё одно предложение
Ответ написан
LazyTalent
@LazyTalent
Data Engineer, Freelancer
Ответ написан
Комментировать
Тут важно более или менее точно знать используемые разделители.
Первое, что можно попробовать - модуль 're' и его функцию split (позволяет указать множество разделителей в отличие от встроенной):
import re
prop = 'Ехал Грека. Через реку. Видит Грека - в реке рак... Сунул Грека руку в реку. Рак за руку. Греку. Цап'
re.split("\. |\.\.\. ", prop)
['Ехал Грека', 'Через реку', 'Видит Грека - в реке рак', 'Сунул Грека руку в реку', 'Рак за руку', 'Греку', 'Цап']
Ответ написан
Комментировать
longclaps
@longclaps
В предложеных вариантах пропадают знаки препинания на концах предложений.
Это неправильно, нужно так (python3):
import re

with open("блаблабла.txt", "rb") as f:
    s = re.sub(r'\s+', ' ', f.read().decode('WINDOWS-1251'), flags=re.M)
for s in re.split(r'(?<=[.!?…]) ', s):
    print(s)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы