ym88659208ym87991671
Расширенные элементы паттернов для смартапов | Документация SmartMarket
Skip to main content

Расширенные элементы паттернов

$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 — начальная, словарная форма слова, относительно которой проверяются остальные формы.

Например, в паттерн ~яблоко попадут слова: яблоки, яблок и др.

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

Например, паттерн ~печь сработает на словоформах существительного печь (печи, печью) и глагола печь (пеку, печешь).

note

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

Пример

 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<С им ед>: С — существительное, им — в именительном падеже, ед — в единственном числе.

note

Вы можете указать одно или несколько свойств.

Для анализа морфологии используется библиотека АОТ.

Использование в сценарии

theme: /Bank Information
state: Bank Information
q!: * $morph<С> [нашего/вашего/этого] (банка) *
q!: * (называется) [наш/ваш/этот] (~банк) *
go: /
note

Одно слово не обязательно заключать в ().

$regexp

$regexp<литералы и метасимволы>регулярное выражение — строка, которая является шаблоном, описывающим некий набор строк. В $regexp будут попадать строки, соответствующие шаблону.

Шаблон состоит из литералов и метасимволов — символов со специальным, а не буквальным значением.

note

Синтаксис регулярных выражений соответствует синтаксису, используемому в 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 — название конвертера.

danger

При подобном объявлении именованного паттерна в $parseTree появляется элемент value, куда обычно записывается id или значение из справочника.

note

Правило $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<именованный паттерн> — вложенный паттерн может повторяться в тексте неограниченное количество раз.

danger

Использовать можно только именнованные паттерны. В противном случае 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
Обновлено 15 июля 2022

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней