Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Выделение предложений из текста
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Выделение предложений из текста

Страниц (1): [1]
 

1. Vasser - 01 Марта, 2008 - 19:08:26 - перейти к сообщению
Доброе время, может кто поможет с сабжем? Стоит задача - выделить из текста предложения, как наиболее грамотно это сделать? Учитывая, что предложения могут кнчаться символами .?!, в предложении могут быть сюрпризы типа "бла-бла-бла .net блаб-бла-бла" или "бла-бла бла т.е. не совсем бла-бла" или "версия 5.2 выйдет..." Вроде бы задача обычная, но готового решения найти не могу...
2. valenok - 01 Марта, 2008 - 21:37:32 - перейти к сообщению
А как вы хотите чтоб скрипт понимал где конец предложения?
(Добавление)
Есть второй подход к решению вашей задачи:
2. А на кой чёрт это вообще нужно..
3. Vasser - 01 Марта, 2008 - 23:11:21 - перейти к сообщению
Где-то когда-то видел здоровенное регулярное выражение для определения имэйла в тексте, кто-то ж его написал, думал мож у кого и для предложений есть Не понял

Цитата:
Есть второй подход к решению вашей задачи:
2. А на кой чёрт это вообще нужно..

это не второй, это первый Радость , к сожалению он чуток не катит

Конец предлжения для скрипта - .?![пробельный символ][БОЛЬШАЯ БУКВА или числительное], в регулярных пока вообще 0... Посимвольно проходить по тексту - можно, но некрасиво.

Вот такие вот у меня житейские проблемы.
4. valenok - 02 Марта, 2008 - 06:29:42 - перейти к сообщению
У имейла вид постоянный всегда, а у ваших предложений с сюрпризом может быть что угодно.
Во вторых вы не ответили зачем и действительно ли вам нужно выделять предложения.
5. Vasser - 03 Марта, 2008 - 01:43:40 - перейти к сообщению
Цитата:
У имейла вид постоянный всегда, а у ваших предложений с сюрпризом может быть что угодно.

вообще, предложение оно как бы тоже соответствует определенным требованиям, думал, может это классическая задача (выделить предложения) - оказалось нет...

Цитата:
Во вторых вы не ответили зачем и действительно ли вам нужно выделять предложения.

да, извините, не ответил: действительно нужно, задачу задали - выделить из текста предложения. Под предложениями я понимаю конструкции, удовлетворяющие обычным орфографичесим\синтаксическим (человеческим Улыбка ) требованиям к предложениям: начинается с большой буквы, заканчивается знаком препинания+[пробел или конец строки], может содержать "сюрпризы" типа .net, моб. или ул. и т п. Вот.


Сорри, у вас длина ссобщения 2кб максимум, сейчас 3 мессага сделаю

(Добавление)
Пока сделал так:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. $text = '
  5.  
  6. Это нормальный текст
  7.  
  8. Регулярные выражения пришли к нам из Unix и Perl. В PHP существует два различных механизма для обработки регулярных выражений: POSIX-совместимые и Perl-совместимые. Их синтаксис во многом похож, однако Perl-совместимые регулярные выражения более мощные и, к тому же, работают намного быстрее (в некоторых случаях до 10 раз быстрее).
  9.  
  10. Круто, не правда ли!?
  11.  
  12. А дальше идут куски текста с сюрпризами
  13.  
  14. Бла-бла-бла .net блаб-бла-бла .
  15. Бла-бла бла т.е. не совсем бла-бла.
  16. Версия 5.2 выйдет! Куда она денется!
  17. Адрес: ул. Цурюпы, д. 12, кв.15, Нижний Тагил, моб. +1231234567.
  18. Всё.
  19.  
  20. ';
  21.  
  22. // это чтобы выделить заголовки в тексте как предложения (чтобы заголовки
  23. // попадали под мой рег.выр. надо поставить точку с пробелом после них)
  24. $text = preg_replace('/\n{2,}/',"\n",$text);
  25. $text = str_replace("\n", '. ', $text);
  26.  
  27. // omg! кодирую текст, чтобы исключить сокращения с точками, чтобы позже работало рег.выр.
  28. $search = array(
  29.         "т.к.",
  30.         "т. к.",
  31.         "т.е.",
  32.         "т. е.",
  33.         "г.",
  34.         "ул.",
  35.         "кв.",
  36.         "д.",
  37.         "тел.",
  38.         "моб.",
  39.         "дом."
  40. );
  41. $replace = array(
  42.         "{[$%#tk1]}",
  43.         "{[$%#tk2]}",
  44.         "{[$%#te1]}",
  45.         "{[$%#te2]}",
  46.         "{[$%#g]}",
  47.         "{[$%#ul]}",
  48.         "{[$%#kv]}",
  49.         "{[$%#d]}",
  50.         "{[$%#tel]}",
  51.         "{[$%#mob]}",
  52.         "{[$%#dom]}"
  53. );
  54. $text = str_replace($search, $replace, $text);
  55.  
  56. // чтобы рег.выр.-у соответстовали первое и последнее предложение в тексте
  57. $text = ' '.$text.' ';
  58.  
  59. // сам рег.выр.
  60. $reg = '/([A-ZА-Я]+.+)[.!?]+[\s]+/sU';
  61. preg_match_all($reg, $text, $strings, PREG_PATTERN_ORDER);
  62. // это массив с предложениями, без знака препинания вконце, но ниче
  63. $strings = $strings[1];
  64.  
  65. // декодируем предложения в нормальный вид
  66. foreach($strings as $i => $string) $strings[$i] = str_replace($replace, $search, $string);
  67.  
  68.  
  69. var_dump($strings);
  70.  
  71.  
  72. ?>
  73.  

(Добавление)
по-моему извращенски, плюс почему-то str_ireplace в моем php5 не работает Огорчение , но ничего...

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


В общем пока это - самое толковое, что я придумал.

Скрипт возвращает
Цитата:

array(12) {
[0]=>
string(20) "Это нормальный текст"
[1]=>
string(48) "Регулярные выражения пришли к нам из Unix и Perl"
[2]=>
string(113) "В PHP существует два различных механизма для обработки регулярных выражений: POSIX-совместимые и Perl-совместимые"
[3]=>
string(166) "Их синтаксис во многом похож, однако Perl-совместимые регулярные выражения более мощные и, к тому же, работают намного быстрее (в некоторых случаях до 10 раз быстрее)"
[4]=>
string(19) "Круто, не правда ли"
[5]=>
string(40) "А дальше идут куски текста с сюрпризами "
[6]=>
string(30) "Бла-бла-бла .net блаб-бла-бла "
[7]=>
string(34) "Бла-бла бла т.е. не совсем бла-бла"
[8]=>
string(17) "Версия 5.2 выйдет"
[9]=>
string(16) "Куда она денется"
[10]=>
string(63) "Адрес: ул. Цурюпы, д. 12, кв.15, Нижний Тагил, моб. +1231234567"
[11]=>
string(3) "Всё"
}


Может что подскажете, чтоб лучше было ?
(Добавление)

мм, три мессага прикольно склеились в один Улыбка - тогда извиняюсь за один большой мессаг

 

Powered by ExBB FM 1.0 RC1