Жигaн
Новичок
Wicked
Честно говоря не вникал в твой алгоритм, т.к. getBaseForm + getAllForms тормозит нещадно . Предлагаю сделать так:
по идее дает результат 1 в 1 с getBaseForm()
Честно говоря не вникал в твой алгоритм, т.к. getBaseForm + getAllForms тормозит нещадно . Предлагаю сделать так:
PHP:
$opts = array(
// Отключим грамтаб, для скорости...
'with_gramtab' => false,
);
$morphy = new phpMorphy(new phpMorphy_FilesBundle($dir, $lang), $opts);
function calc_distrib($ary) {
$result = array();
foreach($ary as $item) {
$cnt = is_array($item) ? count($item) : 0;
if(!isset($result[$cnt])) {
$result[$cnt] = 1;
} else {
$result[$cnt]++;
}
}
ksort($result);
return $result;
}
function prepare_wf_map(phpMorphy $morphy, $words) {
$wfs = $morphy->getAllFormsWithGramInfo($words);
$result = array();
// обходим результат getAllFormsWithGramInfo()
foreach($wfs as $wf_result) {
// Если слово найдено, результат всегда array(), иначе false
if(is_array($wf_result)) {
// каждое слово может иметь несколько интерпретаций
foreach($wf_result as $wf_item) {
// словоформа с 0 индексом - лемма (для getAllForms() неверно!)
$base = $wf_item['forms'][0];
// идем по всем словоформам
foreach($wf_item['forms'] as $wf) {
$result[$wf][$base] = 1; // заносим только уникальные леммы (грамматическая инфа нас не интересует)
}
}
}
}
// восстанавливаем "нормальный" вид для каждого массива лемм
foreach($result as &$bf_ary) {
$bf_ary = array_keys($bf_ary);
}
return $result;
}
// $text - массив слов в windows-1251, uppercase
// $text может содержать дубликаты, на скорости в bulk mode это не сказывается (почти ;) )
// лемматизация по новому методу
$wf_map = prepare_wf_map($morphy, $text);
$bases_1 = array();
foreach($text as $word) {
if(isset($wf_map[$word])) {
$bases_1[$word] = $wf_map[$word];
} else {
$bases_1[$word] = false;
}
}
$bases_2 = $morphy->getBaseForm($text);
var_dump(
calc_distrib($bases_1),
calc_distrib($bases_2)
);
ага, спасибо! пофиксилCatchable fatal error: Argument 3 passed to phpMorphy_Morphier_DictBulk:hpMorphy_Morphier_DictBulk() must implement interface phpMorphy_Morphier_Interface, null given, called in C:\WWWROOT\PhpMorphy\phpmorphy-0.2.3.1\src\common.php on line 318 and defined in C:\WWWROOT\PhpMorphy\phpmorphy-0.2.3.1\src\morphiers.php on line 231