Вот я про тоже. Я остановил своё чтение на третьей фразе, где деепричастный оборот неправильно обособили. Я-то сам с орфографией и пунктуацией не особо дружу, но читать и оценивать статью о русском языке с такими ошибками пока не возьмусь. Добавил в избранное, потом гляну.
Нет, но во время создания топика существует надпись, что в названии должно быть отражено содержание статьи. В названии фигурирует понятие «русская морфология», после чего включилась небольшая часть мозга, отвечающая за грамотность. =)
Как всё сложно. Морфология в общем-то с пунктуацией не особо связана, так что ничего криминального.
А как вам такая фраза с некого сайта: «Требуется граммотный специалист по продвижению сайта гостиницы.» :)
У меня одного впечатление, что с фразы «Словарь с проекта AOT содержит около 5 миллионов словоформ» начинается другая статья, про способ сокращения словаря морфем и ускорение поиска по нему? А до той фразы — что-то другое? И что память тут не при чём?
В английской литературе есть понятие Memory-Based Algorithm. Они основанные запоминание уже разобранных образцов использование их в дальнейшем. Я понимаю, что по русски это немного режет, но у меня нет лучшего перевода. Если интересно можете посмотреть книгу Walter Daelemans, Antal van den Bosch Memory-Based Language Processing. Там довольно много подобных алгоритмов.
честно говоря, ничего не понял. по крайней мере, постановку задачи.
Нам нужно по введенному слову искать данное слово + заносить в базу(при этом анализируя слово(окончания, суффиксы и т.д) )?
мне казалось, что такая задача решается бором + экспертными системами(ну для самых извращенных нейронными сетями).
В общем, звучит интригующе. Прошу пополнить пост деталями.
Задача по слову определить его нормальную форму. Например для существительного нормальная форма это именительный падеж, единственное число. Для глагола это инфинитив. Для прилагательного именительный падеж, мужской род и т.д.
Я использовал в качестве словаря словари от aspell. На его основе строил все возможные словоформы, получилось, 1 361 765 словоформ. Всё это загнал в собственную хеш-таблицу, по которой поиск давал порядка 5 млн. слов в секунду. При этом слова были в UTF-8 без какого-либо преобразования к целым числам и без особых оптимизаций.
Потом по тексту, приведённому к основам слов, строится суффиксное дерево со ссылками на оригинальные слова в оригинальном тексте. По тестам получилось порядка 900 документов по 20Кб (~1300 слов) в секунду, т.е. ~ 1 170 000 слов в секунду.
Что-то ваш алгоритм медленный. Либо дерево медленное.
В моем случая было критично объем оперативной памяти используемой программой. Кодирование к целым числам наоборот замедляют работу, но экономят используемую память.
Так же у меня используется упорядоченная структура, что бы угадывать правило для незнакомого слова, это тоже замедляет работу алгоритма.
Дерево пока не использовалось, возможно на такое представление будет сделан переход в следующей версии программы и оно должно даст значительный прирост производительности, но не уверен, что будет выгрыш по памяти, учитывая особенности языка java.
Ага, Java, тогда понятно :) Моя реализация на C, у меня больше свободы при работе с памятью, да и нет требований по экономии памяти, по крайней мере для словаря, всё ради скорости :)
Это не дерево медленное, а хэш быстрый. -)) К слову сказать, во всех алгоритмах точного поиска информации по текстовому ключу хэш даёт гораздо больший выигрыш по сравнению с деревьями (при больших объёмах данных, конечно). Именно поэтому не рекомендуют использовать стандартный std::map для хранения пар с текстовым ключом, хэш даёт выигрыш на порядок.
Для сравнения пробовал Judy Array (http://judy.sourceforge.net/) для словаря, давал порядка 3 млн. слов в секунду. Думаю, правильно написанное дерево может дать чуть больше. Но когда можно создать хеш-таблицу на весь словарь, хеш конечно рулит, не на порядок конечно, но раза в полтора-два выигрыша даст.
Почему так не любят автоматы. Упакованная русская морфология займет несколько мегабайт. Поиск — линейный. Так реализовано, к примеру, на aot.
Конечно, можно использовать и хеши, но предыдущий вариант имеет много своих плюсов (генерация словоформ, предсказание формы слова)
В аот насамом деле используются два автомата. Один для слов из словаря. Второй для предсказания. Я писал такой автомат на Java, но увы он занимал слишком много памяти и был сложный в реализации.
Есть хорошая книжка по этой теме Walter Daelemans, Antal van den Bosch Memory-Based Language Processing. Так же еще можно прочитать статью на хабре про реализацию морфологии на python. И конечно сайт aot.ru.
Как-то читал статью про анализ русского текста в играх. Были раньше такие на слабеньких по современным меркам компьютерах типа Spectrum — говоришь что делать, а компьютер тебе отвечает текстом. Надо будет поднять журнальчик.
Я ссылку нашел, мой вопрос был почему нет GermanLuceneMorphology — теперь понял, спасибо.
Но допустим я напишу код разбивки(spell chkerом) на слова. Сложно ли будет расширить эту библиотеку на поддержку немецкого для элементарных слов.
Нет не сложно. Эффективность представления будет зависит от того сколько слов с образуются с помощью префиксов. В русском и английском языках таких слов немного.
А вы не пробовали выложить ваши Analyzer/Tokenizer/TokenFilter в саму библиотеку Lucene? В trunk-е проекта есть специальный модуль analysis, там этому самое место imho. Можно просто зафайлить Jira issue и приаттачить исходники. Вроде бы проблем с лицензией никаких нет и внимание ваша работа бы привлекла на порядок больше и квалифицированная помощь бы не заставила себя ждать.
Русская морфология, основанная на памяти