Компиляция словаря поисковой машины

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

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

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

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

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

Сколько оперативной памяти нужно иметь

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

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

Другие опции

Компиляция словаря для SQL back-end

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

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

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

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

Все платформо-зависимые функции, такие как файловые операции и вывод текста, вынесены на нижний уровень фреймворка LEM.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

Кстати говоря, Вы можете скачать бесплатные версии скомпилированных словарей для нескольких языков.

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

 

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

Во-первых, необходимо иметь исполнимый модуль компилятора Ygres - о том, как его получить, читайте здесь. Либо скачайте готовый модуль - он входит в состав SDK (подкаталог exe).

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

 

Сколько оперативной памяти нужно иметь?

Для версии 0.82 желательно не менее 128 Mb, так как компиляция полного словаря приводит к выделению почти 100 Мб памяти для программы ygres. Для Словаря версий 0.75 и 0.80 реальное значение максимальной выделенной памяти к концу компиляции немного превышает 180 Мб (см. скриншот). В более свежих релизах (начиная с 0.82) выполнена оптимизация по памяти, которая снизила требования к ресурсам, но возросший объем лексикона в словаре может увеличить объем расходуемой при компиляции оперативной памяти. Если оперативной памяти будет меньше, есть шанс не дождаться компиляции из-за начавшегося свопинга ОС. В этом случае можно посоветовать лишь убрать какую-то часть словаря (к примеру - английский лексикон) - см. руководство по модификации словаря.

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

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

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

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

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

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

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

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

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

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

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

ygres

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

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

ygres -h=1

Для компиляции нужно иметь файлы описания Словаря. После установки SDK они находятся в подкаталоге \sdk\dictionary.src. Для удобства в каталоге \sdk\build собрано несколько командных скриптов для MS Windows и Linux. К примеру, запустите

\sdk\build\russian-free.bat

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

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

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

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

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

Для MS Windows:

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

Другие опции

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

ygres -j=3 diction russian-lexicon

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

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

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

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

ygres -x=1251 ...

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

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

Опция -sg_lite позволяет сохранить словарь (файл diction.bin) в упрощенном формате, который понимает только поисковый движок FAIND. Другие утилиты проекта не смогут нормально работать с таким словарем. Упрощение внутреннего формата приводит к серьезной экономии на размере словаря (для релиза 0.80 экономия составляет 50% - облегченный словарь весит вдвое меньше полного).

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

Опция -sql=версия_СУБД геренирует SQL скрипты для заливки словаря в SQL базу данных. Параметр версия_СУБД определяет тип целевой СУБД, и может принимать одно из значений:

mysql - для создания таблиц и загрузки данных в СУБД MySql

oracle - для создания схемы и загрузки данных в СУБД Oracle

unknown - для генерации скрипта с командами заливки данных в стандартную SQL базу данных (без создания таблиц).

 

Компиляция словаря для SQL back-end

Начиная с версии 0.82 в проект начинают вводится средства для использования SQL сервера для хранения больших объемов информации для реализации серверного режима работы поискового движка. Одним из этапов реализации серверного режима является создание скрипта для заливки словаря в SQL СУБД. Генерация скрипта выполняется опцией -sql (см. здесь).

 

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

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

diction.bin - скомпилированный Словарь. Этот файл используется другими программами Проекта. Его также можно скачать с сайта (если Вы не меняли ничего в исходных текстах словаря).

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

_aa_rulz.cpp, _sx_tpu.cpp, _la_find.cpp, _aa_groupz.cpp - часть кода, скомпилированного с языка ПРИИСК в стандартный C++ (компилятор YGRES для повышения эффективности в наиболее узких местах грамматического конвейера генерирует процедуры на языке C++, которые вызываются другими модулями при грамматическом разборе). Эти cpp-файлы нужно перенести в каталог \LEM\AI\Ygres, и не забывать делать это после каждой перекомпиляции Словаря.

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

affixes.bin - справочник по аффиксам для поискового движка FAIND.

seeker.bin - двоичный файл для поискового движка FAIND, содержит сведения для быстрого поиска в лексиконе.

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

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

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

последние изменения 04.05.2007

  © Mental Computing 2010