Как разбить текст на предложения на PHP.

Разбивка текста на предложения.

Мне часто приходится работать с парсерами/краулерам/агрегаторами и прочей нечистью, поэтому обработка и анализ текстов – неотъемлемая часть моей работы. Задача разбивки текста на предложения для последующего анализа или обработки – одна из самых часто используемых. Конечно, можно не напрягать мозг и использовать нечто вроде:

И правда дешево, надежно… хоть и не очень практично. Например, в тексте могут встречаться числа с дробью, указанной через точку (к примеру, 3.14), в таком случае 3 и 14 будут распознаны как отдельные предложения. Либо же в тексте встетится доменное имя (к примеру, yandex.ru) и скрипт справедливо укажет, что “yandex” и “ru” – это два разных предложения.

Поэтому я решил один раз заморочиться и написать что-то более-менее правильное и закрыть для себя эту задачу. Получившейся функцией я с вами и поделюсь.

Код привожу без комментариев. Специально для тех, кому просто нужен рабочий кусок кода – берите и пользуйтесь на здоровье. Для тех, кому интересно, как это всё работает и почему я сделал именно так, а не иначе, будет разбор кода по пунктам.

А теперь разберем поэтапно.

Заменяем точки на спецсимволы в аббревиатурах. Чтобы “А.С. Пушкин” не было распознано скриптом как 3 псевод-предложения.

Решаем проблему с дробными числами, о которой я уже говорил.

Сохраняем точки внутри тегов.

Предотвращаем разбивку текста на предложения посреди URL или домена.

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

Этим кодом мы удаляем лишние пробелы в начале каждого элемента массива и добавляем к ник знаки препинания, которые следовали за ним до нашей разбивки.

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

Проверяем, не удалили ли мы все элементы из массива =)

Возвращаем на место точки, которые мы заменили на спец. символ в начале функции.

Как ни странно, возвращаем результат =)
Надеюсь, скрипт вам пригодится.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">