— женское имя?emma: ЦВЕТА
ЦВЕТЫ С (ДФСТ, ЕД, ЖР, ИМЯ, ОД, РД)
ЦВЕТЫ С (ДФСТ, ЖР, ИМ, ИМЯ, МН, ОД)
<?php
/**
* @see phpMorphy
*/
require_once(dirname(__FILE__).'/phpmorphy/src/common.php');
/**
* Обвёрка для библиотеки phpMorphy.
*/
class morphy extends phpMorphy {
/**
* Определение класса morphy.
*
* @param void
* @return void
*/
public function __construct(){
$dicts = dirname(__FILE__).'/phpmorphy/dicts';
$lang = 'ru_RU';
$opts = array(
'storage' => PHPMORPHY_STORAGE_MEM,
'predict_by_suffix' => FALSE,
'predict_by_db' => FALSE,
'graminfo_as_text' => TRUE,
'use_ancodes_cache' => TRUE,
'resolve_ancodes' => RESOLVE_ANCODES_AS_TEXT
);
parent::__construct($dicts,$lang,$opts);
unset($dicts,$lang,$opts);
}
/**
* Ставит второе слово в туже форму что и первое.
*
* @param string $original Входное слово.
* @param string $editable Изменяемое слово.
* @param bool $strict
* @return bool
*/
public function modifier($original,$editable,$strict=false){
// найти слова
$co = parent::findWord($original);
$ce = parent::findWord($editable);
// если слова не найдены, то прекратить выолнение
if($co === false or $ce === false) return false;
// пройтись по колекции орегинального слова
foreach($co as $des){
// найти формы слова
foreach($des->getFoundWordForm() as $form){
$gram = $form->getGrammems();
$part = $form->getPartOfSpeech();
foreach($ce->getByPartOfSpeech($part) as $desr){
$search = $desr->getWordFormsByGrammems($gram[3]);
print_r($search);
}
}
}
}
}
// EXAMPLE
$m = new morphy();
$res = $m->modifier('ЧАЙНИКОМ','ЛОПАТА');
print_r($res);
?>
// Входное слово
Array
(
[0] => ЕД
[1] => МР
[2] => НО
[3] => ТВ
)
// Изменяемое слово
Array
(
[0] => phpMorphy_WordForm Object
(
[word:protected] => ЛОПАТОЙ
[form_no:protected] => 7
[pos_id:protected] => С
[grammems:protected] => Array
(
[0] => ЕД
[1] => ЖР
[2] => НО
[3] => ТВ
)
)
[1] => phpMorphy_WordForm Object
(
[word:protected] => ЛОПАТОЮ
[form_no:protected] => 8
[pos_id:protected] => С
[grammems:protected] => Array
(
[0] => ЕД
[1] => ЖР
[2] => НО
[3] => ТВ
)
)
[2] => phpMorphy_WordForm Object
(
[word:protected] => ЛОПАТАМИ
[form_no:protected] => 11
[pos_id:protected] => С
[grammems:protected] => Array
(
[0] => ЖР
[1] => МН
[2] => НО
[3] => ТВ
)
)
)
тут же хочется вытащить из первого массива падеж и число, и найти слово только по ним, но тип грам. инфа скачет в массиве.ЧАЙНИКОМ::ЛОПАТОЙ
ЧАЙНИКОМ::ЛОПАТОЮ
ЧАЙНИКОМ::ЛОПАТАМИ
[grammems:protected] => Array
(
[0] => ЖР
[1] => МН
[2] => НО
[3] => ТВ
)
Array
(
[0] => ЕД
[1] => МР
[2] => НО
[3] => ТВ
)
Почти подходит, но было бы удобнее, указывать не исключение, а грамемы по которым сравнивать, тоесть только по падежу и числу или только по лицу если глагол, это нужно, например, чтобы находить общий падеж между прилагательными и существительными.getGrammemsProvider()
$morphy = new phpMorphy($dict_bundle, $opts);
$x = "Лестницы кирпичи Цементный шпатель двигаться идти шпинат ребенок молоко";
preg_match_all('/([a-zA-Zа-яА-ЯёЁ]+)/ui', $x, $ok);
for($i=0; $i<count($ok[1]); $i++)
$bulk_words[] = iconv("UTF-8", "CP1251", mb_strtoupper($ok[1][$i], "utf-8"));
$pseudo_root = $morphy->getPseudoRoot($bulk_words);
foreach($pseudo_root as $root)
$roots[] = iconv("CP1251", "UTF-8", $root[0]);