Справочники, инструменты, документация

PHP: Функция склонения слов

Для выделения корня слова или различных словоформ лучше всего воспользоваться PHP - классом phpMorphy, который позволяет выделять корни слов с учетом морфологии русского, английского, украинского, эстонского или немецкого языков.

Словари для каждого языка занимают 10-15 Мб. При этом не требуется устанавливать на сервер дополнительное программное обеспечение, все будет работать на самом обычном хостинге. Недостаток - низкая скрость выделения корня.

$words=urldecode($_GET['word']);

  $path='lib/';

  $words=preg_split('/[^a-zA-Zа-яА-Я0-9]+/u', $words, -1, PREG_SPLIT_NO_EMPTY);

  echo "Результат phpmorphy:";
  // подключаем библиотеку phpmorphy
  $morphy=$path.'phpmorphy/';
  require_once($morphy.'src/common.php');
  $opts = array(
    // PHPMORPHY_STORAGE_FILE - использовать файл
    // PHPMORPHY_STORAGE_SHM - загружать словать в общую память(нужно расширение shmop)
    // PHPMORPHY_STORAGE_MEM - загружать словать в общую память при каждой инициализации phpmorphy
    'storage' => PHPMORPHY_STORAGE_FILE,
    'predict_by_suffix' => true,
    'predict_by_db' => true,
    'graminfo_as_text' => true,
  );
  $morphy = new phpMorphy($morphy.'dicts', 'ru_RU', $opts);


  foreach($words as $i=>$word)
  $words[$i]=strtoupper($word); // в utf-8

  $awords=$morphy->getBaseForm($words);
    echo "\n getBaseForm:<br>Получить начальную форму (Получить нормализованные слова)<br>".arr2str($awords);

  $awords=$morphy->getPseudoRoot($words);
    echo "\n getPseudoRoot:<br>получить корень слова<br>".arr2str($awords);

  // Получить все словоформы
  $awords = $morphy->getAllForms($words);
    echo "\n getAllForms:<br>Получить все словоформы<br>".arr2str($awords);

}

// функция вывода массива
function arr2str($arr,$level=0){
  $str = "array(<br>\n";
  foreach ($arr as $key => $val) {
    if (is_array($val)) {
      $str.=str_repeat("  ",$level)."'".$key."' => " .
    arr2str($val,$level+1) . ",<br>\n";
    }else {
      $str.=str_repeat("  ",$level)."'".$key."' => '<b>" .
    str_replace("'", "\'", $val) . "</b>',<br>\n";
    }
}
return $str . str_repeat("  ",$level).")";
}