пʼятниця, 5 лютого 2010 р.

Морфологическая библиотека 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 в данном случае делает однотомный массив и склеивает русские и английские словоформы.

Если слова нет в словаре, то он возвращает пустой массив.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments