Как распознавать абзацы в тексте?
===================================

 Определение слова абзац:  

> Абзац (раздел, часть текста) — отрезок письменной речи, состоящий из одного или нескольких предложений.   
> 
> Абзац служит для группировки однородных единиц изложения, исчерпывая один из его моментов (тематический, сюжетный и т. д.). 

  
  

Цель: скормить текст программе без абзацев и получить на выходе текст разбитый на абзацы. 

 С хорошей точностью - никак.  

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

А дальше всё стандартно - есть набор входных параметров, есть результат (является ли предложение первым предложением абзаца, и является ли оно последним). На выходе у вас будет модель, которая для каждого предложения определяет вероятность того, что оно является "головой" абзаца и вероятность того, что это предложение является "хвостом".  
  

А дальше вы просто ставите абзац после тех предложений с высокой вероятность "хвоста", за которым идёт предложение с высокой вероятностью "головы". 

 Когда нам надо было выделить абзацы, определили два понятия: "длинные строки" и "короткие строки". Длинные строки, например, дает простой текстовый экспорт из Ворда. Там каждый абзац просто заврешается переводом строки. А вот текст из коротких строк имеет размер строки не более, например, 72 символов, а абзац отмечается несколькими дополнительными отступами в начале первой строки, иногда двойным переводом строки, иногда и тем, и тем.   
  

Если тексты из одного источника, то надо просто настроить алгоритм на конкретный вид абзацев. Если неизвестно - надо анализировать длины строк в тексте и отступы.