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

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
416
Реакции
49
Всем привет. Необходимо, используя PHP 5.6, разбить текст, длина которого более 3000 символов на куски не более 500 символов. Но при этом нужно учитывать предложения. Текст может содержать теги.
Например имеем текст, в нём 1398 символов:

Financial, commercial, legal, and intellectual factors changed the size of encyclopedias. During the <a href="/wiki/Renaissance" title="Renaissance">Renaissance</a>, middle classes had more time to read and encyclopedias helped them to learn more. Publishers wanted to increase their output so some countries like Germany started selling books missing alphabetical sections, to publish faster. Also, publishers could not afford all the resources by themselves, so multiple publishers would come together with their resources to create better encyclopedias. When publishing at the same rate became financially impossible, they turned to subscriptions and serial publications. This was risky for publishers because they had to find people that would pay all upfront or make payments. When this worked, capital would rise and there would be a steady income for encyclopedias. Later, rivalry grew, causing copyright to occur due to weak underdeveloped laws. Some publishers would copy another publisher's work to produce an encyclopedia faster and cheaper so consumers did not have to pay a lot and they would <a href="/wiki/encyclopedias" title="Renaissance">sell more</a>. Encyclopedias made it to where middle-class citizens could basically have a small library in their own house. Europeans were becoming more curious about their society around them causing them to revolt against their government.


Необходимо на выходе получить массив:
Код:
    $result = [
       // 393 символа
       0 => "Financial, commercial, legal, and intellectual factors changed the size of encyclopedias. During the <a href=\"/wiki/Renaissance\" title=\"Renaissance\">Renaissance</a>, middle classes had more time to read and encyclopedias helped them to learn more. Publishers wanted to increase their output so some countries like Germany started selling books missing alphabetical sections, to publish faster.",
   
        // 478 символов
        1 => "Also, publishers could not afford all the resources by themselves, so multiple publishers would come together with their resources to create better encyclopedias. When publishing at the same rate became financially impossible, they turned to subscriptions and serial publications. This was risky for publishers because they had to find people that would pay all upfront or make payments. When this worked, capital would rise and there would be a steady income for encyclopedias.",
   
        // 407 символов
        2 => "Later, rivalry grew, causing copyright to occur due to weak underdeveloped laws. Some publishers would copy another publisher's work to produce an encyclopedia faster and cheaper so consumers did not have to pay a lot and they would <a href=\"/wiki/encyclopedias\" title=\"Renaissance\">sell more</a>. Encyclopedias made it to where middle-class citizens could basically have a small library in their own house.",
   
        // Оставшаяся часть - 117 символов
        3 => "Europeans were becoming more curious about their society around them causing them to revolt against their government."
    ];

Подскажите как это лучше всего сделать.
 
1) Разбиваем текст на предложения, например так preg_match_all("/.*?[.?!](?:\s|$)/s", $text,$sentences);
2) Добавляем предложения в строку пока длина строки меньше 500 символов
 
  • Заблокирован
  • #3
Не нужно регулярками разбивать строки в массив. не слушай nei )
$str = explode('. ' $str) ; // разобьем по точкам в массив предложения. но тут не всё так точно, как и с регулярками.
потом массив прогоним через цикл и пересоберем
удалим предложения длинее 500 символов
mb_strlen($str,'UTF-8')
потом нужно думать как точно собрать обратно по таким критериям. тут не знаю )
наугад если только собирать... и опять проверять на длину
 
ага-ага) а предложения у нас только точками разделяются же, да?) вопросительные и восклицательные знаки...не, не слышал))
 
ага-ага) а предложения у нас только точками разделяются же, да?) вопросительные и восклицательные знаки...не, не слышал))
А еще есть такие сокращения:
  • и т.д.
  • и т.п.
  • и прочие
они могут попасться в середине предложения.
 
  • Нравится
Реакции: Nei
А еще есть такие сокращения:
  • и т.д.
  • и т.п.
  • и прочие
они могут попасться в середине предложения.

Да, и троеточия ещё. Задача разбиения на предложения - не такая простая, как может показаться)
Как вариант какие-то готовые функции, думаю, можно нагуглить.
 
Наверное, самый адекватный вариант будет.

Для просмотра ссылки Войди или Зарегистрируйся

Прикольная вещь...но, блин, это официальный спец. инструмент от Яндекса для работы с текстами (в том числе и для разбиения текст на предложения)...и он, как показано в статье, банальное сокращение "ул." некорректно обрабатывает :crazy: И это поисковая система, которая по идее с чем с чем, но с текстами должна работать очень плотно. Я понимаю, что это Open Source и вроде как "скажите спасибо за то, что хоть этим поделились"...но несерьёзно как-то %)
 
  • Заблокирован
  • #9
@Nei , да ладно с этими предложениями. Вопрос как собрать несколько предложений в массивы и не превышить 500 символов. То же с удовольствием посмотрю на реализацию. И не мешать строки. Вот так и собрать как они и идут.
 
Назад
Сверху