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

Tihom

Новичок
Кстати, спасибо! Вы меня натолкнули на мысль, что нужно индексировать не только лемму (или псевдокорень), но и слово целиком, тогда в результатах поиска по слову "красивая" сначала будут идти те записи, где это слово встречается именно в такой форме, а потом уже "красивый", "красивой", "красивые" и т.п.
Не за что, обращайтесь)
А про дополнение словаря - где-то в этой ветке, если не ошибаюсь, что такая возможность существует, но, к сожалению, только для АОТ-словаря... Да и как утверждает разработчик лемматайзера - АОТовский словарь более полный, нежели испеловский, поэтому и рекомендуется использовать в качестве основного именно АОТ.
Хотя мне самому больше нравится испел, и к аот прибегаю только в крайних случаях, если вижу, что для конкретной задачи он работает корректнее.
 

spooky

Новичок
здравствуйте!
возможно, я полный нуб, но у меня проблема.
скачал phpmorphy-0.3.7, morphy-0.3.x-ru_RU-withjo-ispell-utf-8
написал:
Код:
error_reporting(E_ALL | E_STRICT);
require_once('./tm2/src/common.php');
$dir = './tm2/dicts';
$lang = 'ru_RU';
$opts = array(
	'storage' => PHPMORPHY_STORAGE_FILE,
	// Extend graminfo for getAllFormsWithGramInfo method call
	'with_gramtab' => true,
	// Enable prediction by suffix
	'predict_by_suffix' => true, 
	// Enable prediction by prefix
	'predict_by_db' => true
        //'graminfo_as_text' => false,
        //'resolve_ancode' => phpMorphy::RESOLVE_ANCODES_AS_INT
);
try {
    $morphy = new phpMorphy($dir, $lang, $opts);
} catch(phpMorphy_Exception $e) {
    die('Error occured while creating phpMorphy instance: ' . $e->getMessage());
}

try {

$word_one = 'ТЕСТ';
$part_of_speech=$morphy->getPartOfSpeech($word_one);
echo $part_of_speech[0];
И получаю вместо "С" - "UNKNOWN".
Посмотрел файлы gramtab.ru_ru.bin и gramtab_txt.ru_ru.bin - там действительно UNKNOWN, и они значительно меньше и отличаются от файлов словаря АОТ.
Однако если заменить на АОТ, полетит всё, глаголы будут существительными и т.д. (естесственно, карта другая, словарь другой и т.д.)

В чём может быть проблема и как добиться определения части речи и другой грамматической информации?
 

Tihom

Новичок
spooky, читайте внимательно документацию
Метод $morphy->getPartOfSpeech($word_one) работает только со словарем АОТ, в словаре ISPELL не содержится сведений о части речи слова, а Вы используете как раз словарь от ISPELL
Скачайте словарь АОТ, с ним все работает нормально, конечно за очень редким исключением (сам сталкивался, но это реально единичные случаи, на которые можно закрыть глаза).
 

spooky

Новичок
Спасибо!
Но т.к. хостинг не позволяет закачивать файлы больше 4 мб, мне надо или искать другой хостинг, или другой скрипт, который определяет части речи.
 

Tihom

Новичок
10 января разработчики проекта АОТ выпустили новую версию своего лемматайзера.
http://aot.ru/download.php
Вопрос к разработчику PHPMorphy: возможно ли обновить словари для PHPMorphy, доступные на SF, ибо, как понимаю, АОТ в них тоже внес некоторые изменения?
 

Tihom

Новичок
Получается, АОТ выпустили новую версию только оболочки... жаль(
 

Dmitr

Новичок
Сори за нубовский вопрос, надо получить из слова к примеру "Москва" -> в "Москве" (Предложный падеж)
$morphy->getAllForms(); - выводит всё вподряд, как опредеённый падеж получить?

Нужен нубомануал)
 

Жигaн

Новичок
Попробуй так
PHP:
$word = 'МОСКВА';
$paradigms = $morphy->findWord($word);

if(false !== $paradigms) {
    // омонимы
    foreach($paradigms as $paradigm) {
        $word_forms = $paradigm->getWordFormsByGrammems('ПР');
        
        // некоторые слова имеют несколько форм для одного падежа
        foreach($word_forms as $form) {
            $word = $form->getWord();
            var_dump($word);
        }
    }
}
 

Vladzimir

Новичок
Кто нибудь ПОДРОБНО расскажет как самому собрать словари из ispell-овских?
 

Жигaн

Новичок
Vladzimir

Ок, рассказываю подробно.
1) Вам понадобятся словари в myspell (hunspell тоже подходят) формате. Скачать их можно отсюда http://wiki.services.openoffice.org/wiki/Dictionaries, брать нужно Spelling словари.
2) Скачиваем http://sourceforge.net/projects/phpmorphy/files/phpmorphy-buildsystem/0.3.x/morphy-0.3.1-win32.zip/download и распаковываем в c:/phpmorphy-bs/
3) Скачиваем саму либу (http://sourceforge.net/projects/phpmorphy/files/phpmorphy/0.3.7/phpmorphy-0.3.7.zip/download) и распаковываем в c:/phpmorphy-bs/lib
4) Создаем переменную окружения MORPHY_DIR=c:/phpmorphy-bs
5) Создаем переменную окружения PHPRC=путь_где_лежит_пхп, т.е. команда %PHPRC%/php -v должна отработать
5) Скачиваем нужные словари (см п.1) и распаковываем их в c:/tmp/hunspell-dicts, нам понадобятся два файла с расширением .dic и .aff, пусть это будут ru_RU_yo.aff и ru_RU_yo.dic
6) cd c:/tmp/hunspell-dicts
7) Конвертим hunspell словари в xml формат: c:/phpmorphy-bs/bin/hun2xml.exe --affix ru_RU_yo.aff --dict ru_RU_yo.dic --locale ru_RU --xml=ru_RU.xml --verbose. Если все прошло нормально получим файл ru_RU.xml
8) mkdir out
9) Компилируем бинарный словарь из ru_RU.xml: c:/phpmorphy-bs/lib/bin/build_dict ru_RU.xml out utf-8 1 1
10) Если п.9 выполнился без ошибок, в каталоге c:/tmp/hunspell-dicts/out будет лежать готовый словарь.
 

Vladzimir

Новичок
4) Создаем переменную окружения MORPHY_DIR=c:/phpmorphy-bs
5) Создаем переменную окружения PHPRC=путь_где_лежит_пхп, т.е. команда %PHPRC%/php -v должна отработать
А вот с этого момента можно поподробнее. Где создаем и как.
 

Жигaн

Новичок
Проще всего сделать так:
1) запускаем cmd.exe: Win+r => cmd => enter
2) set MORPHY_DIR=c:/phpmorphy-bs
3) set PHPRC=путь_где_лежит_пхп
4) проверяем set MORPHY_DIR => "MORPHY_DIR=c:/phpmorphy-bs"
5) %phprc%/php -v

п.2+п.3 можно оформить в виде .cmd файла
 

Farsh

~ on ~ high ~ wave ~
Жигaн
Добрый день!

Берем слово, например, "флешка".
phpMorphy нашел для этого слова одну парадигму, в мужском роде.
Сервис от aot.ru нашел две парадигмы, и одна из них в женском роде, как и ожидается.

В чем тут проблема ?
Заранее спасибо!
 

Жигaн

Новичок
Farsh
Проблемы здесь нет. Алгоритм построения гипотез для неизвестных слов основан на стат. данных. В зависимости от настроек, результат может немного изменяться.
 

vasyap

Новичок
Жигaн
насколько я понимаю, статистические данные заложены в словари (в том числе), словари мы используем одинаковые с АОТ (вчера сам скомпилировал последнюю версию словаря из транка), какие насторойки нужно покрутить, чтобы слово "ФЛЕШКА" стало словом женского рода именительного падежа?
 

Жигaн

Новичок
vasyap
Извини, сейчас времени совсем нет.
Конкретно с "флешкой" проблема в том, что алгоритм построения словаря для предсказания, в некоторых случаях имеет неопределенное поведение (результат зависит от порядка обхода лемм в словаре). В силу использования разных струкур данных у меня и в коде аот, результат отличается. Мой вариант предсказывает слово "флешка" по "алешка", у аот по "плешка", хотя это простое везение. В целом, проще добавить слово в словарь с помощью MorphWizard, затем с помощью phpmorphy/bin/mrd2xml.php сконвертить mrd файл в xml и скомпилить из xml бинарный словарь. Я несколько страниц назад вроде писал уже как эот сделать.
 

Wicked

Новичок
Оставлю рецепт в том числе для себя, чтобы не забыть.
Чтобы запустить morphwizard ( http://aot.ru/download.php ) под убунтой, делаем следующее:
$ sudo localedef -c -i ru_RU -f UTF-8 ru_RU.UTF-8
$ LANG=ru_RU.utf8 wine Morphwizard.exe

Вроде ищет теперь нормально, но в реальной работе еще не проверял. Надеюсь, что получится потом добавленную инфу использовать в pymorphy без особых приседаний благодаря http://packages.python.org/pymorphy/ref/storage_backends.html#mrd .

Жиган, и я правильно понимаю, что mrd2xml.php и "скомпилить из xml бинарный словарь" - будут работать только под виндой?
 
  • Like
Реакции: AmdY
Сверху