Тридцать лет libmorph

от автора

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

Давным-давно, когда Рунет только появлялся, морфологические анализаторы и системы контроля орфографии уже производили вау-эффект: они не только сводили разные словоформы к основной (словарной), но и зачастую умели их склонять/спрягать, описывали грамматику вхождений и предлагали варианты замены ошибочных начертаний. Да и чуть позже, при появлении первого русского морфологического поиска в Интернет – это был Апорт! – на выставках тоже равнодушных не было. Тогда и родился libmorph.


Привет! Я Андрей Коваленко (Keva). Занимаюсь прикладной лингвистикой и делаю поисковые движки. Я сделал первый Апорт!. Индексирование, поиск и ранжирование в Rambler образца 2000 года и далее, как и украинская <META> – тоже моих рук дело. В 2025 завершил работу над большой корпоративной поисковой системой МойОфис.

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

А лингвистической базой для двух из трёх российских интернет-поисковиков стала именно библиотека libmorph. Она же разбрелась по компам с рабочими названиями linguist.dll (win16), ling32bi.dll (win32) и libmorphrus.so – на семействе *nix. Позже поддержка украинского словоизменения в Яндекс также была сделана на основании дампа парадигм слов этого анализатора.

На сегодня проект libmorph продолжает развиваться и поддерживаться, традиционно демонстрирует рекордные показатели производительности и пару лет как доступен под лицензией MIT, а не GPLv2.

Как всё начиналось: Пропись

В начале 90-х мы – НПК Агама – сидели в полуподвальном помещении на улице Гжатской, за “великой китайской стеной” из коробок с телевизорами GreatWall, по случаю купленных на перепродажу хозяином кооператива Михал Васильичем Пискуновым, да то ли дело не пошло, то ли не до телевизоров ему было, и они стали неотъемлемой частью интерьера.

Тогда Агама подписала контракт с РТСБ (Российской Товарно-Сырьевой Биржей) на разработку Классификатора-1 – автоматического определения кодов товаров по ГС ТНВЭД в потоке данных. Для реализации привлекли группу Владимира Пархоменко из “ИнформЭлектро” – у них была “морфология”. Это была отдельная ценность, ноу-хау, которым группа с компанией не делилась, в том числе “таблицы флексий”, про которые мы слышали, но не видели.

Разработку завершили и сдали, а Сергей Королёв портировал рантайм морфологии на Windows, и появилась “Пропись” – первый русский спеллинг-чекер для набиравшей популярность операционки. Под DOS были Presto, Лексикон+Ортодок и ОРФО, а под Windows – только мы. И это был триумф: на выставках коробки с программой разлетались прямо со стенда, не успевали их подвозить!

А дальше в компании произошло что-то, что конкретно – я не знаю и сегодня, могу только догадываться, и Пархоменко с группой ушёл делать другой проект. Его – Пархоменко – я и по сей день считаю одним из лучших своих учителей. Но лингвистическое ядро Прописи осталось в Агаме “чёрным ящиком” – файлами без возможности поправить что-то или пополнить словарь.

Тогда я взял словарь Зализняка, словник в электронном виде, и… Так всё и началось. Примерно через восемь месяцев, не заметив, как пролетели весна, лето и осень, я “всплыл” с первой версией анализатора. В памяти остались только вермут Чинзано с минералкой, густые клубы табачного дыма над столом и прогулки с собакой по Воронцовскому парку, где я продумывал устройство словаря: как его сделать компактнее и как разместить в 640 килобайтах памяти стандартной тогдашней машины.

Придумал, в силу своей невежественности и отсутствия профильного образования (я закончил Химфак), сжатые префиксные деревья, которые до того уже двадцать пять лет как были придуманы (“Patricia”, Morrison, 1968 год).

Сделал на Borland Pascal систему для интерактивного создания и тестирования таблиц окончаний и чередований в основе – рабочую среду классификации слов, а для написания универсального рантайма выучил язык C.

В результате к концу 1994 года появилась linguist.dll, позже ставшая libmorphrus – морфологическая библиотека для win16, где словарь был порезан на куски и зашит в исполняемый модуль в виде “ресурсов”, менеджмент которых был отдан на откуп операционной системе. Кстати, я и по сей день часто использую такой подход – отдать ей что-то, что она делает хорошо 🙂

За это время вышло ещё две версии Прописи на старом морфологическом ядре – они были шире технологически, обеспечивая интеграцию с большинством популярных тогда офисных пакетов и встраиваясь в них либо нативно, либо как фильтр перед их собственным спеллинг-чекером.

И вот первый релиз на новой технологии: Пропись 4.0. К ней Женя Киреев (ныне один из троих основателей Positive Technologies) сделал модуль azbuka, который выполнял подбор кандидатов на замену ошибочных слов в зависимости от настроек и обеспечивал собственно функционал контроля орфографии, опираясь на функции CheckWord и CheckHelp анализатора linguist.

Чуть позже появился и грамматический корректор, выросший в проект “Гипотетам” – углублённый синтаксический анализатор, но это совсем другая история. Когда-нибудь позже расскажу и покажу.

Эпоха поисковых систем

1995 – 1996 годы. Интернет становился явлением, Рунет вслед за ним. Появились не только научные и информационные данные и ресурсы энтузиастов (библиотека Максима Мошкова), но и первые ласточки электронной коммерции. И, конечно, первые поисковики – прежде всего altavista. Она искала быстро – и компания не скрывала, что весь индекс находится в памяти. Это была живая реклама серверов DEC Alpha. Мы с Женей Киреевым, Женей Бондаренко и Сергеем Королёвым посидели, подумали и… сделали Апорт!

Нет, мы не держали “всё” в памяти – у нас не было DEC Alpha, мы держали индексы на дисках, и в первой версии система крутилась на одной машине и не масштабировалась. Ну а куда там и что было масштабировать, если весь Рунет умещался на одном компакт-диске несколько раз? Но это была первая поисковая система с полноценной лингвистической поддержкой русского языка! Интересно, что именно там впервые появились цитаты релевантных фрагментов найденных документов, позже ставшие обязательным атрибутом поисковой выдачи и получившие у оптимизаторов жаргонное название “сниппеты”.

Спустя год морфологический поиск под крышей компании CompTek выкатил и Илья Сегалович, создатель Яndex.

Тогда же я сделал 32-битную версию – ling32bi.dll. Ключевое отличие от 16-битной состояло в том, что словарь уже не был сегментирован и состоял из одной цельной “страницы” префиксного дерева. Чуть позже, уже не в Агаме, сделал и первый unix port модуля под коммерческой лицензией. Демонстрационная версия с урезанным словарём без кусков на буквы -п- и -р- лежала в открытом доступе, полная – неплохо продавалась.

Следующим большими проектом, где заработала эта технология, стал Рамблер. Я с подачи Димы Крюкова спроектировал и изготовил новый индексатор и механизмы поиска, учитывающие координаты слов в документах – попросту говоря, полноценный контекстный ранкер. Понятно, что лингвистической базой стал libmorph. Параллельно была сделана ещё и украинская версия анализатора, которая легла в основу поисковика <МЕТА>.

libmorph сегодня

Сегодня libmorph – это единый API в стиле COM, в который упакованы как словарные, так и вероятностные анализаторы для неизвестных слов. Полностью поддерживаются русский и английский, украинский пока в стадии вычёсывания.

В словарях явно прописаны и зафиксированы численные идентификаторы лексем, и я гарантирую, что слово “хорёк” получило свой номер 50836 раз и навсегда. Это очень полезная характеристика: при строительстве информационных систем можно не держать свой словарь с номерами лексем, а использовать готовые.

В API как наследие спеллинг-чекеров есть функция выборки форм и лексем из словарей по шаблону с ? и . Например, для маски “ко*ро*ва” русский модуль находит формы корова, короткогрива, коростелева, королева, королевства, кормопроизводства, кораблестроительства, контроктава, комарова и ковроткачества. Привет Т-банку с его игрой “5 букв” от шаблона ‘?????’.

Производительность русского модуля – более миллиона слов в секунду для нативного анализатора, версия для python в два с лишним раза медленнее из-за накладных расходов интегрирующей прокладки, но всё равно в 20(30) раз быстрее, чем pymorphy3.

Поддерживается репозиторий пакетов libmorph.ru, на сайте доступна и прямая загрузка пакетов.

Документация выложена в Сеть, там же есть и примеры интеграции модулей.

Лицензия и доступность

  • 2015: GPLv2.

  • 2024: MIT

Репозиторий: https://github.com/big-keva/libmorph

Сайт проекта: https://libmorph.ru, в том числе документация https://libmorph.ru/help.html

Вместо заключения

Проекту 32 года, он почти ровесник мне в профессии. Сейчас исполняется 30 лет первому публичному релизу. Надо признать, получился хороший инструмент, на сегодня по чистоте словаря уступающий разве что ОРФО, над которой полтора десятилетия работала команда классных лингвистов, а по производительности сильно обгоняющий более поздние аналоги.

Заходите на сайт. Читайте документацию. Ставьте. Собирайте. Используйте.

Искренне ваш, Кева.

ссылка на оригинал статьи https://habr.com/ru/articles/1024132/