Preg_split предложения внутри массива с сохранением пунктуации

#php #regex #arrays

#php #регулярное выражение #массивы

Вопрос:

У меня есть текст, подобный этому: «это предложение 1. это предложение 2. это предложение 3? привет, мир!»

Я использую этот код для разделения текста на предложения и вставки их в массив.

  $content = $page_data->post_content;
   $sentence = preg_split('/[!?.]s?/', $content);
   $sentence = array_map('trim', $sentence);
   echo $sentence[0]; - **which renders this is sentence 1 - without the "."**
   ....
  

Как я могу использовать этот код и сохранить знаки препинания?

Ty:)

Комментарии:

1. В Perl split вы можете сохранить свои разделители, используя группы захвата, но они отображаются как отдельные элементы. Если это то, что вы хотите, то вы могли бы использовать глобальное соответствие для достижения того же результата. Но если вы хотите сохранить это в конце предложения, @codaddict имеет правильную общую идею. Для реальных данных вам нужно будет быть немного более осторожным, вот и все. Разве не существует какой-либо существующей библиотеки, которая уже выполняет для вас разделение предложений, соответствующее NLP, например, Perl’s Lingua::Sentence ? Это то, что вам нужно.

Ответ №1:

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

 $sentence = preg_split('/(?<=[!?.])./', $content);
  

Смотрите это

Комментарии:

1. Это не сработает для предложений с аббревиатурами в них, вы знаете. Вам нужно использовать что-то более похожее (?<=[!?.])(?:$|s (?=p{Lu}p{Ll}*b)) , и даже тогда у вас есть проблема с мистером Роджерсом и тому подобным. Вероятно, вам следует использовать стоп-лист для часто сокращаемых заголовков, но вы не получите хороших результатов, не запустив его через механизм машинного обучения в корпусе, который напоминает ваш входной поток, чтобы обучить его таким вещам.

Ответ №2:

у preg_split нет такого флага, который сохраняет разделитель, но вы можете использовать preg_match_all:

 <?php

    $content = "this is sentence 1. this is sentence 2. is this sentence 3? hello world!";
    preg_match_all('/([^.?!] [.?!])/', $content, $sentence);
    $sentence = array_map('trim', $sentence[0]);
    print_r($sentence);

?>