Преобразование выражения регулярного выражения для извлечения предложения в Ruby - PullRequest
0 голосов
/ 01 мая 2010

Я нашел это выражение регулярного выражения в http://en.wikipedia.org/wiki/Sentence_boundary_disambiguation для устранения неоднозначности границ предложения, но не могу использовать его в расчете Ruby split.Я не слишком хорош в регулярных выражениях, так что, может быть, я что-то упустил?Это утверждение:

((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])

, и это то, что я пробовал в Ruby, но не ходил:

text.split("((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])")

1 Ответ

2 голосов
/ 02 мая 2010

Это должно работать в Ruby 1.9 или в Ruby 1.8, если вы скомпилировали его с помощью механизма регулярных выражений Oniguruma (который является стандартным в Ruby 1.9):

result = text.split(/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]"))\s+(?="?[A-Z])/)

Разница в том, что ваш код передает буквенную строку в split(), тогда как этот код передает буквальное регулярное выражение.

Он не будет работать с использованием классического движка Ruby regex (который является стандартным в Ruby 1.8), потому что он не поддерживает lookbehind.

Я также изменил регулярное выражение. Я заменил (\s|\r\n) на \s+. Мое регулярное выражение также разбивает предложения, которые имеют несколько пробелов между ними (ввод двух пробелов после предложения является распространенным во многих культурах) и / или несколько разрывов строк между ними (разграничение абзацев).

При работе с текстом в кодировке Юникод дальнейшим улучшением будет замена a-z на \p{Ll}\p{Lo}, A-Z на \p{Lu}\p{Lt}\p{Lo} и 0-9 на \p{N} в различных классах символов в регулярном выражении. Класс символов с символами пунктуации может быть расширен аналогичным образом. Это потребует немного больше исследований, потому что не существует свойства Unicode для пунктуации в конце предложения.

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