Русская морфология

Wicked

Новичок
и вообще, Вам следует куда более критично относиться к своему коду. А то советовать Вы его советуете, но на деле он зачастую оказывается, бессмысленным и/или некачественным.

-~{}~ 07.06.08 22:14:

Тесты скорости, кстати, реальные или это оценка?
я позволил себе поверить Cal'у Henderson'у на [печатное] слово
 

Rin

*
офф-топ конечно пошёл, но

Wicked:
>А то советовать Вы его советуете, но на деле он зачастую оказывается, бессмысленным и/или некачественным.

А Вам бы следовало быть сдержаннее.
Вы нашли место, где можно соптимизировать вот и всё.
То, что код оказался в 20 раз медленнее (верим на слово Cal'у Henderson'у) не означает, что он некачественный и уж тем более бессмысленный (!).
Хочу заметить, что функции работают без iconv, они изначально расчитаны на это.
За предложение по оптимизации спасибо.

-~{}~ 07.06.08 21:51:

Надеюсь, книга Николая Козлова "Как относиться к себе и людям" в представлении не нуждается.
 

Жигaн

Новичок
Rin
Слияние нескольких словарей в один создаст проблему с предсказанием. Суть в том, что словообразование в разных языках происходит по-разному, потому необходимо явно указать язык или будет порождено слово по правилам (потенциально) любого языка из словаря. По любому оно того не стоит. Производительности это сильно не прибавит т.к. отсечение слов отсутствующих в словаре происходит на ранней стадии и оверхед не очень большой.
А зачем тебе снимать омонимию? Для поиска, это может привести к нехорошим последствиям (что будет, если откинем верный вариант?).

Насчет utf-8 Wicked все сказал. В юникоде кириллическим символам присвоены codepoint`ы 0x400 - 0x4FF в utf-8 они кодируются как двухбайтные последовательности (соотв. 1 символ = 2 байта). Т.к. скорость поиска зависит от длины строки, то скорость поиска в словаре снизится в два раза, общая скорость поменьше конечно.

phprus
Да, в узле дерева хранится один байт. В принципе ничто не мешает засунуть туда любые данные, к примеру для поддержки utf-16 в узле будет храниться два байта(больше сделать сложнее, т.к. придется использовать т.н. опорную кодировку, чего я делать не хочу). utf-8 строка по любому интерпретируется как массив байтов.. Честно говоря, я не знаю, откуда может взяться utf-16 в вебе? Имхо актуальность utf-16 возникнет, когда прикрутят icu к php (там внутренняя кодировка utf-16). Вообще идея в том, чтобы искать строку без перекодирования (т.е. подготовить словарь в нужной кодировке и работать с ним без издержек на перекодирование)

В языке-же базовый (слово не очень удачное, но другое подобрать не могу) элемент - это символ, а не байт.
Это смотря где ;). По любому каждый символ надо как-то надо кодировать.

С юникодом возникнет еще проблема - нормализация. Что с этим делать я не знаю..

berkut
Похоже слово предсказывается по известному окончанию,
Constanza:
отсекаем Con, в словаре слово stanza есть. Используем модель словообразования как у stanza. Con - это приставка ;). Вообще getPseudoRoot возвращает longest common substring (почти всегда =]) для множества словоформ слова.
 

berkut

Новичок
хмм.. а с почему con в английском языке является приставкой? можно пару примеров?
 

Rin

*
Жигaн:
>С юникодом возникнет еще проблема - нормализация. Что с этим делать я не знаю..

Класс морфологии должен выполнять свои функции, а не заботиться о нормализации юникода. Можно просто предъявить требования: "normal form C, canonical composition".

Для нормализации можно использовать готовый класс из МедиаВики (mediawiki.org), см. файл \mediawiki-1.12.0\includes\normal\UtfNormal.php

-~{}~ 08.06.08 21:42:

Жигaн
>А зачем тебе снимать омонимию? Для поиска, это может привести к нехорошим последствиям (что будет, если откинем верный вариант?).

Как раз наоборот, иначе Яндекс не стал бы решать эту проблему. После снятия омонимии результат поиска становится более релевантным.

-~{}~ 08.06.08 21:55:

Жигaн
>Слияние нескольких словарей в один создаст проблему с предсказанием.

Знание об используемых в тексте языках и приоритетах здесь не поможет?
В случае ru и en всё однозначно -- символьных пересечений нет.
В случае языковых коллизий использовать предсказание для более приоритетного языка.
 

andreypaa

Новичок
Подскажите, что делаю не так.
Использую следующий код:
$all_forms_with_gram = $morphy->getAllFormsWithGramInfo( strtoupper($word) );
и у меня в полученном массиве ['all'] элементы находятся в непонятном ввиде string(4) "щрщс" в место к примеру string(10) "С мр,мн,дт"
т.е. получить информацию об орфографии невозможно.
В чем может быть проблема?
вот это: $codepage = $morphy->getCodepage(); выдает следующую строчку: ussian�cp1251
 

Жигaн

Новичок
Укажи ключ with_gramtab в опциях. т.е.

PHP:
$opts = array(..., 'with_gramtab' => true);
$morphy = new phpMorphy(..., $opts);
 

andreypaa

Новичок
Все дело в том, что этот ключ указан. Пока проблему решил, установив не самую последнюю, а предыдущую версию данной библиотеки. Там все работает как надо.
 

Жигaн

Новичок
О, спасибо! Пока у меня не работает sf.net, можешь пропатчить так:
файл src/common.php line 177

заменить
PHP:
			if(0) {
				$this->single_morphier = $this->createGramTabMorphier(
					$single_morphier,
					$this->gramtab
				);
			} else {
				$this->single_morphier = $single_morphier;
			}
на

PHP:
				$this->single_morphier = $this->createGramTabMorphier(
					$single_morphier,
					$this->gramtab
				);
или if(0) на if(1)
 

andreypaa

Новичок
Жигaн, спасибо за исправление ошибки.
На sf.net библиотеку еще не обновили?
 

Farsh

~ on ~ high ~ wave ~
Усе, я окончательно заколебался , пытаясь подстроить морфологизатор от AOT к PHP . Беру phpmorphy )
Но возник вопрос - проблема с рус символами и выводом тип форм даже с установкой локали LC_ALL ru_RU.CP1251 .
Например ,
$morphy->getAllFormsWithGramInfo('РЕБЕНКА') выдает ключ 'all' :
["all"]=>
array(10) {
[0]=>
string(2) "аа"
[1]=>
string(4) "абаг"
[2]=>
string(2) "ав"
[3]=>
string(2) "ад"
[4]=>
string(2) "ае"
[5]=>
string(2) "аж"
[6]=>
string(4) "азай"
[7]=>
string(2) "аи"
[8]=>
string(2) "ак"
[9]=>
string(2) "ал"
}
В чем может быть проблема ?
 

Жигaн

Новичок
Ух, долго я ломился на upload.sourceforge.net ;), теперь понял в чем дело было. Залил версию 0.2.5. Всем спасибо!
 

Sepuka

Новичок
Жигaн
Может я конечно и олень, но не понимаю следующее:

Warning: file_get_contents(phpmorphy/dicts/common_aut.rus.bin): failed to open stream: No such file or directory in /var/www/***/data/www/***/phpmorphy/src/storage.php on line 79

Fatal error: Uncaught exception 'phpMorphy_Exception' with message 'Can`t read phpmorphy/dicts/common_aut.rus.bin file' in /var/www/***/data/www/***/phpmorphy/src/storage.php:80
Stack trace:
#0 /var/www/***/data/www/***/phpmorphy/src/storage.php(14): phpMorphy_Storage_Mem->open('phpmorphy/dicts...')
#1 /var/www/***/data/www/***/phpmorphy/src/storage.php(30): phpMorphy_Storage->phpMorphy_Storage('phpmorphy/dicts...')
#2 /var/www/***/data/www/***/phpmorphy/src/common.php(315): phpMorphy_Storage::create('mem', 'phpmorphy/dicts...')
#3 /var/www/***/data/www/***/phpmorphy/src/common.php(110): phpMorphy->createStorage('mem', 'phpmorphy/dicts...')
#4 /var/www/***/data/www/***/txt2keywordsmorphy.php(32): phpMorphy->phpMorphy(Object(phpMorphy_FilesBundle), Array)
#5 /var/www/***/data/www/***/txt2keywordsmorphy.php(109): Words2BaseForm_rus()
#6 {main}
thrown in /var/www/***/data/www/***/phpmorphy/src/storage.php on line 80

а вот английский словарь открывает. Это на хостинге, на локалхосте все работает. Да и на старом хостинге работало, а на этом не открывает.
 
Сверху