Трансформация текста

Движок трансформаций

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

Алгоритмы трансформации текста представляют из себя компилируемые при сборке словаря программы на особом императивном-декларативном языке. Исполнитель этих алгоритмов является виртуальной машиной, позволяя выполнять единожды написанные сценарии преобразования на 32х и 64х битных платформах Windows, Linux, FreeBSD, Mac OS X.

Решаемые путем сценариев трансформаций задачи включают в себя полнотекстовый перевод и перефразировку текста.

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

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

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

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

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

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

Связь с правилами нисходящего структурного анализа

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

Сценарии верхнего уровня (процедуры)

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

Выполнение наборов из правил переписывания начинается по инициативе грамматического словаря и заключается в вызове пользовательской процедуры с предопределенным именем. Например, для синтаксического разбора предложения с созданием дерева вызывается процедура, имя которой задано как параметр SyntacticAnalyzer в определении языка. Для русского языка это будет процедура с именем SyntacticAnalysis_ru. Именно ее можно увидеть в исходном тексте учебного парсера, поставляемого в составе SDK словаря.

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

Группы правил переписывания

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

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

Продукционные правила (правила переписывания)

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

1. Явное задание лексемы в текстовом виде.

2. Задание словарной статьи, то есть кроме лексического совпадения проверяется часть речи - это играет роль при наличии омонимии.

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

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

Также доступны:

5. Логические операции, например проверка, что слово сопоставимо с одной из альтернатив или не является указанным.

6. Групповые операторы, напоминающие метасимволы +, *, {} регулярных выражений - выделение подгруппы слов, удовлетворяющих некоторым условиям, либо ограниченных словами, удовлетворяющими заданным условиям.

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

Условная часть правила переписывания

... раздел пишется ...

Резолютивная часть правила переписывания

... раздел пишется ...

Пользовательские функции

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

Объявление функции имеет такой синтаксис:

function возвращаемый_тип ИмяФункциитип аргумент1тип аргумент2, ... ) { тело_функции }

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

function возвращаемый_тип ИмяФункциитип аргумент1тип аргумент2, ... ) ;

Регистр букв не имеет значения, то есть НекаяФункция и некаяфункция обозначают одно и то же.

Встроенные типы данных

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

bool - логический тип

int - целое число

string - строка с максимальной длиной 28 символов

tree - синтаксическое дерево

trees - набор синтаксических деревьев

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

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

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

Для инициализации переменной типа bool, int, string используется простой синтаксис:

bool x = true;

int y = 123;

string z = "abc";

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

tuple xyz = [ true, 123, "abc" ];

Для создания объектов типа tree и trees используются встроенные функции wordform_create и var_create.

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

ИмяКласса:ИмяСтатьи { Координата:Состояние Координата:Состояние ... }

Например

Глагол:Хорохориться { Наклонение:Изъяв Время:Прошедшее Число:Ед Род:Жен }

Данная конструкция объединяет действие двух встроенных функций: wordform_create и wordform_set_coord.

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

Местоимение:Я { "ОН" Лицо:3 Число:Ед Род:Муж }

Составной оператор

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

Специальные переменные

В рамках продукционного правила доступны 2 специальные переменные.

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

if context { IsItVerb(_) } ...

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

Управляющие конструкции

Условный оператор

if ( условиеthen Оператор1 [ else Оператор2 ]

Условие должно быть логическим значением.

Обратите внимание, что условный оператор тоже является функцией. Он возвращает значение, которое вернула соответствующая ветка, либо void.

Цикл for

for i=НачЗнач to КонечЗнач ТелоЦикла

Например

for i=0 to 3 SomeFunction(i);

Переменная цикла будет последовательно принимать значение от НачЗнач до КонечЗнач с шагом 1, в вышеприведенном примере - от 0 до 3 включительно.

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

for i=НачЗнач to КонечЗнач step Шаг ТелоЦикла

Цикл while

whileУсловиеТелоЦикла

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

Выход из цикла

break

Этот оператор прерывает выполнение тела цикла и передает управление за его пределы.

Возврат значения из пользовательской функции

return Выражение

Встроенные функции

Вызов пользовательских и встроенных функций синтаксически ничем не отличается.

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

Логические функции

bool eqxy )

Сравнивает аргументы и возвращает его результат. Аргументы могут быть любого типа, кроме void. Типы аргументов должны быть одинаковыми.

bool eqixy )

Аналогичная eq, но для строк используется регистро-нечувствительное сравнение.

bool one_ofxabc, ... )

Возвращает true, если аргумент x равен любому из аргументов a, b и т.д. Перебор аргументов a, b, ... выполняется слева направо. После первого совпадения цикл просмотра аргументов прерывается.

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

if( one_of( wordform_class(x), ИНФИНИТИВ, ГЛАГОЛ ) ) then ...

bool log_orxy )

Логическое ИЛИ. Аргументы должны иметь тип bool.

bool log_andxy, z, ... )

Логическое И. Аргументы должны иметь тип bool. Количество аргументов переменное, то есть можно проверять одновременно несколько условий.

bool log_notx )

Логическое отрицание. Аргумент должен иметь тип bool.

Работа с деревьями

tree link_copytree Приемник, tree Источник [, string ИмяИзмерения [, int тип_связи ] ] )

Копирование веток из узла-источника в узел-приёмник в указанных измерениях с заданным типом связки.

Если имя измерения не задано, то будут скопированы ветки из всех измерений.

Если задано имя измерения, но не задан тип связи, то будут скопированы все ветки из этого измерения без отбора по типу связи.

int link_counttree Узелstring ИмяИзмерения [int ТипСвязи [lambfa-fun ПроверяльщикВетки ] ]  )

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

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

tree link_gettree Кореньstring ИмяИзмеренияint ИндексВетки )

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

tree link_getreftree Кореньstring ИмяИзмеренияint ИндексВетки )

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

int link_get_type2( tree Кореньstring ИмяИзмеренияint ИндексВетки )

Возвращает тип связи для i-го узла, связанного с корнем в указанном измерении.

tree link_addtree Кореньstring ИмяИзмеренияint ТипСвязиtree ДобавляемыйУзел1 [tree ДобавляемыйУзел2 ... ]  )

Добавление ветки или нескольких веток к корню в указанном измерении. Тип создаваемой связи задается.

tree link_removetree Кореньstring ИмяИзмерения [int ИндексВетки ] )

Удаление у узла одной или всех связей в заданном измерении.

Если не задан индекс удаляемой ветки, то будут удалены все ветки в измерении.

Работа с наборами деревьев

trees var_createtree t1tree t2, ... )

Создается и возвращается новый набор из деревьев, перечисленных в вызове функции.

tree var_gettrees xint i )

Возвращается дерево в заданной индексом i позиции набора x.

trees var_settrees контекстint itree корень )

Заменяет дерево в позиции i в наборе контекст на корень.

tree var_back( trees контекст [, int смещение] )

Возвращается дерево в конце набора контекст. Если задано смещение, то возвращается дерево, находящее слева от конца набора в соответствующей позиции.

Функция предполагает, что набор заканчивается специальным корнем _END, то есть смещения, в том числе по умолчанию 0, отсчитываются влево от этого корня.

trees var_addtrees контекстvariant узел1 [ , variant узел2 ... ] )

Справа к набору контекст добавляются новые узлы узел1узел2 и так далее. Количество добавляемых узлов может быть произвольным.

Добавляемые узлы могут передаваться как аргументы разных типов, в том числе - деревья tree, строки string, кортежи tuple и даже наборы trees. В случае наборов и кортежей функция разберет их на составные элементы и добавит их по отдельности.

int var_counttrees контекст )

Возвращает количество деревьев в наборе контекст.

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

trees var_removetrees контекстint позиция )

Из набора исключается дерево в указанной позиции, набор соответственно укорачивается.

trees var_prependtrees xvariant y )

Присоединяет дерево или деревья из y в начало набора. Если набор x начинается со специального узла _BEG, то добавление будет выполнено после него.

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

tree thesaurus_findtree узел, variant связь1 [, bool флаг_фильтра ] )

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

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

Если задан третий опциональный аргумент и его значение true, то при поиске в тезаурусе будет использован фильтр связей, заданный внешним кодом при вызове движка. Например, таким образом можно во внешнем коде определить тематику документа и задать фильтр на переводы согласно этой тематике.

tuple thesaurus_collect( tree узелint связь1 [, bool флаг_фильтра ] )

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

Работа с единичным узлом дерева

int wordform_classtree x )

Возвращается id грамматического класса для словоформы x.

Если  дерево x имеет ветки, то их содержимое игнорируется - функция анализирует только корневой узел.

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

tree wordform_packtuple x )

Упаковка отдельные словоформ, переданных как кортеж x, в одну версионную словоформу.

Первый элемент в списке x становится главной версией словоформы, остальные - альтернативами.

tree wordform_roottree x )

Делает копию корневого узла x и возвращает его. Используется для отсечения веток.

tree wordform_replacetree Деревоtree НовыйКорень )

В дереве Дерево заменяет корневой узел на НовыйКорень, возвращается результат подстановки.

tree wordform_createint ГрКлассstring ИмяСтатьи [string Лексема [, int Координата1int Состояние1int Координата2, ... ] ] )

Создается новая словоформа (корень дерева).

Входными аргументами определяются ее грамматический класс ГрКласс и имя словарной статьи ИмяСтатьи. Пара этих параметров однозначно задает словарную статью.

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

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

int wordform_get_coordtree Словоint Коорд )

Определение состояния координаты с указанным кодом Коорд у корневого узла Слово.

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

int wordform_language(  tree x )

Возвращается целочисленный код языка для корневой словоформы аргумента x.

В случаях, когда язык неизвестен, возвращается значение -1.

int wordform_entrytree x )

Возвращается целочисленный код словарной статьи для корневой словоформы.

Если словарная статья не известна, то возвращается значение -1.

string wordform_lexemtree x )

Возвращается строка - лексема в корневом узле аргумента x.

tree wordform_set_coordtree Узел, variant Координата0int Состояние0 [, variant Координата1int Состояние1, ... ] )

Задание (замена) координатных пар в корневой словоформе для дерева x.

Вместо пары int Координатаint Состояние можно подставить кортеж, который содержит список координатных пар.

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

tree wordform_clear_coordtree Узелint Координата0 [int Координата1, ... ] )

Удаляем все координатные пары с указанной координатой у корневой словоформы для дерева x.

tree wordform_refreshtree x )

Приведение лексического состояния корневого узла x в соответствии с установленными ранее (см. wordform_set_coord и другие функции) координатами.

tree wordform_copy_coordtree Приемникtree Источникint Координата0 [int Координата1, ... ] )

Копирование в корневую словоформу Приемник состояний указанных координат из словоформы корневого узла Источник.

tuple wordform_decomposetree x )

Разбирает словоформу в корневом узле x на части, если это - результат свертки. Возвращает кортеж, состоящий из элементов типа tuple.

В других случаях возвращает в кортеже копию корня x без веток.

string entry_nameint id_entry )

Возвращает имя словарной статьи по её ключу id_entry.

int entry_findint ГрКлассstring ИмяСтатьи )

Возвращает ключ словарной статьи, заданной через код грамматического класса и имя статьи.

int entry_count_formsint id_entry )

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

tree entry_get_formint id_entryint iform )

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

variant mark_get( variant Узелstring ИмяБлокаint ИндексПараметра )

Получение параметра из именованного контейнера маркировок в узле или наборе деревьев.

Аргумент Узел может иметь тип tree или trees, контейнеры для узла в дереве и для набора деревьев поддерживаются независимо.

Тип возвращаемого значения определен типом элемента в контейнере, заданным при добавлении элемента.

Если заданный именем блок маркировок не создан для узла, то исполнение аварийно прерывается.

int mark_count( variant Узелstring ИмяБлока )

Количество параметров в блоке маркировок в корневом узле или наборе деревьев.

Аргумент Узел может иметь тип tree или trees, контейнеры для узла в дереве и для набора деревьев поддерживаются независимо.

Вернет 0, если блока с нужным именем не существует.

void mark_clear( variant Узелstring ИмяБлока1 [, string ИмяБлока2 ] )

Очистка блоков маркировок в корневом узле или наборе деревьев.

Аргумент Узел может иметь тип tree или trees, контейнеры для узла в дереве и для набора деревьев поддерживаются независимо.

Имен блоков может быть больше одного.

Если блок не существует, то выполнение продолжается без ошибок.

variant mark_addvariant Узелstring ИмяБлока1variant Параметр1 [variant Параметр2 ... ] )

Добавление параметра в именованный контейнер маркировок в узле дерева или для контейнера деревьев.

Если указанного блока маркировок не существует, то он будет создан.

variant mark_copyvariant Приемникvariant Источник [, string ИмяБлока ] )

Копирование маркировок из узла дерева в другой узел, либо из одного набора деревьев в другой.

Если имя блока маркировок не указать, то будут скопированы все блоки маркировок.

Работа с генераторами уникальных значений

bool seq_createstring имя_генератора [, int нач_значение ] )

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

Возвращает true, если генератор успешно создан, либо false если генератор с таким именем уже существует.

int seq_getstring имя_генератора )

Получение очередного значения от генератора с заданным именем. Внутренее состояние генератора автоматически обновляется.

Работа с функциями

 fun_create(  )

 fun_call(  )

Вызов внешнего модуля преобразования

bool transform_module(  )

trees subst_cplx(  )

Доступ к базе N-грамм

bool ngrams_statusint Порядокbool Лемматизация )

Возвращается признак наличия базы для N-грамм заданного порядка и флага лемматизации.

int ngrams_findvariant Слово1variant Слово2, ..., bool Лемматизация )

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

int ngrams_filtertrees НаборДереьвевint НачПорядокint КонПорядокbool Нормализовать )

Фильтрация альтернативных словоформ в корневых узлах деревьев через N-граммы.

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

Проверка типа

bool type_is_voidvariant x )

Проверяет, что тип аргумента - void.

bool type_is_int( variant x )

Проверяет, что тип аргумента - целое число, int.

bool type_is_string( variant x )

Проверяет, что тип аргумента - строка, string.

bool type_is_tree( variant x )

Проверяет, что тип аргумента - дерево, tree.


bool type_is_trees( variant x )

Проверяет, что тип аргумента - набор деревьев, trees.


bool type_is_fun( variant x )

Проверяет, что тип аргумента - указатель на функцию.


bool type_is_tuple( variant x )

Проверяет, что тип аргумента - кортеж, tuple.


bool is_int( variant x )

Если аргумент - строка, то проверяет, что строку можно конвертировать в целое число, с основанием системы счисления 10.

Если аргумент - целое число, то просто вернет true.

Если аргумент - дерево, то проверяет тесктовое содержимое корня, и если его можно рассматривать как десятичное целое число, то вернет true.


Преобразование типа

void to_voidvariant xvariant y, ... )

Вычисляет последовательно все аргументы и более ничего не делает, возвращая void.

int to_intvariant x )

Преобразует аргумент в целое число.

Если аргумент является целым числом, то просто возвращает его значение.

Для строки делает ее преобразование в целое число по основанию 10.

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

При невозможности выполнить преобразование работа будет аварийно завершена.


string to_stringvariant x )

Преобразует аргумент в строку.

Если аргумент является строкой, то просто возвращает ее.

Для целого числа преобразует его в строку по основанию 10.

Если аргумент - дерево, то берет лексему из корневого узла и возвращает её.

В остальных случаях выполнение программы аварийно прерывается.

tree to_wordformvariant x )

Преобразует аргумент в дерево.

Если входной аргумент является деревом, то просто возвращает его, оставляя ветки.

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

В остальных случаях выполнение программы аварийно прерывается.


Работа с текущим контекстом


trees ctx_var()

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


tree ctx_rootint индекс )

Возвращается дерево в указанной позиции относительно текущего курсора для правила.


tree ctx_cursor()

Результат выполнения данной функции аналогичен ctx_root(0), то есть она возвращает дерево в начальной позиции текущей области для правила.


Арифметические функции

int arith_minusint xint y )

Возвращает целочисленный результат x-y.

int arith_mul( int xint y )

Возвращает целочисленный результат x*y по модулю, соответствующему размеру типа int для платформы.


int arith_mod( int xint y )

Возвращает остаток от деления x/y.


bool gt( int xint y )

Возвращает результат сравнения x>y.

bool lt( int xint y )

Возвращает результат сравнения x<y.


Работа со строками

bool str_icmpvariant xvariant y )

Сравнение двух строк без учета регистра.

Аргументы могут быть строками или деревьями. В случае аргумента-дерева будет взята лексема у корневого узла.


bool str_eq_beg( variant xvariant y )

Вернет true, если начало строки x совпадает со строкой y.

Если любой из аргументов является деревом, то берется лексема у его корня.


bool str_eq_end( variant xvariant y )

Вернет true, если конец строки x совпадает со строкой y.

Если любой из аргументов является деревом, то берется лексема у его корня.


bool str_eq_begi( variant xvariant y )

Вернет true, если начало строки x совпадает со строкой y без учета регистра символов.

Если любой из аргументов является деревом, то берется лексема у его корня.


bool str_eq_endi( variant xvariant y )

Вернет true, если конец строки x совпадает со строкой y без учета регистра символов.

Если любой из аргументов является деревом, то берется лексема у его корня.

int str_len( variant x )

Возвращает длину строки, если аргумент имеет тип string.

Если аргумент имеет тип tree, то возвращает длину лексемы в корне этого дерева.

В прочих случаях аварийно прерывает программу.


string str_left( variant xint count )

Возвращается подстрока, состоящая из count символов аргумента x, отсчитанных от её начала.

Если аргумент x имеет тип tree, то в качестве строки будет взята лексема корня.


string str_right( variant xint count )

Возвращается подстрока, состоящая из count символов аргумента x, отсчитанных от её конца.

Если аргумент x имеет тип tree, то в качестве строки будет взята лексема корня.


string str_midvariant xint i0int count )

Вырезает из первого аргумента подстроку, начиная с символа в позиции i0, длиной count символов.

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

Если начальная позиция i0 правее правой границы строки x, то будет возвращена пустая строка.

int str_index_of( variant astring b )

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

Поиск выполняется слева направо.


bool str_regexvariant astring b )

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

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

string str_catstring astring b [ , string c ... ] )

Возвращает результат объединения (конкатенации) строк-аргументов.


Работа с внешними параметрами (переменными окружения)


bool env_findstring имя_блокаstring имя_переменной )

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


variant env_getstring имя_блокаstring имя_переменной )

Возвращается значение переменной в указанном блоке.


void env_setstring имя_блокаstring имя_переменнойvariant значение )

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


void env_removestring имя_блока [, string имя_переменной] )

Из указанного блока удаляем заданную переменную. Если имя переменной не указано, то удаляем все переменные.


Работа с кортежами


tuple tuple_createvariant x1 [, variant x2, ... ] )

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

variant tuple_gettuple кортежint позиция )

Возвращается элемент кортежа в заданной позиции.

tuple tuple_set( tuple кортежint позицияvariant объект )

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

int tuple_count( tuple кортеж )

Возвращает число элементов в кортеже.

tuple tuple_add( tuple кортежvariant x [ , variant x2 ...] )

Добавление одного или более элементов в хвост кортежа.

tuple tuple_removetuple кортежint позиция )

Удаление элемента в заданной позиции из кортежа.

tuple tuple_inserttuple кортежint позицияvariant элемент )

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

tuple tuple_foreachtuple кортежfunction визитер )

Вызов функции визитер для каждого элемента в кортеже.

int tuple_findtuple кортежvariant x )

Возвращается индекс позиции элемента x в кортеже, поиск ведется слева направо.

Если элемент не найден, то возвращается -1.

int tuple_clear( tuple кортеж )

Очищает кортеж от содержимого.


Прочие функции

variant copyvariant x )

Делает глубокую копию аргумента и возвращает ее.

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

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

Переводчик

Перефразировщик

Алгоритмы русской морфологии

Синтаксис правил, управляющих работой синтаксического анализатора

API синтаксического анализатора

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

Лексикон

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

Syntax - консольный отладчик синтаксического анализатора

Debugger - оконная версия отладчика синтаксического анализатора

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


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



изменено 05-Jun-12