$pattern_name
$название-паттерна
— ссылка на именованный паттерн.
Пример
Объявление паттерна:
patterns:
$thanks = (спасибо [и] [тебе|вам] [большое]|благодар*|спс|супер|супир|ура|отлично|молод*|умни*|пасиб*)
$ok = (окей|ок|okey|okay|o key|ok)
$you = (ты|вы|тебе|вам|тебя|тя|тибя|вас)
$my = (мой|моя|мое|мое|мае|мае|мне|мои|маи|мою|маю|моне|мане|мане|моне|меня|миня|моих|маих|моим|маим|моем|маем|моем|маем|мя|ма|мня|[со] мной)
Использование паттерна в сценарии:
state: Thanks
q!: * $thanks
q!: * $ok *
q!: * {мне (понятно|понятненько|ясно|ясненько) [все|все]} *
q!: * {(понятно|понятненько|ясно|ясненько) (все|все)} *
q!: * [премного] благодарн* *
script:
$reactions.answer("Рад помочь.\nОстались ли у вас еще вопросы?")
~lemma
~lemma
— начальная, словарная форма слова, относительно которой проверяются остальные формы.
Например, в паттерн ~яблоко
попадут слова: яблоки
, яблок
и др.
Правило срабатывает на всех словоформах всех омонимов: слов, которые пишутся одинаково, но имеют разные значения или морфологическую форму.
Например, паттерн ~печь
сработает на словоформах существительного печь
(печи
, печью
) и глагола печь
(пеку
, печешь
).
Из-за морфологического разнообразия языка использование этого паттерна может приводить к ложноположительным результатам.
Пример
state: Delivery
q!: * {(заказать/заказывать/заказ/~доставка/доставляете) [~еда] * [$cafe]} * $City *
q: * $City *
script:
if (!$session.address) {
$session.address = {};
}
$session.address.city = $parseTree.City[0].value.name;
go!: ../../Delivery
$morph
$morph<часть речи и/или граммема>
— проверяет грамматические свойства слова.
Например, для паттерна $morph<С им ед>
: С
— существительное, им
— в именительном падеже, ед
— в единственном числе.
Вы можете указать одно или несколько свойств.
Для анализа морфологии используется библиотека АОТ.
Использование в сценарии
theme: /Bank Information
state: Bank Information
q!: * $morph<С> [нашего/вашего/этого] (банка) *
q!: * (называется) [наш/ваш/этот] (~банк) *
go: /
Одно слово не обязательно заключать в ()
.
$regexp
$regexp<литералы и метасимволы>
— регулярное выражение — строка, которая является шаблоном, описывающим некий набор строк.
В $regexp
будут попадать строки, соответствующие шаблону.
Шаблон состоит из литералов и метасимволов — символов со специальным, а не буквальным значением.
Синтаксис регулярных выражений соответствует синтаксису, используемому в Java.
Пример
Объявление паттерна для обнаружения любого слова в ответе:
patterns:
$anyWord = $regexp<.+>
Объявление паттерна для обнаружения процентного значения:
patterns:
$procent = $regexp<\b([0-9][0-9]?%?)\b|\b100%?\b>
$entity
$entity<именованная сущность>
— преобразует в паттерн именованную сущность.
Использование в сценарии
Объявление именованного паттерна:
$roamingRegion = $entity<RoamingRegions> || converter = RoamingRegionTagConverter
Использование в сценарии:
state: Проблемы
q!: *{$problems * роуминг*}*
q!: *{$someProblems * $roamingRegion}*
script:
$temp.messageForOperator = 'Пользователь испытывает проблемы с роумингом';
a: По этому вопросу вас может проконсультировать специалист.
go!: /ПереключениеНаОператора
Здесь RoamingRegions
— название справочника, RoamingRegionTagConverter
— название конвертера.
При подобном объявлении именованного паттерна в $parseTree
появляется элемент value
, куда обычно записывается id или значение из справочника.
Правило $entity
записывает в value
только идентификатор сущности, а список ассоциированных значений содержится в справочнике.
$Pattern::Alias
$Pattern::Alias
— позволяет задать псевдоним для токена, под которым токен будет помещен в $parseTree
.
Пример
Рассмотрим пример $Number::Hour
: паттерн $Number
будет интерпретироваться в parseTree
как Hour
.
Сценарий:
q!: я приду в $Number::Hour
Запрос пользователя:
Я приду в 7
Дерево разбора:
{
"tag": "root",
"pattern": "root",
"text": "я приду в 7",
"words": [
"я",
"приду",
"в",
"7"
],
"Hour": [
{
"tag": "Hour",
"pattern": "Number",
"text": "7",
"words": [
"7"
]
}
],
"_Hour": "7",
}
Дерево разбора без использования псевдонима для сценария q!: я приду в $Number
имеет вид:
{
"tag": "root",
"pattern": "root",
"text": "я приду в 7",
"words": [
"я",
"приду",
"в",
"7"
],
"Number": [
{
"tag": "Number",
"pattern": "Number",
"text": "7",
"words": [
"7"
]
}
],
"_Number": "7",
}
Практичный прием использования $Pattern::Alias
:
state:
q!: сколько будет $Number::minuend минус $Number::subtrahend
q!: вычти $Number::subtrahend из $Number::minuend
a: {{ $parseTree._minuend - $parseTree._subtrahend }}
Здесь смысл $Number
зависит от положения в запросе: вычитаемое может быть названо первым или вторым числом.
(один:1 | два:2 …)
(один:1 | два:2 …)
— соответствие различных семантик позволяет задать значение для той или иной фразы. Указанное значение записывается в поле value
для $parseTree
, того паттерна, в котором соответствие объявлено.
Пример
Объявление паттерна:
$price = ((бесплатн*|ноль|0):0|(семь|7):7|(двести|200):200) [руб*]
Сценарий:
q!: {подключить услугу [за] $price}
Запрос пользователя:
Подключить бесплатную услугу
Дерево разбора:
{
"tag": "root",
"pattern": "root",
"text": "Подключить бесплатную услугу",
"words": [
"подключить",
"бесплатную",
"услугу"
],
"price": [
{
"tag": "price",
"pattern": "price",
"text": "бесплатную",
"words": [
"бесплатную"
],
"value": "0"
}
]
}
$repeat
$repeat<именованный паттерн>
— вложенный паттерн может повторяться в тексте неограниченное количество раз.
Использовать можно только именнованные паттерны. В противном случае Code вернет ошибку Repeat can contain only named pattern like $repeat<$Number>.
.
Пример
patterns:
$color = (красный/белый/синий/зеленый/желтый/черный)
theme: /
state: asd
q!: (мой/мои) любимы* цвет* это $repeat<$color>
if: $parseTree.color.length > 1
a: Ого! Целых {{ $parseTree.color.length }}
else:
a: Почему именно {{ $parseTree._color }}?
$oneWord
$oneWord
— любое слово, число или символ.
Паттерн доступен в любом проекте без объявления.
Использование в сценарии
state: Dialog
q!: * $you * [меня] * не (понимае*|поняла|поняли) * !
q!: [$oneWord] не то
go!: /CatchAll/CatchALLState
$nonEmptyGarbage
$nonEmptyGarbage
— произвольный текст.
Отличие от паттерна *
в том, что текст не может быть пустым, а также знаком препинания.
Паттерн доступен в любом проекте без объявления.
Пример
$Text = * $nonEmptyGarbage * || converter = $converters.textConverter
state: Action
q: $nonEmptyGarbage
go!: /NextStep