Поисковая машина для калмыцкого языка

PostgreSQL Источник: Блог Бадмы Онтаева в vk.com
Поисковая машина для калмыцкого языка | Перепечатываем статью Бадмы Онтаева о том, как он разработал поддержку калмыцкого языка в полнотекстовом поиске PostgreSQL

Перепечатываем статью Бадмы Онтаева о том, как он разработал поддержку калмыцкого языка в полнотекстовом поиске PostgreSQL.

Предыстория данного проекта:

В прошлом году в Элисту в калмыцкий университет с лекцией приезжал наш с вами земляк Олег Бартунов, который является одним из ведущих отечественных и мировых специалистов в области информационных технологий. Он уже более двадцати лет занимается разработкой системы управления базами данных (СУБД) PostgreSQL. PostgreSQL - это информационная система с открытым исходным программным кодом (open source), разработкой и поддержкой которой занимается огромное сообщество разработчиков со всего мира. О.Бартунов является ведущим разработчиком (major contributor) данного сообщества, а также генеральным директором, созданной им российской компании «Postgres Professional», которая занимается разработкой и продвижением российской версии СУБД PostgreSQL.

Особым вкладом О.Бартунова в разработку мирового PostgreSQL является создание системы полнотекстового поиска в базе данных. Такой поиск является одним из самых востребованных механизмов доступа к содержимому любой современной информационной системы, хранящей любую метаинформацию, в том числе и сами документы.

Все современные веб-сайты, по сути, являются обычным интерфейсом, способом организации доступа к базам данных. Так как по мере накопления документов в любой системе неминуемо возникает проблема организации эффективной навигации необходимо, чтобы посетитель сайта мог за минимальное количество кликов по сайту найти нужный ему документ. Помимо стандартной, зачастую ручной, навигации с использованием рубрикации (тематической, по типу материалов, категории пользователей и т.д.), полнотекстовый поиск является одним из самых эффективных методов навигации, особенно для новичков, незнакомых с устройством конкретного сайта.

Из нашего повседневного опыта мы понимаем, что хороший поиск - это поиск, который в ответ на наш запрос быстро найдет релевантные (наиболее адекватные запросу) документы.

И такие машины казалось бы уже существуют, это широко известные всем поисковые машины "Google", "Яндекс" и "Рамблер". Более того, существует и большое количество других поисковиков, платных и бесплатных, которые позволяют индексировать всю вашу коллекцию документов и организовать по вашей коллекции вполне качественный поиск. Владельцу сайта остается только "скармливать" таким поисковикам контент по мере его появления.

Организовать сам поиск можно несколькими способами – например доступом через http-протокол, используя URL документа (универсальный указатель местоположения), как это делают большие внешние поисковики, или организовать прямой доступ к самому содержимому базы данных. Первый подход весьма часто оправдан и довольно хорошо работает на множестве сайтов, но имеет и существенные недостатки, такие как, например, неполная синхронизация с содержимым базы данных.

СУБД PostgreSQL позволяет настроить полнотекстовый поиск на любом языке. Для этого требуется только наличие нескольких специальных словарей, в которых будет содержаться вся необходимая информация о лингвистических особенностях конкретного целевого языка.

Логично, что после своего выступления в Калмыкии О.Бартунов предложил сделать возможным поиск в PostgreSQL и на калмыцком языке.

Задача, скажем сразу, оказалась непростой. Сложность ее заключалась не только в отсутствии у нас в Калмыкии специалистов по PostgreSQL, но и в особенностях морфологии, фонетики, синтаксиса калмыцкого языка, а также наличия двух систем письменности (на кириллице и на тодо бичиг).

В настоящее время в разработке находятся два основных необходимых для решения поставленной задачи словаря: словарь в формате Hunspell (словарь проверки орфографии), а также стеммер (словарь нахождения основы) слов калмыцкого языка. Они оба решают одну задачу - помогают "движку" PostgreSQL "понять", что разные словоформы являются всего лишь изменениями одного и того же слова и, соответственно, должны учитываться при поиске вместе.

Рассмотрим их подробнее:

Словарь Hunspell представляет собой набор формализованных правил словообразования с помощью аффиксов (суффиксов и префиксов). Берется начальное слово и на его базе строятся все возможные варианты его изменения. Сравнивая полученные слова с исследуемым, при совпадении мы можем точно определить начальную форму. На данный момент словарь содержит около 9000 слов и для него описано 297 правил словообразования с помощью суффиксов. Основной проблемой при построении словаря Hunspell для калмыцкого языка является трудность с определением правильного произношения слова и в зависимости от этого применения определенного правила словообразования (суффикса падежа, множественного числа и т.д.). Так, в современном способе написания калмыцких слов на кириллице отсутствует информация о неясных гласных в конце слов. Поэтому в особо сложных случаях авторам приложения приходиться обращаться к способу написания слов на тодо бичиг или к словарям с транскрипцией (к примеру - словарь языка ойратов Синцзяна Б.Х. Тодаевой). Примером могут быть слова, оканчивающиеся на -н, которые могут относиться как к первому так и второму склонению в зависимости от наличия неясной гласной. Например «чон» (в ойратском словаре - чоно), которое относится ко второму склонению и в родительном падеже будет иметь суффикс -ын - «чонын» в отличие от слов первого склонения с суффиксом -а (модн - модна). Аналогичная проблема возникает с суффиксами множественного числа, например терз (в ойратском - терзе) будет иметь суффикс -с «терзс», а не -муд/мүд как остальные слова второго склонения девтрмүд, туһлмуд и т. д.

Кроме словаря в формате Hunspell в разработке находится также стеммер калмыцкого языка - алгоритм нахождения основы слова. Он работает грубее - просто пытается отрезать от конца слова все известные ему окончания. К примеру слово "умшна" он приведет к основе "умш", отбросив окончание настоящего времени -на. Но в отличии от словаря Hunspell стеммер дает 100% покрытие слов, то есть, даже если он не смог найти окончание, то оставит слово неизмененным.

В PostgreSQL словарь Hunspell является более приоритетным при разборе слов, а стеммер является "последним шансом" найти основу.

Текущие результаты:

  1. Веб-страница, которая позволяет находить начальные формы слов на калмыцком языке (на базе Hunspell и PostgreSQL): http://194.87.101.29
  2. Стеммер в формате snowball (поддерживаемом PostgreSQL). В настоящее время в нем описаны алгоритмы нахождения основы для существительных, глаголов, причастий и деепричастий.
    Вы можете загрузить в нее любой текст на калмыцком языке. К примеру целую главу из Джангара (http://djangar.freekalmykia.org/) и на выходе получите набор начальных форм всех существительных из этого текста (так как на данном этапе в словаре разобраны только существительные).
    Кроме этого на базе Hunspell удалось запустить проверку орфографии на калмыцком языке в Mac OS.
  3. Ведется работа по интеграции стеммера в PostgreSQL и разработка аналогичной веб-страницы, но уже на базе стеммера.
  4. Все наработки выложены в общий доступ на портале github: https://github.com/ontaev/kalmyk-hunspell ; https://github.com/ontaev/kalmyk-stemmer

В планах:

  1. Увеличение покрытия частей речи в Hunspell и оптимизация работы стеммера.
  2. Разработка веб-портала с поисковой машиной на базе СУБД PostgreSQL. Как с хранением текстов на портале, так и с индексацией существующих сайтов на калмыцком языке. Аналогично ботам поисковых машин.

В связи с этим приглашаю к сотрудничеству всех желающих: знатоков калмыцкого языка, IT-специалистов и патриотов нашей Родины. Проект является некоммерческим, разрабатывается по условиям свободной BSD лицензии - то есть любой может использовать наработки в своих целях, но с указанием авторов проекта. Целью данного проекта является создание мощного современного инструмента работы с текстами на калмыцком языке, что в свою очередь поможет в популяризации и сохранении родного языка.

Если у вас есть вопросы, идеи, предложения и желание помочь, пишите на мой почтовый ящик: ontaev@gmail.com

С уважением, Онтаев Бадма.