Разбить текст по пробелам и заглавным буквам (PHP) - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь разбить текст по предложениям. В этом тексте нет точек. Но он содержит заглавные буквы. Я использую:

 <?php preg_match_all('/[A-Z][^A-Z]*?/Usu',$text,$sentences);

Но он разбивает текст только заглавными буквами. Поэтому у меня есть такие предложения, как «S», «M», «S». Это неверно. Мне не нужно ломать такие слова как смс. Помогите пожалуйста.

Некоторые уточнения:

  • Я пытаюсь разбить строку перед каждой строкой из одной или нескольких заглавных букв.
  • Но моя реальная задача более сложна , Я пытаюсь отформатировать текст для удобства чтения.
  • Пример: часть вакансии без тегов html и разрывов строк: «Желательно: AWS опыт работы с Docker / Kubernetes». Я пытаюсь получить: «Желательно:», «AWS опыт» и «Опыт работы с Docker / Kubernetes» (я думаю, что я смогу склеить очень короткие строки после разделения пробелом и заглавной буквой. Может быть, это очень плохой путь, конечно).

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

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

(?=(?<![A-Z]|^)[A-Z])

Regex demo

Может быть выполнено следующим образом:

<?php
$result = preg_split("/(?=(?<![A-Z]|^)[A-Z])/", "now is THE time to BE brave"); 
print_r($result); 

PHP demo

Как показано по ссылке, это возвращает

Array
(
    [0] => now is 
    [1] => THE time to 
    [2] => BE brave
)

Если первое слово строки было написано с большой буквы ("Now"), первый элемент строки будет "Now is" (т. е. не пустая строка "). Механизм регулярных выражений

PHP выполняет следующие операции.

(?=           # begin a positive lookahead
  (?<!        # begin a negative lookbehind
    [A-Z]     # match a capital letter
    |         # or
    ^         # match the beginning of the line
  )           # end the negative lookbehind
  [A-Z]       # match a capital letter
)             # end positive lookahead

Эта попытка сопоставить заглавная буква в положительном заглядывании ([A-Z]), но это совпадение не выполняется, если отрицательный заглавный знак соответствует заглавной букве, предшествующей ему, или заглавная буква находится в начале строки.

0 голосов
/ 08 апреля 2020

Вы действительно не должны использовать регулярные выражения для анализа чего-то столь же сложного, как естественный язык. Я бы порекомендовал что-то вроде IntlBreakIterator.

$text = "Sentence 1. Sentence 2! Sentence 3? Sentence; number 4...Sentence, 5.";

$it = IntlBreakIterator::createSentenceInstance("en_US");
$it->setText($text);
$parts = $it->getPartsIterator();

foreach ($parts as $point => $sentence) {
    echo "$point => $sentence\n\n\n";
}

Вывод

0 => Sentence 1. 


1 => Sentence 2! 


2 => Sentence 3? 


3 => Sentence; number 4...


4 => Sentence, 5.

Правила разбора слов / предложений могут быть сложными и сложными для реализации в регулярном выражении. Это решение более разумно для синтаксически правильного корпуса. Тем не менее, если в тексте нет знаков препинания, как вы говорите, то нет разумного способа отличить guish одно предложение от другого. Простая попытка сделать это заглавными буквами может привести к множеству ложных срабатываний, потому что слова могут быть написаны заглавными буквами в середине предложения, такие как имена собственные и некоторые сокращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...