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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Поиск возможных комбинаций слов.. [2]
Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012 Откуда: г.Мытищи, МО
Помог: 0 раз(а)
Поверьте, перебор циклом кучу массивов, будет работать дольше, чем если я напишу тоже самое на php, и с сервера буду делать POST запрос на этот PHP, обрабатывать его там и возвращать обратно на сервер. Но это бред.
Я крайне зажат в ресурсах, тем более на встроенных функциях. Грубо говоря, пока сервер будет обрабатывать строку, все игроки 'зависнут', а за сутки под 100мб чата набегает..
Почему я упёрся в регулярку? тока потому, что она работает вне потока сервера, и пусть она хоть секунду обрабатывается...
DlTA
Отправлено: 30 Апреля, 2013 - 00:40:33
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Но если слов больше и порядок тоже не имеет значения, то таким способом можно задолбаться писать.
Можно сделать так (я напишу на PHP, Вы переведете на свой язык):
preg_match_all('/(дайте|дадите|можно)|(админку|хелперку|хелпера)/', $src, $m);
а потом циклом проверить, чтоб все элементы $m[1] были не пустые.
Что будет работать быстрее - preg_match_all + цикл по совпадниям или цикл со стрпозами - вопрос спорный. Регулярка почти всегда быстрее двух стрпозов (если она выполняет то же самое, что планируется сделать двумя стрпозами). А если матчить точное совпадение, то она сопоставима по скорости со стрпозом.
LIME
Отправлено: 30 Апреля, 2013 - 10:59:35
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Champion пишет:
А если матчить точное совпадение, то она сопоставима по скорости со стрпозом.
как-то тут делали замер
на простейшую регулярку(точное совпадение)
стрпоз в 10 раз быстрее
Champion
Отправлено: 30 Апреля, 2013 - 12:32:23
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Длина строки, время выполнения 1000000 итераций:
1. Искомая строка 5 символов близко к началу
int(3366) double(3.8106479644775) double(3.3490209579468)
2. Искомая строка 5 символов в конце (или вообще отсутствует)
int(3366) double(6.5905828475952) double(3.3512721347809)
3. Искомая строка находится ближе к концу, ее длина 1000 символов
int(3366) double(24.582785129547) double(2.3106808662415).
Последний случай - явление довольно редкое, а вот первые 2 показывают, что стрпоз сопоставим с регуляркой.
LIME
Отправлено: 30 Апреля, 2013 - 13:09:05
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
мэйби
однакож стоит хоть немного усложнить регулярку и посыпется в геометрической прогрессии(это замечание для новичков)
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
EuGen
Отправлено: 30 Апреля, 2013 - 20:06:45
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
А теперь представим, что вариантов с выбором будет не 2, а, например, 4. Или 6 ? В соответствии с числом перестановок количество требуемых вариантов будет расти по факториалу, то есть для 4-х это уже 24, а для 6 - 720 и т.п.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Champion
Отправлено: 30 Апреля, 2013 - 20:41:21
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
LIME пишет:
замеришь против регулярки?
float(3.1662002086639) float(2.857399892807) на короткой строке
float(3.5562990188599) float(2.9403080463409) на длинной
Та таком простеньком регулярка тоже проиграла. Но она удобнее читается)
nerv
Отправлено: 01 Мая, 2013 - 00:04:56
Посетитель
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Помог: 9 раз(а)
EuGen пишет:
А теперь представим
не буду представлять
nerv пишет:
если задачу можно решить без регулярки, ее надо решать без регулярки
давайте понимать это в пределах разумного
Любую задачу связанную с обработкой теста можно решить без регулярки. Однако, регулярные выражения созданы (будем наедятся) с целью упростить решение поставленных задач, зачастую не травильных. И когда я говорю фразу выше, подразумеваю решение с использованием простых строковых функций без нагромождения кода и т.п. Т.е., если задачу можно решить просто, ее надо решать просто. Если нет, регулярные выражения в помощь.
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Dragon_Knight
Отправлено: 01 Мая, 2013 - 03:40:12
Гость
Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012 Откуда: г.Мытищи, МО
Помог: 0 раз(а)
А тема-то разгорелась
Если честно, я пока отказался от этой идеи, но появился чисто спортивный интерес, как-же всётаки такое реализовать, на родной языке, это я про PHP .
Уточню суть задачи: Сделать инструмент, желательно гибкий и простой в обращении, который позволит в строке, набранной человеком, находить определённые группы слов, по которым можно было-бы определить суть текста и соответственно на него отреагировать.
Самое простое что приходит на ум, это взять любую систему антимата и расковырять её, но там есть один нюанс, в нем идёт проверка по одному слову, когда в данной задачи нужно находить несколько ключевых слов.
Иными словами написать некое подобие чат бота, но настроенный на конкретные ключевые слова.
Как пример на конструкцию "(дайте|дадите|можно)&(админку|хелперку|хелпера)" нада послать пользователя на.. форум .
Поиграв с регулярками на сайте: http://rubular[dot]com/ (Кстати, отличный сайт для отладки регулярок), не смог добиться результата, даже приближённо к поставленной задачи.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.