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

andreypaa

Новичок
Заметил, что обсуждаемая библиотека обновилась до версии 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
 

Жигaн

Новичок
Автор оригинала: 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
-------

Есть еще некоторые изменения, но это уже мелочи.
 

shikari

Новичок
Спасибо за классную библиотеку!

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

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?
 

Жигaн

Новичок
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.
 

shikari

Новичок
1) Чем getAllFormsWithGramInfo хуже нового метода findWord?

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

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

Жигaн

Новичок
добавил словари:
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
 

shikari

Новичок
Спасибо!

Ты случайно не знаешь, где можно взять частотные словари русского и английского языков?
 

shikari

Новичок
Слово "ВИДЕО"
Код:
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:

Частотный словарь - я имел ввиду список слов (м.б. приведенных к нормальной форме) с указанием частоты употребления.
 

Жигaн

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

shikari

Новичок
Наверное, так:
Код:
$baseform = $morphy->getBaseForm($word, phpMorphy::IGNORE_PREDICT);
if (false === $baseform) {	
   echo $word, " NOT FOUND";
 

pilot911

Новичок
спасибо

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

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

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

осталось еще около 900 000 напарсить и можно будет для чего-нибудь использовать
 

serg45

Новичок
Уважаемый Жиг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

Не судите строго. Я новичек. Подскажите что именно я сделал не так.
 

shikari

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

Жигaн

Новичок
Автор оригинала: 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());
и покажите результат, тогда определим причину.
 

serg45

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

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

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

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