Разделение параграфов на предложения с помощью регулярных выражений и PHP

Я регулярный пользователь noob и пытаюсь разбить абзацы на предложения. На моем языке мы используем довольно много сокращений (например, bl.a.) в середине предложений, поэтому я пришел к выводу, что мне нужно искать знаки препинания, за которыми следует один пробел, а затем слово, которое начинается с заглавной буквы, как:

[sentence1]...anymore. However...[sentence2]

Таким образом, параграф, как:

Der er en lang og bevæget forhistorie bag lov om varsling m.v. i forbindelse med afskedigelser af større omfang. Det er ikke en bureaukratisk lovtekst blandt så mange andre.

Должен закончиться этим выводом:

[0] => Der er en lang og bevæget forhistorie bag lov om varsling m.v. i forbindelse med afskedigelser af større omfang.
[1] => Det er ikke en bureaukratisk lovtekst blandt så mange andre.

и НЕ это:

[0] => Der er en lang og bevæget forhistorie bag lov om varsling m.v. 
[1] => i forbindelse med afskedigelser af større omfang.
[2] => Det er ikke en bureaukratisk lovtekst blandt så mange andre.

Я нашел решение, которое делает первую часть этого с положительной чертой:

$regexp = (?<=[.!?] | [.!?][\'"]);

а потом

$sentences = preg_split($regexp, $paragraph, -1, PREG_SPLIT_NO_EMPTY);

которая является отличной отправной точкой, но расщепляется слишком много раз из-за множества сокращений.

Я пытался сделать это:

(?<=[.!?]\s[A-Z] | [.!?][\'"])

нацеливаться на каждый случай любого из

. or ! or ?

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

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

2 ответа

Решение

Unicode RegExp для разделения предложений: (?<=[.?!;])\s+(?=\p{Lu})

Разъяснение демо здесь: http://regex101.com/r/iR7cC8

Поиск такого шаблона все еще кажется ненадежным, но поскольку предложения могут заканчиваться возвратами строк, я бы попробовал следующее

[.\!\?][\s\n\r\t][A-Z] 

Я не думаю, что вы на самом деле имели в виду прогноз, не так ли? (!? вместе, поэтому использование \ escapes it - говорит регулярному выражению игнорировать любое особое значение)

Другие вопросы по тегам