Компиляция грамматического словаря

Использование словаря в поисковом движке

Версии словарей

Зачем нужна компиляция словаря для поискового движка

Зачем нужна компиляция словаря разработчику

Что необходимо иметь для компиляции словаря

Файлы описания словаря - кодировки и локаль

Компиляция словаря

Другие опции

Словари русского языка

Импорт словарных статей

Результаты компиляции

Компиляция синтаксического анализатора

Компиляция фразовых статей

Проверка словаря

Компиляция N-грамм

Модули для Грамматического Словаря

Утилиты, участвующие в сборке словаря

Анализ текста выполняется грамматическим движком с использованием множества видов правил. Часть этих правил создается вручную, другая часть генерируется автоматически на основе некоторой собираемой статистики. Разнообразие правил и алгоритмов приводит к тому, что сборка словаря - это достаточно сложный процесс, в который вовлечено несколько программ.

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

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

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

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

Грамматический движок использует статистическую информацию о частоте использования слов в контексте. Сборка такой информации из текстового корпуса выполняется программой empirika.

Задача снятия омонимии также решается грамматическим движком с помощью набора специальных правил. Часть этих правил задается вручную, часть - генерируется автоматически. Автоматическая генерация правил снятия омонимии выполняется специальной программой посредством статистического анализа эталонного размеченного корпуса.

Поддерживаемые платформы

Компилятор грамматического словаря работает в текстовой консоли, поэтому предъявляемые им требования к ОС весьма скромны. В настоящий момент программа compiler компилируется и исполняется на следующих платформах:

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

Использование словаря в поисковом движке

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

1. С помощью лексикона и набора морфологических правил различные словоформы приводятся к базовой форме (см. команды -wordforms и -dynforms). Реализованный подход является более сложным, чем, к примеру, работа со словоформами в распространенной утилите ispell, но дает ряд существенных преимуществ.

2. Для выполнения грамматического анализа фраз (построения графов) в обрабатываемых текстах используется заложенная в лексиконе информация о грамматических признаках словоформ (падеж, род, глагольное время и т.д.) - см. команды -correlate и -aa.

3. Для выяснения грамматической или семантической связанности слов используется грамматическая сеть - тезаурус (см. команды -semnet и -links).

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

Версии словарей

В зависимости от состава лексикона, включения определенной морфологической информации и наличия тезауруса различаются несколько версий словарей: pro - полные версии словарей с включенным тезаурусом и правилами синтаксического анализа, premium - включают специальную версию тезауруса с большим количеством связей. Кроме того, можно создавать подверсии словарей для каждого из поддерживаемых языков или многоязычные словари.

Для удобства сборки дистрибутивов также используется пустой словарь, в котором формально присутствует определение морфологии и есть лексикон, но они фактически пусты. В этом случае морфология языка обрабатывается стеммером, который автоматически настраивается на текущий язык пользователя.

Более подробное описание отличий полной версии словарей дано здесь.

Зачем нужна компиляция словаря для поискового движка

Как и для многих других программ, работающих так или иначе с морфологией (один из наиболее известных примеров - утилита проверки орфографии ispell и большое количество словарей для разных языков), для практического применения исходные тексты словарей подвергаются предварительной обработке, в ходе которой формируются двоичные файлы. Этот этап называется компиляцией словаря. Работа со скомпилированным словарем удобна по нескольким причинам.

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

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

В-третьих, компилятор при включенной оптимизации генерирует несколько cpp-файлов (см. к примеру в исходных текстах проекта файл LEM\Include\Solarix\_sg_api.h), которые содержат специально построенный C++ код для ускоренного поиска наиболее употребительных слов, для более эффективного применения продукционных правил при синтаксическом анализе (продукционные правила типа если A B C то D E F наглядны, но крайне трудны для быстрого применения в ходе анализа). Сгенерированный код используется (см. далее) другими модулями, так что C++ выступает в роли кроссплатформенного ассемблера. Подробнее о компиляции продукционных правил в C++-код можно посмотреть здесь.

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

Зачем нужна компиляция словаря разработчику?

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

Не следует забывать и таком моменте, как многоязычность поискового движка в "базовой комплектации". Если поддержка русской морфологии не требуется, то можно скомпилировать словарь только для английского языка. К примеру, в версии 0.81 при одинаковом числе словарных статей в русском и английском лексиконах только русский словарь имеет размер почти 10 Мб, а только английский - всего 2 Мб. Полная же версия словаря этого релиза с правилами синтаксического анализа и средствами перевода с языка на язык весит уже 28 Мб.

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

Что необходимо иметь для компиляции словаря

Во-первых, необходимо иметь исполнимый модуль компилятора (он входит в состав платной версии SDK)

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

Файлы описания словаря - кодировки и локаль

Многоязыковая поддержка в проекте основана на использовании UNICODE для представления символов в строках. Описание словаря - это обычные текстовые файлы, которые можно править в обычном текстовом редакторе. Конечно, вопрос используемой кодировки возникает, как только необходимо включить в словарь информацию не на английском языке. Однобайтовые кодировки, основанные на таблицах перекодировки (кодовых таблицах), использовать в данном случае очень неудобно, так как обычный (plain) текстовый ASCII файл не хранит информацию о кодовой странице для текста.

Начиная с версии 0.82, компилятор словаря полностью поддерживает UNICODE-кодировки в исходных текстах. В качестве основной рекомендуется использовать utf-8, так как его базовая поддержка есть в стандартных программах ОС. Применение utf-8 для исходных файлов снимает вопрос о том, в какой кодировке заданы национальные символы - например, для русского или французского языков. Для английского текста кодировка utf-8 дает результат, абсолютно идентичный стандартному ASCII.

Если же файл имеет не является UNICODE, то применяется текущая кодировка для пользовательской сессии. Например, для русской локали в Windows это cp1251, для французской основной локали - iso-8859-1. Разумеется, если тест набран в Блокноте и сохранен как ASCII файл в русской локали, а компиляция словаря происходит в английской версии Windows - возникнут ошибки, о чем программа compiler сообщит (скорее всего сообщение об ошибке будет говорить об отсутствии символа в алфавите).

Программа compiler определяет локаль сразу после старта на основе получаемой от ОС информации для текущего пользователя. Чтобы принудительно задать нужную локаль, отличающуюся от пользовательской (например, явно установить английскую en_EN), необходимо внести изменения в конфигурационный файл compiler.ini.

По ходу трансляции на консоль выводятся сообщения с символами из разных алфавитов. В принципе, ничего страшного не произойдет, если в консоли эти сообщения получатся нечитаемыми. Однако поправить ситуацию очень легко, так как стандартные средства ОС Windows (для линейки NT) стандартно содержат поддержку UNICODE для консоли, а программный код проекта умеет выводить UNICODE в окно текстовой консоли.

Допустим, используется английская версия Windows. Русские буквы в консоли отображаются некорректно. Открыв окно консоли, необходимо установить шрифт, поддерживающий UNICODE (Lucida Console) вместо стандартного:

Все, теперь запускаете трансляцию словаря и видите символы национальных алфавитов без каких-либо дополнительных манипуляций:

Компиляция словаря

После установки SDK в папке \exe вы найдете программу compiler.exe - это компилятор словаря. Для Linux в этой же папке находится файл compiler. Функционально они полностью идентичны.

Для получения короткой справки наберите в командной строке

ygres

Результат будет примерно таким (для MS Windows XP):

Список опций можно получить, набрав

ygres -h=1

Для компиляции нужно иметь файлы описания словаря. После установки SDK они находятся в подкаталоге \dictionary.src.

Для удобства в каталоге \scripts\dictionary собрано несколько командных скриптов для MS Windows и Linux. К примеру, запустите

.\scripts\dictionary\russian.cmd

Этот скрипт содержит команды для полной компиляции русской версии словаря. Опция -o включает внутреннюю оптимизацию словаря, -j=2 задает режим вывода диагностических сообщений по ходу компиляции. Для компиляции в Linux запустите в этом же каталоге скрипт ./russian.sh.

Начнется компиляция словаря (скриншот для MS Windows XP):

Для Win98 дела обстоят аналогично:

Трансляция занимает несколько минут на машине P-IV 2.8 GHz (бенчмарки здесь).

По окончании Вы увидите сообщение Translation completed.

Для MS Windows:

Бинарные файлы словаря записываются в каталог ...\sdk\bin-windows или .../sdk/bin-linux в зависимости от платформы (для архитектуры x64 это будут каталоги соответственно bin-windows64 или bin-linux64). Существует несколько модификаций словаря, для каждой есть свой генерирующий скрипт.

Другие опции

С помощью опции -j=3 можно выводить более детальную трассировку транслируемых элементов, то есть командная строка:

compiler -j=3 diction russian-lexicon

даст примерно такой эффект:

Таким образом можно иногда найти ошибку в исходных текстах словаря, если выдаваемая программой compiler диагностика не совсем понятна.

Если в командной строке присутствует опция -s, то поступающие на вход парсера словаря лексемы печатаются в файле журнала (а опция -n сопровождает этот листинг номерами строк). С помощью этих средств можно отлаживать непонятные ошибки с применением макросов, так как печатаемый в журнале текст содержит уже подставленные (или развернутые) макросы (см. техническое описание препроцессора iridium).

Опция -x=NNN позволяет указать кодовую страницу, которая применяется по умолчанию для исходных файлов словаря. По историческим причинам большинство файлов исходных словаря с кириллицей версий до 0.75 включительно определены в кодовой странице 866 (MSDOS). Для словаря версий с 0.80 по умолчанию принята кодовая страница кириллицы 1251 (стандартная в MSWindows) или (что предпочтительно) utf-8. Если применяется другая, не стандартная для данного релиза, кодовая страница, к примеру Win 847, то команда запуска компиляции словаря должна иметь такой вид:

ygres -x=847 ...

Опция -nolinks блокирует запоминание в словаре семантической сети (тезауруса), благодаря чему объем словаря сокращается (хотя при этом в поисковом движке не будут работать некоторые "умные" возможности типа автоматического перевода текста).

Опция -save_affixes сохраняет бинарный файл аффиксов (affixes.bin), который необходим для поискового движка FAIND при выполнении так называемого rooting'а, то есть приведения слов к возможным корням.

Опция -save_seeker генерирует файл с информацией для быстрого поиска в лексиконе для поискового движка. Предварительная генерация этой информации позволяет быстрее подготавливать поисковый движок к работе, хотя и требует на диске дополнительного пространства.

Опция -save_lemmatizer генерирует базу данных лемматизатора.

Опция -save_prefix_entry_searcher генерирует файл быстрого префиксного поиска для грамматического словаря. Эта же информация используется в алгоритмах нечеткого морфологического анализа и коррекции ошибок и опечаток.

Опция -reverse_links=false отключает автогенерацию обратных связей для тезауруса. В случае, когда обратные связи уже объявлены в словаре в явном виде, эта опция помогает сэкономить время компиляции.

Опция -preload=XXX позволяет загрузить данные из указанного словаря, так что в результате получим объединенный словарь. Эта же опция используется в сценариях перегенерации лемматизатора и таблиц префиксного поиска, см. опции -rebuild_lemmatizer и -rebuild_pes.

Опция -entry_redefinition=true позволяет компилятору игнорировать повторные определения словарных статей. Данная возможность используется вместе с -preload=XXX для объединения пользовательского словаря и базового.

Опция -save-paradigmas заставляет сохранить в бинарном файле словаря таблицы формообразования, благодаря этому становится возможной работа функции автозаполнения в Редакторе Словаря и соответствующий набор процедур API грамматического словаря. По умолчанию парадигмы не сохраняются.

Опция -rebuild_lemmatizer позволяет пересоздать базу данных лемматизатора. Она работает в паре с -preload, то есть загружает имеющийся словарь.

Опция -rebuild_pes перестраивает базу данных префиксного поиска. Для ее работы нужно указать загружаемый словарь с помощью опции -preload.

Словари русского языка

Скрипт russian.cmd создает словарь с тезаурусом, морфологическим и синтаксическим анализатором.

Скрипт russian-syntax.cmd позволяет пересобрать только морфологический и синтаксический анализаторы, не затрагивая лексикон.

Импорт словарных статей

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

Результаты компиляции словаря

В текущем каталоге (или в каталоге, указанном опцией -outdir) появятся файлы:

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

alphabet.bin - информация об алфавите.

diction.bin - скомпилированный лексикон и некоторая другая информация - в том числе данные для токенизатора.

lexicon.db - данные о частях речи, языках, грамматических категориях.

thesaurus.db - база данных тезауруса.

debug.bin - данные для интерактивного отладчика.

journal - текстовый файл с сообщениями по ходу трансляции (журнал).

_sg_api.h - файл с объявленными символическим константами для доступа из C++ кода к API грамматической машины.

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

seeker.bin - модуль быстрой лемматизации, используемый поисковым движком и частотным анализатором Empirika.

lemmatizer.db - база данных для лемматизатора.

prefix_entry_searcher.db - база данных для префиксного поиска в грамматическом словаре русского языка.

При использовании командных скриптов в каталоге ...\scripts\dictionary файлы результатов сохраняются в каталоге ...\bin-windows или .../bin-linux для 32-битных платформ и в ...\bin-windows64 или .../bin-linux64 для 64-битных.

Компиляция синтаксического анализатора

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

Для поддержки работы пошагового отладчика в файле debug.bin сохраняется дополнительная информация. Этот файл можно не включать в релизные версии дистрибутивов.

Полная пересборка словаря может занимать очень много времени. Чтобы ускорить цикл внесения изменений в синтаксический анализатор и синтезатор, компилятор словаря поддерживает специальный режим пересборки только правил. Данный режим активируется опцией -recompile_syntax. Примеры использования данного режима:

...\scripts\dictionary\russian-syntax.cmd - пересборка синтаксического анализатор для русского словаря

...\scripts\dictionary\english-syntax.cmd - пересборка синтаксического анализатор для английского словаря

...\scripts\dictionary\ru-en-syntax.cmd - пересборка синтаксического анализатора и правил перевода для англо-русского словаря

Компиляция фразовых статей

Собранные при компиляции тезауруса фразовые статьи могут подвергаться дополнительной обработке с целью извлечения грамматической информации в автоматическом режиме. Так как при этом используются модули, работа которых программируется данными в словаре, то для устранения зависимости от порядка объявлений обработка фразовых статей вынесена в отдельную утилиту ThesaurusNotes. Эта утилита запускается сразу после компиляции словаря соответствующими скриптами, например в ru-en.sh.

Проверка словаря

Проверить, что полученный словарьработоспособен, можно с помощью программы decompiler, которая загружает словарь, делает некоторый его статистический анализ и печатает результаты. Если словарь приготовлен с опцией -sg_lite, то проверить его можно только непосредственно с поисковым движком FAIND (к примеру, с одноименной поисковой консольной утилитойой).

Есть также возможность проверить отдельные части словаря (например, морфологический или синтаксический анализатор) в программе-отладчике.

Компиляция N-грамм

В состав словаря может входить база данных N-грамм, то есть статистическая информация о сочетаниях слов в реальных текстах. Формирование этой базы данных осуществляется программой empirika. Так как программа empirika при статистической обработке также использует морфологический анализатор, то генерация словаря с N-граммами выполняется в 2 этапа - сначала compiler компилирует словарь, затем empirika обрабатывает большой массив текстов и формирует базу N-грамм.

Тестирование собранной базы N-грамм возможно с помощью программы Lexicon в составе SDK.

Сборка Грамматического Словаря Русского Языка

Используемая в Грамматическом Словаре словарная база собирается также с помощью утилиты compiler. Единственный нюанс, который выделяет данный вариант словаря - подготовка примеров употребления, которые отображаются Грамматическим Словарем для каждой статьи.

Сами примеры употребления хранятся в тезаурусе. Для каждого слова может хранится несколько примеров употребления. Чтобы облегчить подготовку материала, написана специальная утилита Samples, которая принимает на вход набор предложений, выполняет для каждого морфологический анализ, выясняет роль каждого слова и формирует из исходного предложения набор примеров. Допустим, из единственного входного предложения:

Ранее учёные полагали, что первыми одомашнили кошек древние египтяне.

получится до 8 примеров употребления - каждое слово, относящееся к знаменательной части речи, получит это предложение как пример употребления:

грамматический словарь     грамматический словарь

Компилятор словаря оптимизирует хранение повторяющихся примеров, поэтому в тезаурусе будет сохранена единственная копия предложения.

Для выполнения морфологического анализа утилита подготовки примеров употребления использует API грамматического движка и загружает словарь.

В результате сборка Грамматического Словаря осуществляется итеративно. Сначала собирается базовый русский (или русско-английский) словарь. Затем утилита Samples загружает этот словарь, файл с предложениями и формирует текстовый файл с записями для тезауруса. Наконец, запускается специальный скрипт сборки Грамматического Словаря - он включает в этап сборки тезауруса сгенерированный файл с примерами.

Дополнительные материалы

Внутренний язык грамматического словаря

Компиляция пользовательских словарей

  © Elijah Koziev 2010
прикладные проекты на основе грамматического словаря API грамматической машины компоненты для доступа к грамматическому словарю условия получения SDK токенизатор и сегментатор морфологический анализ и синтез лемматизатор база N-грамм синтаксический анализатор словоформы морфология и синтаксис русского языка падеж число род совершенный и несовершенный вид экспорт в SQL формат экспорт в XML формат скрипт SQL словаря структура SQL словаря структура XML словаря компоненты для доступа к грамматическому словарю ORM Persistent Dictionary Library лемматизация стемминг примеры использования грамматического словаря склонение существительных в русском языке склонение русских прилагательных спряжение глаголов в русском языке поиск текста с учетом морфологии OCR подсистема расширенные регулярные выражения генератор текста генератор случайного текста и имитатор рандомизатор синонимизатор перефразировщик Статистика буквенных паттернов

Грамматический словарь русского языка



Грамматический словарь
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
требования: 512 Mb свободной памяти, 300 Мб на диске
размер:         34 Мб

  скачать грамматический словарь купить грамматический словарь SDK грамматического словаря
грамматический словарь русского языка



SDK Грамматического словаря



SDK Грамматического Словаря
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
размер:         13 Мб

SQL словарь (демо):
sqlite mysql oracle firebird mssql

скачать демо-версию SDK купить SDK API грамматического словаря



Поисковая система



Integra
настольная и сетевая поисковая система 

платформа:  Windows XP ... Windows 7
требования: 512 Mb свободной памяти
размер:         21 Мб

Дополнительные компоненты:
MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать поисковую систему SDK поисковой системыописание поисковой системы



SDK Поисковой системы



SDK Поискового движка
API для настольной и сетевой поисковая система 

платформа:  Windows XP ... Windows 7
размер:         17 Мб

Дополнительные компоненты:

MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать SDK SDK поисковой системы



Экранный переводчик



Translator
экранный переводчик

платформа:  Windows XP ... Windows 7
требования: 256 Mb свободной памяти
размер:         4.4 Мб

Дополнительные компоненты:
расширенный англо-русский словарь 6.4 Мб


скачать экранный переводчикописание экранного переводчика



изменено 29-Jul-12