1. Жигaн Новичок

    На сайте с:
    13.03.2006
    Сообщения:
    124
    Русская морфология

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

    Выложил библиотеку для проведения морфологического анализа в 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 в дистрибе ;). Будут вопросы\пожелания задавайте!

    Благодарю за внимание. ;)
    Вурдалак нравится это.
  2. WP ^_^

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

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

    -~{}~ 28.02.07 07:12:

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

    На сайте с:
    14.10.2004
    Сообщения:
    2 891
    Жиг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 слов в секунду:)
  4. Develar Новичок

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

    На сайте с:
    14.10.2004
    Сообщения:
    2 891
    Develar
    согласен. Просто невнимательно требования посмотрел.
  6. Жигaн Новичок

    На сайте с:
    13.03.2006
    Сообщения:
    124
    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? Интересно какая скорость нормализации?
  7. Wicked Новичок

    На сайте с:
    14.10.2004
    Сообщения:
    2 891
    Жигaн
    имхо не надо WP слушать :) http://phpclub.ru/talk/showthread.php?threadid=95926

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

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

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

    -~{}~ 01.03.07 10:46:

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

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

    В библеотеках я больше всего ценю Легкость, т.е. когда автор позволяет сделать
    PHP:

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

    На сайте с:
    13.03.2006
    Сообщения:
    124
    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 тюнить надо...
  10. Wicked Новичок

    На сайте с:
    14.10.2004
    Сообщения:
    2 891
    чистый ispell - 131 мб.
    ispell, после добавления 470 тыс неизвестных слов (при индексации 96мб энц. словарей) - 195 мб.

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

    На сайте с:
    29.05.2002
    Сообщения:
    369
    Ой как нужен словарь испанского. Есть? А где достать?
  12. Жигaн Новичок

    На сайте с:
    13.03.2006
    Сообщения:
    124
    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) словарь раздают бесплатно(правда под мутной лицензией). Можешь посмотреть как там качество морфологии, если нормально, можно попробовать сконвертить их(тут мне понадобится помощь =])
  13. Bermuda Новичок

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

    На сайте с:
    13.03.2006
    Сообщения:
    124
    phpMorphy обновился до 0.2a

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

    Проект переехал на http://sourceforge.net/projects/phpmorphy/
  15. programmer_2006 Новичок

    На сайте с:
    20.09.2006
    Сообщения:
    275
    Re: Русская морфология

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

    -~{}~ 17.05.07 15:33:

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

    -~{}~ 17.05.07 15:36:

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

    -~{}~ 17.05.07 15:57:

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

    -~{}~ 17.05.07 16:15:

    Короче вечная проблема кодировок :) Решил ее благодаря очень хорошему человеку, программисту и его функции :)
    Осталось решить вопрос как расширять словари или где брать новые?И как определить какое слово пришло.
    Огромное спасибо человеку написавшего этот класс :)

    -~{}~ 17.05.07 16:50:

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

    На сайте с:
    14.10.2004
    Сообщения:
    2 891
    ispell врядли подойдет, т.к. в нем не содержится той информации, которая содержится здесь
  17. programmer_2006 Новичок

    На сайте с:
    20.09.2006
    Сообщения:
    275
    Мне для полного счастья только украинского языка не хватает.

    -~{}~ 09.07.07 15:56:

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

    На сайте с:
    14.10.2004
    Сообщения:
    2 891
    Жигaн
    и
    как-то не cовсем вяжутся с мануалом:
    :)

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

    -~{}~ 29.07.07 02:01:

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

    На сайте с:
    13.03.2006
    Сообщения:
    124
    Ага насчет var спасибо, забыл, исправлюсь.

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

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

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