Тезаурус грамматического словаря

Назначение тезауруса в составе словаря

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

Визуализация тезауруса

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

визуализация тезауруса в консоли

SQL запросы к словарю в реляционной БД также можно считать способом визуализации тезауруса, например:

тезаурус и sql запрос

В Грамматическом Словаре Русского Языка возможно отображение в виде списков с разбивкой на группы по типу связей:

визуализация тезауруса

Более наглядный способ - в виде диаграммы:

тезаурус в виде диаграммы

Типы связей в тезаурусе

Связи могут быть:

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

2. Семантическими (гипернимы и гипонимы хром-металл, синонимы быстро-шустро, гендерные синонимы самка-самец, уменьшительно-ласкательные сестра-сестрёнка, усилительные/увеличительные рука-ручища, грубые кот-котяра).

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

4. Межязыковыми (dog-собака-chien-犬). Данный тип связей является основой построения машинного переводчика.

Для отдельных приложений могут потребоваться другие типы связей, например толкования для толковых словарей, транскрипции для переводов. Грамматический движок никак не ограничивает набор типов связей, по необходимости можно добавлять объявления новых типой связей в исходные тексты словаря. Набор связей в текущей версии словаря можно посмотреть в файле sg_net_links.sol в исходных текстах словаря. Подробные описания некоторых типов связей вынесены на отдельные страницы:

Родовые пары

Синонимы

Отношения обитатель-место обитания

Отношения экземпляр-целое

Отношения субъект-действие

Уменьшительные и увеличительные формы

Дети и детеныши

Деривативы

Нижеследующая таблица содержит примеры различных связей в тезаурусе:

тип связи в исходных текстах словаря целочисленная константа исходное слово результат
в_инф TO_INF_link объясненный объяснить
в_сущ TO_NOUN_link объяснять объяснение
в_инф TO_INF_link объясняя объяснять
в_несов TO_UNPERFECT объяснить объяснять
to_english TO_ENGLISH_link объяснять to explain
synonym SYNONYM_link объяснять растолковывать
synonym SYNONYM_link объяснять делать понятным
sex_synonym SEX_SYNONYM_link учитель учительница

Утилиты для работы с тезаурусом

Программа Грамматический Словарь позволяет просматривать связи слов:

русский тезаурус

С помощью программы SQLex можно просматривать и редактировать тезаурус, загруженный в SQL БД:

SQL редактор словаря

Для управления тезаурусом можно использовать программу thesaurus.exe в составе SDK грамматического словаря.

редактирование тезауруса

После запуска она загружает словарь с тезаурусом и отображает главный список словарных статей. Перемещаясь по этому списку, в дополнительных полях справа можно увидеть связанные словарные статьи (входящие и исходящие связи), а также добавлять произвольные связи.

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

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

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

Тестовый доступ к данным тезауруса и N-грамм легко получить с помощью консольной программы Lexicon. Для введенного с консоли слова программа печатает список связанных с ним слов, ищет частоту введенной N-граммы.

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

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

Файлы базы данных тезауруса

Компилятор словаря по умолчанию создает два файла базы данных тезауруса - thesaurus.bin и thesaurus.db.

В варианте хранения словаря в SQL СУБД используется несколько таблиц - подробности здесь.

Спецификации формата

Связи

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

link гр_класс1:статья1 {} <тип_связи> гр_класс2:статья2{}

Исходная и конечная точки связи задаются парами часть речи + имя словарной статьи, разделенных двоеточием.

Например:

link СУЩЕСТВИТЕЛЬНОЕ:УЧАЩЕНИЕ {} <в_инфинитив> ИНФИНИТИВ:учащать {} 

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

link ?:книга{} <to_english> ?:book{}

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

Для многословных статей используется другой формат объявления связи:

link complex ЖЖ <synonym> { живой журнал }

Фундаментальное различие между двумя типов связей состояит в том, что связи первого типа задаются обязательно между двумя известными словарными статьями. Связи второго типа задаются между двумя произвольными фрагментами текста. Поэтому грамматическая связь существительного Англия и прилагательного английский объявлена в исходных текстах как первый тип, а информация о ударениях в русских словоформах, отображаемая программой Грамматический Словарь, хранится в связях второго типа.

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

Повторное описание связи молча игнорируется компилятором.

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

использование препроцессора для объявления синонимов

Теги

Для каждой связи в тезаурусе можно задать дополнительные теги. Например, можно помечать синонимы, которые применимы в высокой речи или в вульгарной. Или отмечать категорию для переводов.

Теги для связей - это пары имя_тэга=значение_тэга.

Имена тегов должны быть объявлены перед использованием, чтобы компилятор словаря сразу обнаружил опечатки в исходном тексте:

automat sg
     {
      automat net
      {
       tag имя_тэга = { значение1 значение2 ... } // тэг со списком допустимых значений
       tag имя_тэга // тэг без значений
>         ...
      }
     }

Каждая связка может быть помечена произвольным количеством тэгов:

link класс1:статья1 <связка> класс2:статья2 tags { тэг1=значение тэг2=значение тэг3 тэг4... }

К примеру:

link существительное:кошка{} <синоним> существительное:кошечка{} tags { уменьш_ласк }

Другой пример использования тэгов - переводы. Обычно переводы зависят от тематики документа. Например:

синтакс описания связей в тезаурусе

Следующая иллюстрация демонстрирует использование тега transl_category для фильтрации перевода в программе Syntax:

фильтрация японско-русского перевода с помощью тегов

Флаги

Кроме тегов, есть другой путь сообщить грамматическому движку о дополнительных свойствах связей. Флаги похожи на теги своим синтаксисом - это также пары имя=значение. Но в отличие от тегов они не требуют объявления допустимых значений и предназначены для описания способов работы со связями.

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

Синтаксис объявления списка флагов для связи можно продемонстрировать на таком примере:

link complex @ "もちろん" <to_russian> { @ "Разумеется," } flag { SubstitutionTechnique=Literally SubstitutionPosition=OnlyAtBeginning }

Эта связь описывает замену вводного слова もちろん на Разумеется,. Флаги сообщают грамматическиму движку, что необходимо выполнять буквальную подстановку, без учета морфологии и синтаксиса SubstitutionTechnique=Literally. Кроме того, данная замена допустима только в самом начале предложения SubstitutionPosition=OnlyAtBeginning.

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

Генераторы связей

Связи в тезаурусе однонаправлены.

Это значит, что если внесена запись, что кошка является синонимом для кошечка, то обратное утверждение неверно без явного внесения соответствующей записи.

В целом можно выделить следующие классы связей.

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

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

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

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

Итак, можно автоматизировать процесс создания обратных связей, описав генераторы обратных связей. Существует 2 синтаксиса для простых генераторов и для многосвязных.

Описание простого генератора:

link generator класс1 <прямая_связка> класс2 -> <генерируемая_обратная_связка>

Такой генератор создаст при компиляции словаря связку класс2 <заданная_обратная_связка> класс2 из соответствующих прямых связей, подставив соответствующие статьи.

Можно проиллюстрировать генераторы на примере доформирования русско-английских переводов:

link generator СУЩЕСТВИТЕЛЬНОЕ <to_english> ENG_NOUN -> <to_russian>

link generator ENG_NOUN <to_russian> СУЩЕСТВИТЕЛЬНОЕ -> <to_english>

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

В исходных текстах словаря можно посмотреть на объявленные правила генерации связей в файле rus-links-generators.sol

Описание многосвязного генератора:

link generator { классA:A <связкаABклассB:B  классC:C <связкаCDклассD:D } -> X <новая_связкаY

В данном случае ABCDXY это определяемые пользователем локальные имена для удобства описания генератора. В правильном генераторе переменная C совпадает либо с A, либо с B. Далее, переменные X и Y должны совпадать с парой из множества ABC, D.

Пример генератора для создания переводов кана-русский:

link generator { jap_noun:A <to_russianсуществительное:B  jap_noun:A <to_kanajap_noun:D } -> D <to_russianB

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

Link: 猫<to_russian> КОШКА generates new link: ねこ<to_russian> КОШКА

Связи для омонимов

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

Рассмотрим такой пример. Два глагола - совершенного и несовершенного вида сбéгать и сбегáть - имеют разные формы противоположного вида:

сбегать - сбежать (быстро спускаться вниз по лестнице)

сбегать - бегать (добежать до магазина и вернуться)

Чтобы при объявлении связки выбрать инфинитив нужного вида, задаем его в фигурных скобках:

link инфинитив:сбегать { ВИД:СОВЕРШ }     <в_несов> инфинитив:бегать { ВИД:НЕСОВЕРШ }
     link инфинитив:сбегать { ВИД:НЕСОВЕРШ } <в_сов>   инфинитив:сбежать { ВИД:СОВЕРШ }

Объем тезауруса

Количество связей в текущей версии представлено здесь. Точное количество связей зависит от включенных в сборку словаря языков.

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

Доступ к тезаурусу

API грамматического движка имеет несколько вызовов для поиска записей в тезаурусе - см. к примеру sol_TranslateToNoun или sol_SeekThesaurus. Есть также функции для добавления новых связей sol_AddLink и удаления существующих sol_DeleteLink. Вместе с функцией создания новой фразовой статьи sol_AddPhrase и словарной статьи sol_AddWord это позволяет манипулировать загруженным в память тезаурусом. Сохранить на диск измененный тезаурус можно функцией sol_SaveDictionary.

Продукционные правила также могут работать с тезаурусом - см. описание актора context.

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

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

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

SQL запросы к тезаурусу

Для работы с тезаурусом можно использовать словарь, загруженный в реляционную базу данных. Среди таблиц, в которых хранится относящаяся к тезаурусу информация, особо выделяется SG_LINK - связи между словарными статьями. Каждая связь описывает отношение между двумя словарными статьями, и относится к одному из предусмотренных типов. Тип связи - это целочисленный признак, список которых хранится в таблице SG_STATE для id_coord=0.

Вот такой запрос:

запрос к тезаурусу

позволяет получить статистику по числу связей каждого типа

статистика по тезаурусу

Связи в тезаурусе можно разделить на несколько больших групп, среди которых есть семантические связи, в частности - отношения класс - член класса. К примеру, кошка является членом класса звери, а японский является членом класса страна происхождения. Полный список классов легко получить таким запросом:

SQL запрос к тезаурусу

Обратите внимание, что этот запрос реализует сортировку сгруппированных строк, что может не поддерживаться в Вашей СУБД - этот запрос выполнялся на FireBird v.2.1.

Результат выполнения для загруженного русского словаря примерно такой (показана только начальная часть списка):

типы связей в тезаурусе

Использование тезауруса в проекте

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

Одно из них - глубокая нормализация слов.

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

Если дополнить процесс поиском по тезаурусу словарных статей, связанных с данной посредством таких связей, как уменьш_ласк, груб, увелич, в_предикат, то получаем такие результаты:

кошечкой-кошечка-(уменьш_ласк)-кошка

Петькой-Петька-(груб)-Пётр

ручищами-ручища-(увелич)-рука

играющие-играющий-(в_предикат)-играть-(в_сущ)-игра

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

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

Тезаурус в переводчике

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

Вот результаты перевода некоторых тестовых предложений:

木の靴  -->  Деревянная обувь
     竹のかご  -->  Бамбуковая корзина
     日本のコンピューター  -->  Японский компьютер
     イタリアの車  -->  Итальянский автомобиль
     父の車  -->  Отцовский автомобиль

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

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

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

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

Гендерные связи в тезаурусе

Синонимы

Отношения экземпляр-целое в тезаурусе

Отношения субъект-действие в тезаурусе

Антонимы

Отношения класс-член класса в тезаурусе

Словарные и фразовые статьи

Лексикон

Словарь

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

API грамматического движка

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

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

Thesaurus

  © 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 Мб


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



изменено 16-Aug-11