Skip to content

Синтаксис шаблонов

Dmitry Che edited this page Apr 4, 2016 · 3 revisions

Что это такое

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

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

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

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

Вот пример простейшего шаблона - *. Он обозначает, что под него подходит вообще любой запрос, состоящий из одного или нескольких слов.

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

Синтаксис шаблонов

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

* добр* утр* *

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

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

Динамические шаблоны и морфология

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

Звездочки

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

Ставить звездочку в середину слова нельзя.

Альтернативы

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

Опции

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

Перестановки

Обозначает, что слова в скобках могут идти в любом порядке. Например - {дуся как дела}

Ссылки

Позволяют указать, что в данной позиции должно идти что-то, что подходит под указанный шаблон. Например - скажи фразу $Text Здесь $Text - это ссылка на шаблон, который подходит под любой текст.

Еще пример - $Number плюс $Number - обозначает, что во фразе должно быть два числа, а между ними слово плюс.

Значения

Вы можете добавить к именованному шаблону некоторое значение, чтобы в коде модуля обработать его независимо от языка. Например: (понедельник:1 | вторник:2 | среда:3)

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

<module>
  <pattern name="DayOfWeek" value="(понедельник:1 | вторник:2 | среда:3)"/>

  <command id="my-week-command">
    <pattern value="* $DayOfWeek *"/>
  </command>
</module>

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

Markup weekDay = request.markup.get("DayOfWeek");
// weekDay.value будет содержать строку "1", "2" или "3"

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

Если ваш шаблон состоит из нескольких слов, то значение нужно присваивать вот таким образом: (по выходным):7

Повторения

Используйте конструкцию repeat, если хотите описать часть вашей фразы как повторяющуюся. Например: * repeat($Number). В таком случае в запросе окажется несколько частей фразы с именем Number (минимум одна).

Переименования

Если в вашем шаблоне один и тот же шаблон должен идти несколько раз, но вам нужно разделить их по именам, то вы можете использовать конструкции вида $N1::Number $N2::Number. В этом шаблоне есть два шаблона числа, но вы их четко разделите на первый и второй, использовав имена N1 и N2.

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