Так что я долгое время работал в НЛП, и это действительно сложная проблема, которую вы пытаетесь решить. Вы никогда не сможете реализовать решение со 100% точностью, поэтому вам следует заранее решить, лучше ли принимать ложно-отрицательные решения (не удается найти точку сегментации абзаца) или ложно-положительные решения (вставляя ложную сегментацию точки). Как только вы это сделаете, соберите совокупность документов и аннотируйте истинные точки сегментации, которые вы ожидаете найти.
После того, как вы это сделаете, вам понадобится механизм для нахождения точек EOS (конец предложения). Затем между каждой парой предложений вам нужно принять двоичное решение: нужно ли вставлять границу абзаца?
Вы можете измерить сплоченность понятий в каждом абзаце на основе разных точек сегментации. Например, в документе с пятью предложениями (ABCDE) существует 16 различных способов его сегментирования:
ABCDE ABCD|E ABC|DE ABC|D|E AB|CDE AB|CD|E AB|C|DE AB|C|D|E
A|BCDE A|BCD|E A|BC|DE A|BC|D|E A|B|CDE A|B|CD|E A|B|C|DE A|B|C|D|E
Чтобы измерить сплоченность, вы можете использовать метрику подобия между предложениями (основанную на некотором наборе признаков, извлеченных для каждого предложения). Для простоты, если два смежных предложения имеют показатель сходства 0,95, то для объединения их в один и тот же абзац стоит 0,05 «стоимости». Общая стоимость плана сегментации документа представляет собой совокупность всех затрат на объединение предложений. Чтобы получить окончательную сегментацию, вы выбираете план с наименьшей совокупной стоимостью.
Конечно, для документа с более чем несколькими предложениями существует слишком много различных возможных перестановок сегментации, чтобы методом грубой силы оценить все их затраты. Так что вам понадобится некоторая эвристика для руководства процессом. Динамическое программирование может быть полезным здесь.
Что касается фактического извлечения функции предложения ... ну, вот где это действительно сложно.
Вы, вероятно, хотите игнорировать высокосинтаксические слова (соединительные слова, такие как предлоги, союзы, глаголы помощи и маркеры предложений) и основывать свое сходство на более семантически значимых словах (существительных и глаголах и, в меньшей степени, прилагательных и наречиях) .
Наивная реализация может просто подсчитать количество экземпляров каждого слова и сравнить количество слов в одном предложении с количеством слов в соседнем предложении. Если важное слово (например, «Филадельфия») встречается в двух смежных предложениях, тогда они могут получить высокую оценку сходства.
Но проблема в том, что два смежных предложения могут иметь очень похожие темы, даже если эти предложения имеют совершенно непересекающиеся наборы слов.
Таким образом, вам необходимо оценить «смысл» каждого слова (его конкретное значение, учитывая окружающий контекст) и обобщить это значение, чтобы охватить более широкую область.
Например, изображение предложения со словом «зеленоватый» в нем. Во время процесса извлечения признаков я бы, конечно, включил точное лексическое значение («зеленоватый»), но также применил бы морфологическое преобразование, нормализуя слово к его корневой форме («зеленый»). Затем я посмотрел бы это слово в таксономии и обнаружил, что это цвет, который может быть далее обобщен как визуальный дескриптор. Таким образом, основываясь на этом одном слове, я мог бы добавить четыре различных свойства к моей коллекции предложений («зеленоватый», «зеленый», «[цвет]», «[визуальный]»). Если бы следующее предложение в документе снова ссылалось на цвет «зеленый», то эти два предложения были бы очень похожи. Если бы в следующем предложении использовалось слово «красный», то они все равно имели бы степень сходства, но в меньшей степени.
Итак, есть несколько основных идей. Вы могли бы развить их до бесконечности и настроить алгоритм для эффективной работы с вашим конкретным набором данных. Существует миллион различных способов решения этой проблемы, но я надеюсь, что некоторые из этих советов помогут вам начать работу.