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

Заметил, что обсуждаемая библиотека обновилась до версии 0.3
из чейнжлога:

Changes with phpMorphy 0.3.0 02 Apr 2009
*) new dictionaries format
*) mutliencoding support(need dictionary compilation)
*) added functionality for control of prediction process
*) new enhanced API for deep analisys
*) new query: getPartOfSpeech()
*) rewritten shared memory cache code
 
Автор оригинала: Rin
morphy-0.3.x-ru_RU-nojo-utf8.zip 4,606 KB
morphy-0.3.x-ru_RU-nojo-utf8.7z 3,131 KB

:)
Не жадничай! ;)

-~{}~ 08.04.09 03:47:

Изменения в версии 0.3.0:

Поддерживаются кодировки отличные от windows-1251, в частности utf-8 (можно собрать словарь в любой кодировке, поддерживаемой icu)
-------

Изменил код для shared memory: используется один сегмент для всех файлов.

Опции для shm задаются при инициализации:
$opts = array(
:
'shm' => array(
'semaphore_key' => PHPMORPHY_SEMAPHORE_KEY, // id для семафора
'segment_id' => PHPMORPHY_SHM_SEGMENT_ID, // id для сегмента
'segment_size' => PHPMORPHY_SHM_SEGMENT_SIZE, // размер сегмента, по умолчанию 24Mb
'with_mtime' => false, // автоматически перегружать изменившиеся файлы
'header_max_size' => PHPMORPHY_SHM_HEADER_MAX_SIZE, // если ловим exception с 'Too long header ..' надо увеличить значение (по умолчанию 32Kb)
'no_lock' => false, // не использовать блокировку (если true => могут возникнуть проблемы при обновлении словарей)
)

); --- это значения по умолчанию. Можно менять параметры определяя соответствующие константы.
В принципе, кроме segment_size, ничего менять не надо.
-------

Добавил метод getPartOfSpeech, который позволяет получить часть речи для заданного слова (возвращает как обычно массив, из-за омонимии).
-------

Сделал нормальный интерфейс для получения грамматических характеристик. К примеру, получим родительный падеж множественного числа для существительного.

$word = 'ТЕСТ';

if(false === ($collection = $morphy->findWord($word))) {
// error
die("$word not found");
}

$result = array();
foreach($collection->getByPartOfSpeech('С') as $paradigm) {
foreach($paradigm->getWordFormsByGrammems(array('МН', 'РД')) as $form) {
$result[] = $form->getWord();
}
}

var_dump($word, $result);
/*
string(4) "ТЕСТ"
array(2) {
[0]=>
string(6) "ТЕСТОВ"
[1]=>
string(4) "ТЕСТ"
}
*/

-------

Появилась возмонжость контролировать процесс предсказания:
$morphy->getBaseForm('', phpMorphy:: NORMAL); // обычное поведение: поиск в словаре, потом предсказание
$morphy->getBaseForm('', phpMorphy:: IGNORE_PREDICT); // только поиск в словаре
$morphy->getBaseForm('', phpMorphy:: ONLY_PREDICT); // только предсказание

$morphy->isLastPredicted() вернет true если слово было предсказано

-------
Сделал утилиту для конвертации myspell словников в словарь для phpMorphy hun2xml
Опции:
--affix файл аффиксов myspell
--dict словарь myspell
--xml результат
--locale ru_RU, uk_UA и т.п.

на выходе получим xml файл, далее нужно его скомпилировать:

1) качаем последний phpmorphy-buildsystem https://sourceforge.net/project/showfiles.php?group_id=192189&package_id=266784
2) распаковываем в какую-нибудь директорию, к примеру c:\tmp\phpmorphy
3) устанавливаем переменную окружения MORPHY_DIR в c:\tmp\phpmorphy
4) устанавливаем переменную PHPRC - путь к директории php (%PHPRC%\php должен запускать CLI версию php)
5) переходим в директорию phpmorphy-0.3.x/bin, запускаем build_dict.bat

build_dict.bat XML_FILE OUT_DIR ENCODING

XML_FILE - файл, которые получили от hun2xml
OUT_DIR - директория куда попадет словарь
ENCODING - кодировка

Словари есть тут http://wiki.services.openoffice.org/wiki/Dictionaries
-------

Есть еще некоторые изменения, но это уже мелочи.
 
Спасибо за классную библиотеку!

Скачал последнюю версию. Пара вопросов.

1) Куда делся словарь для немецкого?

2) Слово "КУДА". Все его формы, полученные с помощтю getAllFormsWithGramInfo:
Код:
array (
  0 => 
  array (
    'forms' => 
    array (
      0 => 'КУДА',
      1 => 'КУДЫ',
      2 => 'КУДЕ',
      3 => 'КУДЕ',
      4 => 'КУДУ',
      5 => 'КУДОЙ',
      6 => 'КУДОЮ',
    ),
    'all' => 
    array (
      0 => 'С ДФСТ,ЕД,ЖР,ИМ,ЛОК,НО',
      1 => 'С ДФСТ,ЕД,ЖР,ЛОК,НО,РД',
      2 => 'С ДТ,ДФСТ,ЕД,ЖР,ЛОК,НО',
      3 => 'С ДФСТ,ЕД,ЖР,ЛОК,НО,ПР',
      4 => 'С ВН,ДФСТ,ЕД,ЖР,ЛОК,НО',
      5 => 'С ДФСТ,ЕД,ЖР,ЛОК,НО,ТВ',
      6 => 'С ДФСТ,ЕД,ЖР,ЛОК,НО,ТВ',
    ),
    'common' => '',
  ),
  1 => 
  array (
    'forms' => 
    array (
      0 => 'КУДА',
    ),
    'all' => 
    array (
      0 => 'Н ВОПР',
    ),
    'common' => '',
  ),
)
Откуда здесь взялась форма существительного?

-~{}~ 05.05.09 02:05:

Где взять расшифровку числовых кодов, которые выдаются функцией getAllFormsWithGramInfo, когда опция graminfo_as_text установлена в false?
 
1) Забыл, честно говоря. Сейчас соберу.

2) Хм, прикольно. Судя по ЛОК граммеме это топоним какой-то. Типа река кУда. Думаю, удалять эту лексему из словаря не стоит.

p.s.
getAllFormsWithGramInfo() я оставил для обратной совместимости и для отладки. Используй findWord метод. Кстати, getAllFormsWithGramInfo реализовано через findWord

3) смотри в src/gramtab_consts.php, там определны константы для русского, английского и немецкого языков. Имена констант состоят из следующих токенов

PMY_ - общий префикс для всех констант
--
R - для русского
E - для английского
G - для немецкого
--
P - part of speech - часть речи
G - граммема
--
_
--
имя

примерно так
т.е.
PMY_RP_NOUN - часть речи, существительное для русского
PMY_EP_NOUN - часть речи, существительное для английского

PMY_RG_LOCATIV - граммема локативности (ЛОК) для русского
PMY_EG_INFINITIVE - граммема инфинитива для английского и т.п.

подгружать gramtab_consts.php не нужно, он подхватывается автоматом при graminfo_as_text = false.
 
1) Чем getAllFormsWithGramInfo хуже нового метода findWord?

2) Где взять список расшифровки грамем?

3) Надо ли заменять букву 'Ё' на 'Е' в словах перед вызовом функций? (Заметил, что слова 'ВСЁ' и 'ЕЩЁ' в словаре отсутствуют).
 
добавил словари:
1) немецкий utf-8, windows-1252
2) украинский (сконвертил из ispell), utf-8

-~{}~ 05.05.09 01:59:

1) тебе ведь придется парсить массив от getAllFormsWithGramInfo(). Покажи, что ты хочешь сделать, 100% findWord будет удобнее.

2)
http://www.aot.ru/docs/rusmorph.html
http://www.aot.ru/docs/engmorph.html

3)
исходники словарей:
morphy-source-ru_RU-nojo.zip - словарь без Ё
morphy-source-ru_RU.zip - словарь с Ё

бинарные словари я выложил без Ё
morphy-0.3.x-ru_RU-nojo-utf8.zip
morphy-0.3.x-ru_RU-nojo-windows-1251.zip

если нужна Ё собери из morphy-source-ru_RU.zip
 
Спасибо!

Ты случайно не знаешь, где можно взять частотные словари русского и английского языков?
 
Слово "ВИДЕО"
Код:
array (
  0 => 
  array (
    'forms' => 
    array (
      0 => 'ВИДЕО',
    ),
    'all' => 
    array (
      0 => 'Н ',
    ),
    'common' => '',
  ),
  1 => 
  array (
    'forms' => 
    array (
      0 => 'ВИДЕО',
    ),
    'all' => 
    array (
      0 => 'С 0,НО,СР',
    ),
    'common' => '',
  ),
)
Откуда тут форма наречия?

-~{}~ 05.05.09 05:48:

Частотный словарь - я имел ввиду список слов (м.б. приведенных к нормальной форме) с указанием частоты употребления.
 
это скорее всего баг, хотя может быть нарчеие было введено для обработки "кривых" сочетаний типа "видео фильмы", "видео записи". спрошу на форуме aot.
 
Наверное, так:
Код:
$baseform = $morphy->getBaseForm($word, phpMorphy::IGNORE_PREDICT);
if (false === $baseform) {	
   echo $word, " NOT FOUND";
 
спасибо

парсю российский интернет, пока напарсил 100 000 доменов

брал у каждого домена 8 страниц и извлекал ключевые слова и абзацы

в среднем при такой системе на домен уходит 4кб данных

осталось еще около 900 000 напарсить и можно будет для чего-нибудь использовать
 
Уважаемый Жигaн.
Я только сейчас попал на этот форум. Очень интересует Ваш модуль.
Закачал
morphy-0.3.x-ru_RU-nojo-utf8.zip и phpmorphy-0.3.2.zip с сайта.
распаковал в корень сайта (сайт и БД к нему на utf-8)
из папки example положил в корень сайта файл пример example-0.3.x.php
в нем исправил пути к словарям и src прописал таким образом:
require_once('src/common.php');
$dir = 'dicts';
Больше ничего не правил. В результате выполнения скрипта ошибка
Error occured while creating phpMorphy instance: Invalid header string given

Не судите строго. Я новичек. Подскажите что именно я сделал не так.
 
Попробуйте указать абсолютный путь к словарям
Код:
$dir = dirname(__FILE__) . '/dicts';
 
Автор оригинала: pilot911
shikari правильно сказал, используй IGNORE_PREDICT

Автор оригинала: serg45
Как Вы распаковывали словарь? На сервере или заливали по фтп? Вероятно один из файлов common_aut.ru_ru.bin, predict_aut.ru_ru.bin имеет размер = 0. Закомментируйте строку №30 файла example-0.3.x.php т.е.
PHP:
die('Error occured while creating phpMorphy instance: ' . $e->getMessage());
на
PHP:
// die('Error occured while creating phpMorphy instance: ' . $e->getMessage());

и покажите результат, тогда определим причину.
 
Жигaн
Пробывал на локальной версии - выскакивала ошибка. Когда Вы написали про ftp - выложил на внешний - все работает без комментирования.

Вывод такой (думаю что так и должно быть)
-------
-КРАКОЗЯБЛИКИ lemmas: КРАКОЗЯБЛИК all: КРАКОЗЯБЛИК, КРАКОЗЯБЛИКА, КРАКОЗЯБЛИКУ, КРАКОЗЯБЛИКОМ, КРАКОЗЯБЛИКЕ, КРАКОЗЯБЛИКИ, КРАКОЗЯБЛИКОВ, КРАКОЗЯБЛИКАМ ...... и т.д. писать дальше не буду
------

С локальным странно ... где какие настройки подкручивать :-(
Нулевых bin нет.

В любом случае СПАСИБО!!!!!!
 
Сверху