PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
dcc0
Отправлено: 10 Августа, 2016 - 22:57:48
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 996
Дата рег-ции: Июль 2014  


Помог: 7 раз(а)




Есть поиск по базе mysql c помощью LIKE, хотелось бы обрубать окончания русских слов с гласными. Например, пользователь вводит слово "работа" или "работаю", в любом из этих случаев окончания обрубаются.
Пока только крутится такое: сделать транслитерацию ввода, поискать регуляркой символы в конце и отрубить.

Но не слишком ли затратно?
 
 Top
OrmaJever
Отправлено: 11 Августа, 2016 - 00:14:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




есть крутая штука sphinx называется, она умеет делать то что вам надо


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Строитель Модератор
Отправлено: 11 Августа, 2016 - 01:01:19
Post Id



Участник


Покинул форум
Сообщений всего: 1496
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 66 раз(а)




OrmaJever пишет:
есть крутая штука sphinx называется, она умеет делать то что вам надо
Не знаю, будет ли актуальным мой ответ после вашего поста, но раз уж написал код, то опубликую
(Добавление)
dcc0 пишет:
сделать транслитерацию ввода, поискать регуляркой символы в конце и отрубить.
Набросал рекурсивную функцию, она удаляет все гласные в конце слова. Транслит не нужен
PHP:
скопировать код в буфер обмена
  1. function delLastLetter($text) {
  2.     $vowels = ['а','е','ё','и','о','у','ы','ю','я'];
  3.     $chars = preg_split('~~u', $text, -1, PREG_SPLIT_NO_EMPTY);
  4.     !in_array(end($chars), $vowels) ?: $bool = array_pop($chars);
  5.     $out = ($bool ? delLastLetter(join($chars)) : $text);
  6.     return $out;
  7. }
  8.  
  9. echo delLastLetter('Работать'); // Работать
  10. echo delLastLetter('Работаю');  // Работ
  11. echo delLastLetter('Работа');   // Работ

(Отредактировано автором: 11 Августа, 2016 - 01:09:14)



-----
~ PHP-7 & REGEXP - This is a really powerful kit ~
****************************************
 
 Top
dcc0
Отправлено: 11 Августа, 2016 - 10:11:37
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 996
Дата рег-ции: Июль 2014  


Помог: 7 раз(а)




OrmaJever, спасибо, присмотрюсь.

Строитель, благодарю, но я нарочно не просил готовых примеров, так как есть ряд сложностей.
Но все равно спасибо за код.
 
 Top
esterio
Отправлено: 11 Августа, 2016 - 12:04:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




OrmaJever верно подсказал, но если уж так хочется только PHP, то есть Стеммер Портера. Вот первая найденная реализация в гугле https://github[dot]com/NeonXP/Stemmer
 
 Top
dcc0
Отправлено: 11 Августа, 2016 - 13:01:27
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 996
Дата рег-ции: Июль 2014  


Помог: 7 раз(а)




esterio, Sphinx - круто, на даже слишком. Тут не то, чтобы прям на php хочется.
Просто несколько вещей накладывается, хостинг - от hostinger со всякими лимитами (поэтому и был выбран простой LIKE), с другой стороны на этом хостинге немножко придется повозиться с кодировкой.
С третьей стороны - материала не так много и обновляться будет не часто.

Вот и думаю, какие неувязочки могут, если проверять длину слова и обрубать однозначно два символа в конце, например, если длина слова больше 7 символов. Жестоко, но на мой взгляд, достаточно экономно...
(Добавление)
esterio, да, спасибо, очень близко к тому, чего хотелось бы

(Отредактировано автором: 11 Августа, 2016 - 13:02:07)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB