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

Жигaн

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

Доброго времени суток.

Выложил библиотеку для проведения морфологического анализа в public domain. Надеюсь некоторым будет интересно взглянуть ;).

features
  • Для входного слова умеет находить:
  • --- Псевдо корень
  • --- Нормальную форму
  • --- Все словоформы
  • --- Грамматическую(и не только ;)) информацию
  • Скорость нахождения нормальной формы ~700 слов в секунду(это для php5.1.1, WinXP, Duron-800), имеется возможность загрузить словарь в память, при этом скорость возрастает примерно на 20-25%.
  • Основной словарь содержит около 3млн словоформ
  • Есть два режима предсказания ненайденных слов – по суффиксу и по специально подготовленному словарю(подробнее см. http://www.aot.ru/docs/sokirko/Dialog2004.htm, я реализовывал этот алгоритм). Качество предсказания -- так себе… ;)
  • Размер словаря ~4Mb
  • Для работы необходим php4.3.x, php5(пробовал php4.3.7 и php5.1.1)
  • Лицензия LGPL

В качестве основы был взят проект AOT, в частности словари и алгоритм предсказания были взяты из него.

Homepage: phpMorphy
Demo: phpMorphy - Demo

Документации пока нет(ибо опенсурс ;)), но есть example.php в дистрибе ;). Будут вопросы\пожелания задавайте!

Благодарю за внимание. ;)
 

WP

^_^
Не люблю тяжелые библеотеки. Напиши 1 класс с методами которые бы возвращали нужные наборы данных. И всякие ненужные opts убери из example - настройки необязательные.

И будет хорошая штука =)

-~{}~ 28.02.07 07:12:

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

Wicked

Новичок
Жигaн
респект :)

для начала рекомендация:
PHP:
$locales = array("ru_RU.CP1251", "ru_RU.cp1251", "Russian_Russia.1251" /* <- у мну сразабывает на этой */, "ru_RU", "ru");
$locale_found = false;
foreach($locales as $locale) {
  if (!$locale_found) {
    $locale_found |= (false !== setlocale(LC_CTYPE, $locale));
  }
}
-~{}~ 28.02.07 11:56:

на целероне 2.4 на ispell'овском base.koi (129 тыс. файлов) - 700 слов в секунду:)
 

Develar

Новичок
Wicked
Если для работы необходим php4.3, то зачем пляска с foreach - setlocale принимает массив.
 

Wicked

Новичок
Develar
согласен. Просто невнимательно требования посмотрел.
 

Жигaн

Новичок
2WP: Хмм даже не знаю, я старался сделать и так все по минимуму ;). А что имеется ввиду ппо 1 класс?
Сейчас phpMorphy класс - фасад к внутреннему API. Ты имеешь ввиду сделать все вызовы через фасад типа
PHP:
$morphy =& new phpMorphy($opts);
$normal = $morphy->getNormalForm($word);
и т.п.? Или упростить внутренний API? Дык кудаж меньше? ;)
Просто сейчас возможно гибко управлять внутренностями, кэширование и т.п., если упростить то саппортить код будет невозможно.

2Wicked:
Спасибо, насчет венды забыл ;), правда неясно почему при установки локали ru_RU будет выбрана 1251 кодовая страница? интересно взглянуть на результат locale -a|grep ru_RU ;). Теперь насчет скорости. 700 слов это при каких настройках(предсказание, fsa_cache_* и т.п.)
Расскажу свое ИМХО как потюнить скорость:
in_memory -- следует включать ТОЛЬКО при пакетной обработке текстов большого объема(это я думаю и так понятно)
graminfo_cache -- я включаю всегда
fsa_cache_levels -- включаю ТОЛЬКО при пакетной обработке, причем если объем текста
fsa_cache_dir -- это можно установить всегда(будет использовано если fsa_cache_levels>0)
with_gramtab -- просто так лучше не включать т.к. в этом случае при каждом запросе будет читаться файл gramtab.rus.bin(30кил +unserialize). Для поиска эти данные скорее всего не понадобятся.
predict_by_suffix -- если нужно предсказание
predict_by_db -- если нужно предсказание

По предсказанию:
Включать можно только predict_by_db(предсказание по окончанию) т.к. в основном работает именно оно. predict_by_suffix работает для слов типа 'мегачерный' т.е. к нормальному слову была приписана приставка.

2All: Нужны кому english, german словари, или достаточно русского?

-~{}~ 28.02.07 22:26:

2Wicked: Вы делали морфологию на основе ispell в mysql? Интересно какая скорость нормализации?
 

Wicked

Новичок
Жигaн
имхо не надо WP слушать :) http://phpclub.ru/talk/showthread.php?threadid=95926

Словари - выкладывай конечно! :)

нтересно взглянуть на результат locale -a|grep ru_RU
Я бы с радостью, но grep у меня в винде есть, а locale - нету :)

2Wicked: Вы делали морфологию на основе ispell в mysql? Интересно какая скорость нормализации?
12.8млн слов за 950 секунд ~= 13427 слов/сек.
Правда, перед этим пришлось потратить 874 секунды на добавление 470тыс. неизвестных слов в таблицу ispell'а. Но это, мне кажется, можно значительно оптимизировать. Так что что скорость где-то всего в 10 (15 с оптимизацией) раз больше.

-~{}~ 01.03.07 10:46:

Тюнингом займусь чуть попозже.
 

WP

^_^
Жигaн
Коробят всякие compat'ы. Пиши под PHP 5 only ;)
И просто нужно чтобы всё было в одном-двух файлах. Подключил - создал объект - получил то что нужно одним вызовом метода.
Wicked
Квики отличный пример - там два класса основной и компилятор + плагины. И нет файлов типа gramtab.php.

В библеотеках я больше всего ценю Легкость, т.е. когда автор позволяет сделать
PHP:
require_once 'one_file.php';
$one = new one(...);
$result = $one->get(...);
Например стеммер Портера реализованный на dklab - блестящий пример Легкой библеотеки. А как наворотят целую свиноферму из файлов... глаза б не глядели. Когда явно по смыслу библеотека выполняет пару функций.
 

Жигaн

Новичок
WP:
1. Насчет `компатов` php5 мягко говоря не слишком широко используется как того хотелось бы. Потому для меня важно чтоб библиотека была не php5 only.
2. Непонятно что ты привязался к кол-ву файлов? Сравнивать системы разного назначения и разной сложности просто некорректно. Насчет gramtab.php это к чему? название не нравится что-ли?
3. Чем сложнее
PHP:
$morphy = new phpMorphy(...);
if(false !== ($desc = $morphy->morph(...))) {
  echo $desc->getBaseForm();
}
чем
PHP:
$morphy = new phpMorphy(...);
if(false !== ($form = $morphy->getBaseForm(...)) {
echo $form;
}
4. Библиотека выполняет не пару ф-ций. Это внешний интерфейс такой простой ;)
5. Если для тебя достаточно стеммера, очень хорошо. phpMorphy использовать нет смысла т.к. лишние тормоза. (и не от кол-ва классов\файлов они...)

-~{}~ 01.03.07 21:21:

Wicked:
1. У тебя все словоформы в одной таблице хранятся? Объем базы >200Mb?
2. Нифига себе, у меня mysql выполняет порядка 20rps запросов типа [sql]SELECT 1[/sql] ;). Похоже мне mysql тюнить надо...
 

Wicked

Новичок
1. У тебя все словоформы в одной таблице хранятся? Объем базы >200Mb?
чистый ispell - 131 мб.
ispell, после добавления 470 тыс неизвестных слов (при индексации 96мб энц. словарей) - 195 мб.

таблица со словоформами - самая большая из всех.
 

Жигaн

Новичок
2Bermuda: Я не силен в испанском чес-слово ;). Понятия не имею, как в нем построено словообразование.
Что могу предложить:
1) ispell
2) http://www.solarix.ru <-- тут за деньги
3) http://www.gelbukh.com/agme/
4) http://www.xrce.xerox.com/competencies/content-analysis/demos/spanish

в 3) словарь раздают бесплатно(правда под мутной лицензией). Можешь посмотреть как там качество морфологии, если нормально, можно попробовать сконвертить их(тут мне понадобится помощь =])
 

Bermuda

Новичок
Жигaн
Временно надобность в нахождении нормальной формы слов испанского языка отпала. Однако я вернусь к этой теме месяца через 2-3. Отпишу сюда. В любом случае спасибо!
 

Жигaн

Новичок
phpMorphy обновился до 0.2a

Изменения:
- В два раза повышена скорость работы
- Введен режим пакетной обработки(+50% в скорости для нормализации)
- Обновлен словарь для русского языка
- Добавлена поддержка shared memory
- Немного изменен API
- Добавлены словари для английского и немецкого языков

Проект переехал на http://sourceforge.net/projects/phpmorphy/
 

programmer_2006

Новичок
Re: Русская морфология

Хотел узнать как с тобой можно связаться , мыло?аська?или только через этот форум?Планируется ли дальнейшее развитие проэкта?

-~{}~ 17.05.07 15:33:

кстати а как определить русское ли слово пришло или какое другое?Когда не знаешь на каком языке будет запрос идти?...

-~{}~ 17.05.07 15:36:

Спасибо тому кто дал мне ссылку на этот топик. Это то что я искал.
Кстати вопрос а где брать словари для других языков.. например украинского?

-~{}~ 17.05.07 15:57:

У меня странный глюк, достаточно мне поменять в примере искомое слово как он нечего не находит, а потом возвращаю на слово из примера и опять нулевой результат... Может винда глючит??? Меня виндовс уже выкашует особенно в том что касается кодировок.

-~{}~ 17.05.07 16:15:

Автор оригинала: programmer_2006
У меня странный глюк, достаточно мне поменять в примере искомое слово как он нечего не находит, а потом возвращаю на слово из примера и опять нулевой результат... Может винда глючит??? Меня виндовс уже выкашует особенно в том что касается кодировок.
Короче вечная проблема кодировок :) Решил ее благодаря очень хорошему человеку, программисту и его функции :)
Осталось решить вопрос как расширять словари или где брать новые?И как определить какое слово пришло.
Огромное спасибо человеку написавшего этот класс :)

-~{}~ 17.05.07 16:50:

Кстати как допустим словарь ispell скомплить в словарь для этого проекта?
 

Wicked

Новичок
ispell врядли подойдет, т.к. в нем не содержится той информации, которая содержится здесь
 

programmer_2006

Новичок
Мне для полного счастья только украинского языка не хватает.

-~{}~ 09.07.07 15:56:

Жиган дай плиз свою аську.
Кстати кто может подкинуть украинский словарь?Возможно за вознаграждение.
 

Wicked

Новичок
Жигaн
и
*) Fully E_STRICT compatible
как-то не cовсем вяжутся с мануалом:
The PHP 4 method of declaring a variable with the var keyword is still supported for compatibility reasons (as a synonym for the public keyword). In PHP 5 before 5.1.3, its usage would generate an E_STRICT warning.
:)

Еще я нашел довольно интересную статейку про сравнение стеммеров - http://www.rcdl2006.uniyar.ac.ru/papers/paper_67_v2.pdf

-~{}~ 29.07.07 02:01:

Жигaн
а сколько в русском словаре захардкоденых слов? Я так понимаю, работает оно так: если слово найдено в словаре, оно отдает по нему точную информацию. Если не найдено - то пытается анализировать. Так?
 

Жигaн

Новичок
Ага насчет var спасибо, забыл, исправлюсь.

В словаре около 3млн уникальных словоформ(различающихся только по морфологическим признакам)
Есть два режима предсказания:
1) Усечением левой части слова(для мегакрасного -> мегакрасный)
2) по окончанию
как правило неизвестные слова предсказываются по п2, однако точность выше у п1.

P.S. За ссылку спасибо, почитал, однако из моей практики snowball и портер мусорили сильно на коротких фразах(1-2 слова)
 

Kudja

Новичок
кульная вещь, а вот интересуют кое какие вопросы - можно ли при помощи этого класса взять слово и указать что хочу его же в родительном падеже ед. чесле например???
 
Сверху