Для выделения корня слова или различных словоформ лучше всего воспользоваться PHP - классом phpMorphy, который позволяет выделять корни слов с учетом морфологии русского, английского, украинского, эстонского или немецкого языков. Словари для каждого языка занимают 10-15 Мб. При этом не требуется устанавливать на сервер дополнительное программное обеспечение, все будет работать на самом обычном хостинге. Недостаток - низкая скрость выделения корня.
<?php
$words=urldecode($_GET['word']);
$path='lib/';
$words=preg_split('/[^a-zA-Zа-яА-Я0-9]+/', $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]=iconv('windows-1251', $morphy->getEncoding(), strtoupper($word)); // в utf-8
$awords=$morphy->getBaseForm($words);
echo "<br> <br>\ngetBaseForm:<br>Получить начальную форму (Получить нормализованные слова)<br>".arr2str($awords);
$awords=$morphy->getPseudoRoot($words);
echo "<br> <br>\ngetPseudoRoot:<br>получить корень слова<br>".arr2str($awords);
// Получить все словоформы
$awords = $morphy->getAllForms($words);
echo "<br> <br>\ngetAllForms:<br>Получить все словоформы<br>".arr2str($awords);
}
// функция вывода массива с преобразованием из utf-8 в windows-1251
function arr2str($arr,$level=0){
$str = "array(<br>\n";
foreach ($arr as $key => $val) {
if (is_array($val)) {
$str.=str_repeat(" ",$level)."'".iconv( 'utf-8', 'windows-1251',$key)."' => " .
arr2str($val,$level+1) . ",<br>\n";
}else {
$str.=str_repeat(" ",$level)."'".iconv( 'utf-8', 'windows-1251',$key)."' => '<b>" .
str_replace("'", "\'", iconv( 'utf-8', 'windows-1251',$val)) . "</b>',<br>\n";
}
}
return $str . str_repeat(" ",$level).")";
}
?>Скопировать в буфер
Пример использования склонятора имен и ников от яндекса
Пример создания поиска по своему сайту с учетом морфологии русского языка
© Copyright 2008-2012 by KDG