Морфологическая библиотека PHPMorphy
Не так давно по работе столкнулся с задачей разбора морфологии слов, учитывая что русская морфология довольно сложная, то писать свой скрипт я не видел смысла и считаю это было бы не рационально. Недолгие поиски привели меня к библиотеки PhPMorhy (http://sourceforge.net/projects/phpmorphy/), в данной статье я хотел бы немного описать эту библиотеку.
Итак, библиотека состоит из php классов, и отдельно подключаемыми словарями. На сайте библиотеки можно скачать словари для русского(Windows-1251 и UTF-8), английского, немецкого, украинского, эстонского языков. Словари основываются на aot и ispell словарях.
Что же умеет эта библиотека? Для начала хотел обратить внимание что можно получить корень слова, морфологические формы слова, определение частей речи, грамматические формы. Я думаю многие разработчики понимают пользу таких преобразований, например, есть возможность улучшить поиск в своей системе, если получать корень слова и искать уже по нему. В данном случае моя задача состояла сбор анкоров в СЕО системе, учитывая морфологию слов.
Данная библиотека имеет разные режимы работы, которые могут влиять на скорость загрузки и обработки данных. Так как словари весят от 6 до 15мб, то есть возможность частичной подгрузки словарей. Минус библиотеки состоит в том что нельзя подгрузить сразу 2 и более словарей, к примеру что бы проверять словосочетания: игры online. Так же с кодировками, нужно запрашивать слова в той кодировке что и словарь. Все слова должны быть написаны в ВЕРХНЕМ регистре. Для получения информации о словосочетании вам придется разделать его на массив. Все слова так же будут выданы в массиве, даже если было все одно слово, на выходе вы получите многотомный массив.
Вот небольшой пример использования кода:
$keywords = mb_convert_case($row['keywords'], MB_CASE_UPPER, "UTF-8"); $list_keywords = explode(" ", str_replace("-"," ", $keywords)); foreach($list_keywords as $word){ if(!empty($word) && $word!=''){ if(eregi("[a-zA-z]", $word)){ $eng[] = $word; }else{$rus[] = $word;} } }unset($keywords); $keywords = array(); if(isset($rus) && !empty($rus)){ $morphyRUS = new phpMorphy($dir, 'ru_ru', array('storage' => PHPMORPHY_STORAGE_FILE)); array_add($keywords, $morphyRUS->getPseudoRoot($rus)); } if(isset($eng) && !empty($eng)){ $morphyENG = new phpMorphy($dir, 'en_en', array('storage' => PHPMORPHY_STORAGE_FILE)); array_add($keywords, $morphyENG->getPseudoRoot($eng)); }
Функция array_add в данном случае делает однотомный массив и склеивает русские и английские словоформы.
Если слова нет в словаре, то он возвращает пустой массив.
Станьте первым!