Skip to content

Динамические шаблоны

Dmitry Che edited this page Apr 4, 2016 · 1 revision

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

Пример

Например, если ваш модуль умеет запускать какие-то программы на компьютере с помощью голосовой команды "Запусти <название программы>", то вы можете заранее не знать названи всех программ, установленных у пользователя.

Для этого и нужна возможность генерации динамических шаблонов.

Как это выглядит

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

Например:

<pattern name="AppName" value="fuzzy://config:appsList">

В этом примере мы указали, что шаблон AppName содержит названия всех приложений, которые указаны в поле "appsList" в файле конфигурации вашего модуля. Таким образом, сам пользователь может создать такой список и после запуска Агрегата шаблон AppName будет автоматически сгенерирован для вашего модуля.

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

{
  "appsList" : ["Skype", "Калькулятор", "Браузер"]
}

Общий вид URI

URI для генерируемого шаблона имеет следущий общий вид:

<модификатор>://<тип контента>:<идентификатор контента>

Модификаторы

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

content

Этот модификатор приводит к генерации простого шаблона, в котором не учитывается морфология.

fuzzy

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

Типы контента

event

Этот тип указывает Агрегату, что он должен запросить контент для шаблона, отправив событие с именем, которое указано в части <идентификатор контента>.

То есть Агрегат пошлет событие с именем <идентификатор контента> и дождется ответа в формате JSON массива или JSON объекта (см формат ниже) и из него сгенерирует шаблон.

Ваш модуль должен слушать событие, чтобы ответить на него.

Например, если ваш модуль возвращает контент для динамического шаблона по событию "appsList", то вы должны указать в файле грамматики шаблон следующего вида:

<pattern name="AppName" value="fuzzy://event:appsList"/>

config

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

То есть Агрегат прочитает контент из файла конфигурации и сгенерирует из него шаблон.

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

<pattern name="AppName" value="fuzzy://config:appsList"/>

А в файле конфигурации тогда можно указать:

{
  "appsList" : ["Skype", "Блокнот"]
}

http

Этот тип позволяет сгенерировать шаблон из контента, получаемого с какого-то HTTP сервера. Сервер при этом обязан возвращать ответ в формате JSON объекта или JSON массива.

Идентификатор контента в этом случае содержит полный URL, по которому Агрегат будет делать GET запрос при генерации шаблона. Например:

<pattern name="AppName" value="fuzzy://http://myserver.com/appsList"/>

Вы также можете использовать https.

Формат контента

В качестве контента для генерации шаблона подходит или JSON массив, или JSON объект.

JSON массив

Массив должен содержать строки, которые нужно использовать в качестве контента шаблона. Например:

["Skype", "Браузер", "Калькулятор"]

Если вы используете модификатор content, то строки могут содержать шаблоны:

["(Skype|Телефон*):skype", "(Браузер|Хром*):chrome", "Калькулятор*:calc"]

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

Markup m = request.markup.get("AppName");
System.out.println(m.value); //Skype, Браузер или Калькулятор

JSON объект

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

Пример:

{
  "Skype" : 1, "Браузер" : 2, "Хром" : 2, "Калькулятор" : 3
}

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

Если вы используете модификатор content, то строки могут содержать шаблоны.

Russian Version (Русская версия)





IDE


English Version

Main Page

Modules

  • List of available modules

User Guide

  • Where to get

  • How to install

  • How to use

  • Setting up


Developer Guide

Aggregate Architecture

Events List

Command Line


How to Create a Module

  • Java
  • Javascript
  • Typescript
  • Groovy
  • Ruby

Functional Modules

  • Query grammar

  • Pattern syntax

  • Dynamic patterns

  • Standard patterns

Activation Modules

Speech Recognition Modules

Text-to-Speech Modules


IDEs

  • Developing in Eclipse
  • Developing in IntelliJ IDEA

Change Log

Clone this wiki locally