-
Notifications
You must be signed in to change notification settings - Fork 40
Синтаксис шаблонов
Это способ описания шаблонов фраз и команд, которые пользователь может сказать для запуска одной из команд модуля.
Шаблон позволяет описать возможные варианты пользовательских фраз в общем виде так, чтобы можно было не писать огромный список вариантов возможных запросов на естественном языке. К тому же, шаблоны позволяют затем вычленять из пользовательского запроса какие-то части внутри кода модуля.
Шаблоны являются языконезависимым средством представления человеческой речи в виде дерева, часто называемым семантическим. То есть представляющим смысл сказанного в текущем контексте.
Вот пример простейшего шаблона - *. Он обозначает, что под него подходит вообще любой запрос, состоящий из одного или нескольких слов.
Синтаксис шаблонов полностью совпадает с синтаксисом шаблонов голосового ассистента Дуся, что позволяет вам переиспользовать опыт создания скриптов для разработки модулей под Агрегат. Но грамматика Агрегата чуть шире, что позволяет вам переиспользовать шаблоны в нескольких командах, а также создавать свои именованные шаблоны и добавлять к ним некоторые значения, чтобы ваш код модуля был языконезависимым.
Чтобы писать шаблоны, нужно изучить их синтаксис. Он был разработан специально для работы с распознаваемой речью.
Вот пример простого шаблона:
* добр* утр* *
Под него подойдут любые фразы, которые начинаются с любых слов (первая звездочка). Затем должно идти слово, начинающееся с добр. Затем должно идти слово, начинающееся с утр. И заканчиваться наша фраза может опять же любыми словами (последняя звездочка).
Как видите, синтаксис интуитивно понятен. Но конечно же, он имеет гораздо более гибкие элементы, которые описаны ниже.
Вы можете генерировать шаблоны на лету без необходимости описывать их в файле грамматики, а также учитывать морфологию. Подробнее читайте в разделе Динамические шаблоны
Самый частый элемент. Звездочка обозначает любое количество любых символов, в том числе ни одного. Звездочку можно либо окружать пробелами - тогда она означает слово или несколько слов, либо ставить вплотную к слову в начале или в конце. Тогда она означает, что слово может начинаться и заканчиваться любыми символами.
Ставить звездочку в середину слова нельзя.
Позволяют описать альтернативные слова и словосочетания, которые могут идти в определенной позиции. Например - (утро|день|вечер|ночь)
Уровень вложенности - любой.
Позволяют указать, что какие-то слова и словосочетания необязательны во фразы, но могут присутствовать. Например - [привет|пока]
Обозначает, что слова в скобках могут идти в любом порядке. Например - {дуся как дела}
Позволяют указать, что в данной позиции должно идти что-то, что подходит под указанный шаблон. Например - скажи фразу $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.
- Разработка в Eclipse
- Разработка в IntelliJ IDEA
- List of available modules
-
Where to get
-
How to install
-
How to use
-
Setting up
- Java
- Javascript
- Typescript
- Groovy
- Ruby
-
Query grammar
-
Pattern syntax
-
Dynamic patterns
-
Standard patterns
- Developing in Eclipse
- Developing in IntelliJ IDEA