регулярное выражение, которое будет извлекать предложения из текстового файла

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

рассмотрим, например, азиатское цунами, которое произошло в конце 2004 года. Запрос в Google News (http://news.google.com) вернули более 80 000 онлайн-новостных статей об этом событии в течение одного месяца(январь.С 17 по 17 февраля.17 2005,). информация mr. Кахана.

вот мой код:

$re = '/(?<=[.!?]|[.!?][\'"])\s+/';
$sentences = preg_split($re, $text, -1, PREG_SPLIT_NO_EMPTY);

но последнее предложение все равно splitted information by mr. и Kahana. как ее решить ? спасибо :)

1 ответов


вы не можете сделать это с регулярными выражениями

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

Если это не критично для вашей программы, я предлагаю вам вместо этого определить следующие вещи:

  • что такое приемлемый уровень ошибки? ничто не будет идеальным. Но если он работает 80% это нормально? 90%? 99%? Насколько это важно для вас / вашего клиента?
  • где текст? например, учебник, скорее всего, будет написан иначе, чем каналы twitter людей. Вы можете провести исследование и сделать исключения на основе того, что вы видите в фактическом тексте, который вы используете.
  • что я делаю с текстом? Если вы просто индексируете такие вещи, как ключевые слова, то это не имеет значения (как много), если вы получите предложения разделить правильно. Это все о настройке программы, чтобы получить соответствующий выход для этой конкретной цели.

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

короче говоря, PHP и регулярные выражения не предназначены для этого, потому что английский язык фанк. Поэтому либо живите с добавлением исключений, чтобы получить небольшую (er) частоту ошибок, либо переосмыслите точку вообще.