Детали реализации Jardic Pro |
English |
Структура файла словаря Jardic Pro |
|
Логическая организация файла словаряСловарный файл содержит множество записей, на которые идут ссылки из нескольких индексов. Записи могут иметь неограниченный размер Предусмотрены следующие типы записей:
Индексы используются для хранения отсортированных списков ключей (с точки зрения пользователя - списков слов), содержащих указатели на конкретные записи словарных статей. Ключи являются составными и могут содержать несколько сегментов, например: <произношение><слово><приоритет>. В Jardic Pro предусмотрены следующие индексы:
Физическая организация файла словаряФайл словаря Jardic Pro имеет страничную организацию. Предусмотрены следующие типы страниц:
Система управления данными Jardic ProСистема управления данными Jardic Pro, называемая далее DMS (Data Management System) выполняет функции, типичные для систем индексного доступа к данным. Доступ к страницам словарных файловDMS Jardic Pro реализован в виде двух слоев. Слой нижнего уровня обеспечивают доступ к страницам файла по номерам этих страниц. Слой верхнего уровня выполняет внешние запросы, поступающие от главной прикладной программы. Слой нижнего уровня выполнят следующие операции:
Внешние функции DMSВнешние функции DMS Jardic Pro обеспечивают поиск информации в словаре и заполнение его данными. Они делятся на следующие группы:
Ниже перечислены названия основных функции каждой из групп. По приведенным названиям функций можно судить о том, какие запросы они выполняют. Функции управления: Connect, Disconnect, CreateCursor, DestroyCursor, UseRecord, UseIndex, Compress, SetProgressProc и другие. Функции поиска в индексе: FindEQ, FindGE, FindLE, FindLT, FindGT, FindFirst, FindLast, FindNext, FindPrevious, FindByCounter, FindByPercentage. В качестве результатов выполнения этих функций возвращаются указатель на запись (статью словаря) и порядковый номер найденного ключа в индексе. Функции чтения данных: GetRecord. Функции вставки в индекс: InsertRecord, InsertKey, BeginBulkInsertKey, EndBulkInsertKey, StopBulkInsertKey. Функции сравнения ключей CompareKeys, GetCollator, GetCollatorVersion, CreateCollator0, CreateCollator1. Функции сравнения ключей экспортируются для внешнего приложения т.к. оно должны использовать тех же алгоритмы сравнения строк, что и DMS. Индексы Jardic Pro могут содержать до нескольких миллионов значений ключей. Поэлементное заполнения индексов такого размера неприемлемо из-за того, что построение индексов одного словаря может потребовать значительного времени. Для построения индексов словарей Jardic Pro используются оптимизированные функции массового заполнения (bulk insert). Для заполнения Лексикона используется предварительная сортировка ключей в оперативной памяти. Для заполнения других индексов используется оптимизация основанная на расчете гистограммы распределения ключей "на лету". При этом шаг гистограммы выбирается таким, что количество попадающих в него ключей соизмеримо с объемом кеша DMS. Используемый в Jardic Pro алгоритм обеспечивает заполнение индекса, сжатие его страниц и запись на диск со скоростью около 0,7 млн ключей в минуту для 1,6 ГГц процессора. СортировкаРабота с индексами Jardic Pro, в частности поиск в индексе и вставка ключей в индекс, тесно связана с функциями сортировки ключей. Сортировка текстовых элементов ключей основана на внутренней реализации Unicode Collation Algorithm (UCA) с использованием Default Unicode Collation Element Table (DUCET). Этот алгоритм обеспечивает правильную "словарную" сортировку слов с большими и маленькими буквами, диакритикой, внутренними знаками пунктуации (дефисами, апострофами и т.д.). В соответствии с UCA сортировка текстовых строк выполняется в 3 этапа:
Построение массивов 3-уровневых элементов сортировки осуществляется с использованием таблицы DUCET. Для корректной сортировки строк, содержащих пробелы, дефисы, апострофы и другие знаки пунктуации, в алгоритме используются элементы CE с переменными весами.
Словарная оболочка Jardic ProПод термином "словарная оболочка" здесь понимается программа с которой, работает пользователь и которая воспринимается как словарь Jardic Pro. Словарная оболочка выполняет следующие основные функции:
Jardic Pro обеспечивает работу с несколькими одновременно открытыми словарями. При этом на экране показываются "слитые" списки слов открытых в данный момент словарей. Слитые списки слов словарей разных языков являются виртуальными в том смысле, что они не строятся физически, но эмулируются с помощью специального алгоритма. Виртуальными являются следующие списки слов:
Некоторые отображаемые списки строятся только в оперативной. Это, в частности:
В отличие от других словарных программ Jardic Pro отображает списки, состоящие из нескольких колонок. Так, например, список слов по их чтению содержит 3 колонки: чтение слова, запись слова иероглифами, начало словарной статьи. Для отображения строк списка программа выполняет поисковые запросы к индексам словаря и запросы на чтение словарных статей. Благодаря эффективной реализации DMS эти запросы выполняются достаточно быстро, так что даже ручная "прокрутка" списка из нескольких миллионов строк с помощью скроллбара выполняется без заметного замедления. В одном из окон Jardic Pro отображается словарная статья, соответствующая текущей строке списка. Так как Jardic Pro может работать с импортированными словарями различного формата, то для показа словарных статей разного типа используются отдельные функции форматирования текста для его отображения (например, для отображения статей EDICT, DSL и т.д.). д.). Главной функцией каждого электронного словаря является поиск слов, соответствующих набранному тексту. В Jardic Pro эта функция реализуется путем поиска в виртуальном списке, общем для всех открытых словарей. Jardic Pro может искать переводы слов "на лету" под курсором в окнах MS Word и MS HTML (включая Internet Explorer и т.д.). Доступ к словам MS Word, точнее, к его объектной модели, осуществляется средствами COM Automation через Running Object Table (ROT). Доступ к объектной модели MS HTML осуществляется с помощью интерфейса IHTMLDocument2, полученного через Microsoft Active Accessibility (MSAA). При переводе слов "на лету" определяется тип текста под курсором. Если под курсором находится иероглифический текст, то программа пытается найти в словаре иероглифические слова, начинающиеся с текущего иероглифа, и захватывающие несколько следующих иероглифов. Для текста содержащего кану делается попытка приведения слова к "нормальной" словарной форме. Затем шаг поиска в словарях повторяется для текста, начинающегося с иероглифа на одну позицию левее, затем еще на одну позицию левее и т.д. Результаты успешного поиска накапливаются. Пользователю отображается перевод найденного слова максимальной длины. Могут быть показаны и промежуточные результаты, вплоть до найденных переводов отдельных иероглифов. Если под курсором находится не иероглифический текст, то программа пытается найти границы слова слева и справа от текущей точки. Поиск границ слова выполняется с использованием стандартного алгоритма Unicode поиска границ слов. Выделенное слово используется для поиска соответствующей строки списка в Лексиконе. Если слово присутствует в Лексиконе, то после этого выполняется полнотекстовый поиск во всех словарях и отображаются его результаты. Если в Лексиконе не найдено полностью совпадающее слово, то на экране отображается список Лексикона с ближайшим совпавшим словом. Полнотекстовый поиск выполняется следующим образом. Для каждого подключенного словаря строится список словарных статей, в которых присутствуют поисковые слова или иероглифы:
Списки словарных статей, найденных в каждом словаре, объединяются и сортируются в соответствии с приоритетами статей. Полученный результат отображается на экране. Импорт словарейИмпорт одного словаря выполняется в несколько шагов:
В зависимости от типа импортируемого словаря некоторые из перечисленных шагов могут не выполняться. Так, например, для словарей европейских языков не строятся иероглифические индексы. Построение индексов при импорте словарей осуществляется с использованием функций DMS для массового обновления: BeginBulkInsertKey, InsertKey, EndBulkInsertKey. Выделение отдельных слов текста при построении индекса всех встречающихся слов также осуществляется с с использованием алгоритма Unicode поиска границ слов. Программы Jardic Pro написаны на C++. Объем исходного текста программ составляет более 160 000 строк. |
© Загребельный В.А., 2007-2023 |