С помощью программы
decompiler (ее можно либо скомпилировать самостоятельно, либо
загрузить готовый исполнимый модуль в составе SDK) можно
выполнить простейший анализ содержимого словаря - распределение всевозможных
структурных элементов по категориям (например, словарных статей по грамматическим классам), а также экспортировать информацию в одном из поддерживаемых внешних форматов - XML, SQL, текстовый.
Изначально эта
программа являлась настоящим декомпилятором словаря, она позволяла из бинарного
образа получить текстовое представление на языке ПРИИСК, которое можно было снова компилировать
с помощью compiler.
Однако
со временем такая возможность оказалась невостребованной, а ее поддержка -
слишком обременительной, поэтому остался только код для анализа и экспорта XML/SQL содержимого
словаря. Мы используем эту утилиту для общего анализа словаря после
внесения в него большого объема языковой информации,
а также для проверки программного кода загрузки словаря.
Утилита написана на C++ и компилируется для нескольких платформ:
Исполнимый файл утилиты можно найти в подкаталоге exe (или exe64 для 64-битных платформ).
В каталоге ...\sdk\dictionary можно найти готовые скрипты decompile.cmd и decompile.sh, которые загружают словарь из соответственно \sdk\bin-windows или /sdk/bin-linux и сбрасывают результаты в \sdk\tmp. Скрипты sql.cmd и sql.sh выполняют экспорт словаря в формат SQL для заливки в СУБД (подробности далее).
Через пару минут работы decompile.cmd проанализированное содержимое словаря будет распечатано в нескольких текстовых файлах:
alphabet.map - содержимое алфавита
lexicon.map - содержимое
лексикона и лексемного автомата, то есть собственно словарь.
grammar.map - содержимое грамматического автомата, главным образом продукционные правила анализа и синтеза фраз.
prolog.map - содержимое всех баз данных пролог-машины.
speaker.map - содержимое голосового автомата (синтезатора речи) и голосовой грамматики.
Большинство из вышеперечисленных файлов имеет кодировку utf-8, поэтому содержимое многоязыковых словарей можно легко анализировать без фокусов с кодовыми страницами. Стандартный блокнот ОС Windows поддерживает кодировки Unicode по крайней мере с версии XP.
Хочу особо отметить, что все частотные характеристики относятся именно к содержимому словаря, а не к языковой практике. Для того, чтобы определить, например, частоты употребления разных слов в произвольном тексте, необходимо воспользоваться модулем empirika.
Часть данных грамматического словаря может быть экспортирована в
реляционную базу данных - поддерживаются несколько версий существующих SQL СУБД. Экспорт выполняется в
текстовый файл в однобайтовой кодировке или utf8 в
виде SQL-скрипта, который
при своем исполнении административными средствами целевой СУБД создаст набор
таблиц и заполнит их данными.
Для экспорта используется опция
-sql "название_СУБД,параметр,параметр"
Название СУБД может принимать одно из значений:
mysql - для создания таблиц и загрузки данных в СУБД MySql
oracle - для создания схемы и загрузки данных в СУБД Oracle
firebird - для СУБД FireBird
mssql - для MS SQL
sqlite - для SQLite
unknown или не определенная СУБД - для генерации скрипта с командами заливки данных в стандартную SQL базу данных (без создания таблиц).
Дополнительные параметры:
utf8 - создавать файл в кодировке utf-8
bom - начинать файл в кодировке utf-8 с метки BOM.
Среди поддерживаемых СУБД только MS SQL нуждается в данном параметре,
чтобы автоматически распознать Unicode в скрипте без явного указания в
командной строке запуска sqlcmd.
ascii - создавать файл скрипта в кодировке ASCII.
noschema - не генерировать в создаваемом скрипте команды CREATE TABLE и т.п.
lemmatizator - создавать отдельный SQL скрипт для создания в базе данных лемматизатора
noformcoords - не создавать в схеме словаря таблицу SG_FORM_COORD.
mssql_bulk_insert - использовать оператор BULK INSERT при генерации скрипта для MS SQL, сохранять некоторые данные в отдельных csv-файлах - см. подробнее здесь.
loader - использовать оператор LOAD DATA INFILE для скрипта под MySQL - см. подробнее здесь.
Например:
-sql "firebird,utf8"
В результате выплнения экспорта будут созданы следующие файлы:
dictionary.sql - команды создания и заполнения всех таблиц, кроме лемматизатора
lemmatizator.sql - команды создания и заполнения таблиц лемматизатора
Скрипт \scripts\dictionary\sql.cmd
содержит все
необходимые опции для экспорта в SQL. Для Linux аналогичную работу выполняет скрипт sql.sh.
Содержимое создаваемого утилитой файла ...\tmp\dictionary.sql можно условно
разбить на несколько крупных шагов: удаление таблиц для поддержки
изменений в структуре (по возможности используем DROP IF EXISTS или аналогичные средства),
создание таблиц, собственно заливка данных операторами INSERT, создание
индексов. Если в параметрах экспорта указана опция noschema, то пересоздание таблиц и индексов не выполняется.
Если для опции -sql задан параметр lemmatizator, то поддерживающие лемматизацию таблицы и данные создаются другим скриптом - в файле с именем lemmatizator.sql.
Созданный файл загружается в целевую СУБД
с помощью соответствующего инструмента этой БД. Для работы с
загруженным в БД словарем не нужны никакие дополнительные инструменты,
кроме средств языка SQL, включая хранимые процедуры на поддерживающих
эту возможность СУБД. Для удобства в подкаталоге ...\scripts\dictionary
есть отдельные командные скрипты для заливки данных в FireBird, MySQL,
Oracle, MS SQL, SQLite.
Загруженные и, возможно, отредактированные
в СУБД данные можно обратно выгрузить в текстовом формате описания
словаря, который понимает компилятор. Для этого используется утилита sql2sol.exe, написанная на Delphi. Для удобства использования в подкаталоге ...\scripts\dictionary есть командный файл sql2sol.cmd, который запускает экспорт и сохраняет результаты в подкаталоге ...\tmp. А, к примеру, скрипт rus-jap-sql.cmd собирает из результатов выгрузки бинарный русско-японский словарь с модулями полнотекстового перевода.
В прикладном коде работа со словарем в БД возможна любыми доступными
средствами, предоставляемыми используемой платформой. В некоторых
случаях следует обращать внимание на поддержку юникода в используемых
библиотеках. Непосредственно получение информации из словаря можно
осуществлять как с помощью SQL-запросов, так и через технологию LINQ с
поддержкой ORM Entity Framework.
С загруженным в SQL БД словарем можно также работать с помощью программы SQLex. Она предоставляет удобный интерфейс для добавления и удаления словарных и фразовых статей, связей в тезаурус:
Эта программа работает со словарем, загруженным в СУБД FireBird или MySQL. Благодаря использованию кодировки utf8 для текстовых полей в таблицах, можно работать с многоязычными словарями (на скриншоте показана работа с русско-японским словарем). Результаты ее работы сохраняются в SQL базе, а также могут быть скомпилированы прямо из программы с бинарный файл словаря, который используется всеми утилитами проекта.
Подробно о получении различной информации из словаря - склонении, спряжении, работе с тезаурусом - написано здесь.
Загруженный в SQL базу грамматический словарь
позволяет очень просто выполнять различные статистические расчеты -
именно таким образом были получены многие результаты, отраженные здесь.
Скрипты для загрузки демо-версии словаря для MySQL, Oracle, MS SQL и FireBird можно найти на странице загрузок. Эти скрипты формируют полную схему БД, но с урезанным лексиконом и тезаурусом.
Экспорт в формат XML выполняется при указании опции -xml в строке запуска утилиты.
При этом в указанном опцией -outdir формируются файлы:
lexicon.xml, lexicon.xsd -
полное содержимое лексикона в виде реляционных таблиц для загрузки в
СУБД, поддерживающей XML.
export_NN.xml -
набор XML файлов с объявлениями словарных статей, при этом размер
одного файла поддерживается относительно небольшим, чтобы программы
типа xml2sol могли комфортно работать с ними.
export - список сгенерированных файлов export_NN.xml
Файл lexicon.xml содержит список словарных статей в виде таблиц: class - грамматические классы, entry - шапки словарных статей, entry_form - грамматические формы статей.
Подробнее о реляционной структуре XML словаря и о работе с создаваемыми файлами написано здесь.
© Elijah Koziev 2010
Поисковая система
SDK Поисковой системы
Экранный переводчик
|
|
изменено 18-Sep-10 | ||||||||||||||||||||||||||||||||||||||