Как разделить текст на предложения в Python при этом же не учитывать точки после сокращений и инициалов?

Для разделения текста на предложения в Python вы можете использовать библиотеку nltk (Natural Language Toolkit).

Для начала, вам потребуется установить nltk в своей среде разработки. Вы можете сделать это с помощью следующей команды в терминале:

pip install nltk

После установки библиотеки, импортируйте необходимые модули в вашем скрипте:

import nltk
nltk.download('punkt')

Затем, чтобы разделить текст на предложения, вам потребуется использовать функцию sent_tokenize из модуля nltk.tokenize. Вот пример кода:

import nltk
from nltk.tokenize import sent_tokenize

text = "Привет! Как твои дела? Меня зовут Иван Иванов. Я изучаю программирование в Python."

sentences = sent_tokenize(text)
print(sentences)

Этот код выведет следующий результат:

['Привет!', 'Как твои дела?', 'Меня зовут Иван Иванов.', 'Я изучаю программирование в Python.']

Обратите внимание, что функция sent_tokenize разделяет текст на предложения, исходя из предположения, что предложение заканчивается на одном из следующих символов: . ! ?

Однако, если вы не хотите, чтобы точки после сокращений или инициалов считались концом предложения, вам понадобится модифицировать эту функцию.

Вы можете использовать регулярные выражения для достижения этой цели. Вот пример кода, показывающий, как это можно сделать:

import re

def custom_sent_tokenize(text):
    sentences = re.split(r'(?<!w.w.)(?<![A-Z][a-z].)(?<=.|?)s', text)
    return sentences

text = "Привет! Как твои дела? Меня зовут Иван Иванов. Я изучаю программирование в Python."

sentences = custom_sent_tokenize(text)
print(sentences)

Результат будет таким же, как и в предыдущем примере:

['Привет!', 'Как твои дела?', 'Меня зовут Иван Иванов.', 'Я изучаю программирование в Python.']

В этом случае использовано регулярное выражение (?<!w.w.)(?<![A-Z][a-z].)(?<=.|?)s. Позвольте объяснить его:

- (?<!w.w.) - негативное просмотре вперед; утверждение смотрит, что соседние символы не являются буквой, точкой и буквой (сокращение).
- (?<![A-Z][a-z].) - негативное просмотре назад; утверждение проверяет, что соседние символы не являются большой и малой буквой, а затем точкой (инициал).
- (?<=.|?) - положительное просмотре назад; утверждение проверяет, что предложение заканчивается точкой или вопросительным знаком.
- s - пробельный символ, используется для разделения предложений.

Теперь вы можете разделить текст на предложения, не учитывая точки после сокращений и инициалов, используя эту модифицированную функцию.