За последние 24 часа нас посетили 77839 программистов и 1686 роботов. Сейчас ищут 1047 программистов ...

phpMorphy Положительная степень прилагательного

Тема в разделе "PHP для новичков", создана пользователем виталий032, 18 мар 2018.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Необходимо получить базовую форму слова 'КРАСНЫХ'.
    Так как название товара 'Букет из красных роз', а пользователь ввел 'заказать красные розы'.
    При индексации названия товара, оно разбивается на слова. Слова приводятся к базовой форме и вставляются в отдельную таблицу в бд (`слово`,'id_товара`,`вес`).

    Получаю базовую форму с помощью метода phpMorphy lemmatize().
    PHP:
    1. $words = $this->morphy->lemmatize('КРАСНЫХ');
    Но возвращается массив:
    Код (Text):
    1. Array
    2. (
    3.     [0] => КРАСНЫХ
    4.     [1] => КРАСНЫЙ
    5.     [2] => КРАСНОЕ
    6. )
    Нужное мне слово под индексом "1": красный. Так как я хочу все слова в названии товара привести в ед.ч, им.падеж, муж.род.

    Ладно, подумал я, кастую форму с заданием нужных мне граммем ('ЕД', 'ИМ', 'МР').
    PHP:
    1. $this->morphy->castFormByGramInfo('КРАСНЫХ','П',array('ЕД','ИМ','МР'),TRUE);
    Где 'П' - прилагательное, третий параметр - массив граммем, четвертый - указываем, что хотим получить только преобразованное слово.

    Выдает вот это:
    Код (Text):
    1. Array
    2. (
    3.     [0] => КРАСНЫЙ
    4.     [1] => КРАСНЕЙШИЙ
    5. )
    В документации нет константы (граммемы) для приведения прилагательного к положительной степени сравнения, к превосходной и сравнительной - есть.

    Я выкрутился так (см. ниже).
    PHP:
    1. $words = $this->morphy->lemmatize('КРАСНЫХ');
    2.  
    3.         // проверяем, получено ли несколько базовых форм слова
    4.         if (count($words) > 1) {
    5.             // проверяем является ли слово прилагательным
    6.             $isAdj = in_array('П',$this->morphy->getPartOfSpeech($words[0]));
    7.            
    8.             if ($isAdj) {
    9.                 // получаем слово в ед.числе, имен.падеже, муж.роде
    10.                 $castedWords = $this->morphy->castFormByGramInfo($words[0],'П',array('ЕД','ИМ','МР'),false);
    11.  
    12.                 // пробегаем по массиву, в котором прилагательное в разных степенях сравнения
    13.                 foreach ($castedWords as $word) {
    14.                     // если отсутствует граммема, 'ПРЕВ' - превосходная степень,
    15.                     // то показываем это слово
    16.                     if (!in_array('ПРЕВ',$word['grammems'])) {
    17.                         echo $word['form'];
    18.                     }
    19.                 }
    20.             }
    21.         } else {
    22.             echo $words[0];
    23.         }
    Вообщем, подскажите, может есть другой способ индексации слов/приведения слов к начальной форме или этот способ никуда не годится?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мы пхпшники в основном сайтики клепаем
    а слова не приводим =(
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Но интеллектуальный поиск на сайте это же один из главных вещей для каждого магазина. И это же относится к задачам backend-разработчика (php, java, python).
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768