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


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

Использовать можно только именнованные паттерны. Ошибка: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

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

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