{
    "componentChunkName": "component---src-templates-doc-page-js",
    "path": "/docs/ru/Patterns/advanced_patterns/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Gatsby-doc-engine"}},"markdownRemark":{"id":"70967a87-69da-5383-b15e-244e3856c374","excerpt":"Расширенные элементы паттернов $pattern_name  — ссылка на именованный паттерн.?> Подробнее об именованных паттернах Использование в сценарии Объявление паттерна…","html":"<h1>Расширенные элементы паттернов</h1>\n<hr>\n<h2>$pattern_name</h2>\n<p><code class=\"language-text\">$название-паттерна</code> — ссылка на именованный паттерн.</p>\n<p class='warn'><a href=/1.11.7/docs/ru/Patterns/named_patterns  >Подробнее об именованных паттернах</a></p>\n<h3>Использование в сценарии</h3>\n<p>Объявление паттерна:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $thanks = (спасибо [и] [тебе|вам] [большое]|благодар*|спс|супер|супир|ура|отлично|молод*|умни*|пасиб*)\n    $ok = (окей|ок|okey|okay|o key|ok)\n    $you = (ты|вы|тебе|вам|тебя|тя|тибя|вас)\n    $my = (мой|моя|мое|моё|мае|маё|мне|мои|маи|мою|маю|моне|мане|манё|монё|меня|миня|моих|маих|моим|маим|моем|маем|моём|маём|мя|ма|мня|[со] мной)</code></pre></div>\n<p>Использование паттерна в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Thanks\n    <span class=\"token storageType\">q!:</span> *  $thanks\n    <span class=\"token storageType\">q!:</span> * $ok *\n    <span class=\"token storageType\">q!:</span> * {мне (понятно|понятненько|ясно|ясненько) [все|всё]} *\n    <span class=\"token storageType\">q!:</span> * {(понятно|понятненько|ясно|ясненько) (все|всё)} *\n    <span class=\"token storageType\">q!:</span> * [премного] благодарн* *\n    <span class=\"token variableParameter\">script:</span>\n        $reactions.answer(\"Рад помочь.\\nОстались ли у вас еще вопросы?\")</code></pre></div>\n<hr>\n<h2>~lemma</h2>\n<p><code class=\"language-text\">~lemma</code> проверяет все формы слова.</p>\n<p>Например, в паттерн <code class=\"language-text\">~яблоко</code> попадут слова: <code class=\"language-text\">яблоки</code>, <code class=\"language-text\">яблок</code> и др.</p>\n<p>Правило срабатывает на всех словоформах всех омонимов: слов, которые звучат и пишутся одинаково, но имеют разные значения или морфологическую форму.</p>\n<p>Например, паттерн <code class=\"language-text\">~печь</code> сработает на словоформах существительного <code class=\"language-text\">печь</code> (<code class=\"language-text\">печи</code>, <code class=\"language-text\">печью</code>) и глагола <code class=\"language-text\">печь</code> (<code class=\"language-text\">пеку</code>, <code class=\"language-text\">печешь</code>).</p>\n<p class='warn'>Из-за морфологического разнообразия языка использование этого паттерна может приводить к ложноположительным результатам.</p>\n<h3>Использование в сценарии</h3>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Delivery\n    <span class=\"token storageType\">q!:</span> * {(заказать/заказывать/заказ/~доставка/доставляете) [~еда] * [$cafe]} * $City *\n    <span class=\"token storageType\">q:</span> * $City *\n    <span class=\"token variableParameter\">script:</span>\n        if (!$session.address) {\n            $session.address = {};\n        }\n        $session.address.city = $parseTree.City[0].value.name;\n    <span class=\"token variableParameter\">go!:</span> ../../Delivery</code></pre></div>\n<hr>\n<h2>$morph</h2>\n<p><code class=\"language-text\">$morph&lt;часть речи и/или граммема></code> — проверяет грамматические свойства слова.</p>\n<p>Например, для паттерна <code class=\"language-text\">$morph&lt;С им ед></code>: <code class=\"language-text\">С</code> — существительное, <code class=\"language-text\">им</code> — в именительном падеже, <code class=\"language-text\">ед</code> — в единственном числе.</p>\n<p class='warn'>Вы можете указать одно или несколько свойств.</p>\n<p>Для парсинга морфологии используется <a href=\"http://aot.ru/docs/rusmorph.html\" target=\"_blank\" rel=\"noopener noreferrer\">библиотека АОТ</a>.</p>\n<h3>Использование в сценарии</h3>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">theme:</span> /Bank Information\n    <span class=\"token keyword\">state:</span> Bank Information\n        <span class=\"token storageType\">q!:</span> * $morph&lt;С> [нашего/вашего/этого] (банка) *\n        <span class=\"token storageType\">q!:</span> * (называется) [наш/ваш/этот] (~банк) *\n        <span class=\"token variableParameter\">go:</span> /</code></pre></div>\n<p class='warn'>Одно слово не обязательно заключать в <code class=\"language-text\">()</code>.</p>\n<hr>\n<h2>$regexp/regexp_i</h2>\n<p><code class=\"language-text\">$regexp/regexp_i&lt;литералы и метасимволы></code> — <a href=\"https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\" target=\"_blank\" rel=\"noopener noreferrer\">регулярное выражение</a> — шаблон, описывающий некий набор строк.\nШаблон состоит из литералов и метасимволов — символов со специальным, а не буквальным значением.\nВ <code class=\"language-text\">$regexp</code> или <code class=\"language-text\">$regexp_i</code> будут попадать строки, соответствующие шаблону.</p>\n<p><code class=\"language-text\">$regexp</code> — чувствительный к регистру букв, <code class=\"language-text\">$regexp_i</code> — нечувствительный. Оба элемента нечувствительны к использованию буквы <code class=\"language-text\">е</code> вместо <code class=\"language-text\">ё</code> и наоборот.</p>\n<p class='warn'><a href=https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html target=\"_blank\" rel=\"noopener noreferrer\">Синтаксис регулярных выражений</a> соответствует синтаксису, используемому в Java.</p>\n<h3>Использование в сценарии</h3>\n<p>Объявление паттерна для обнаружения любого слова в запросе:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $anyWord = $regexp&lt;.+></code></pre></div>\n<p>Объявление паттерна для обнаружения процентного значения:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $procent = $regexp&lt;\\b([0-9][0-9]?%?)\\b|\\b100%?\\b></code></pre></div>\n<hr>\n<h2>$entity</h2>\n<p><code class=\"language-text\">$entity&lt;именованная сущность></code> — преобразует в паттерн именованную сущность.</p>\n<p class='warn'><a href=/1.11.7/docs/ru/Patterns/named_entity  >Подробнее об именованных сущностях</a></p>\n<h3>Использование в сценарии</h3>\n<p>Объявление именованного паттерна:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">$roamingRegion <span class=\"token operator\">=</span> $entity<span class=\"token operator\">&lt;</span>RoamingRegions<span class=\"token operator\">></span> <span class=\"token operator\">||</span> converter <span class=\"token operator\">=</span> RoamingRegionTagConverter</code></pre></div>\n<p>Использование в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Проблемы\n            <span class=\"token storageType\">q!:</span> *{$problems * роуминг*}*\n            <span class=\"token storageType\">q!:</span> *{$someProblems * $roamingRegion}*\n            <span class=\"token variableParameter\">script:</span>\n                $temp.messageForOperator = 'Пользователь испытывает проблемы с роумингом';\n            <span class=\"token variableParameter\">a:</span> По этому вопросу Вас может проконсультировать специалист.\n            <span class=\"token variableParameter\">go!:</span> /ПереключениеНаОператора</code></pre></div>\n<p>Здесь <code class=\"language-text\">RoamingRegions</code> — название справочника, <code class=\"language-text\">RoamingRegionTagConverter</code> — название конвертера.</p>\n<p class='tip'>При подобном объявлении именованного паттерна в <code class=\"language-text\">$parseTree</code> появляется элемент <code class=\"language-text\">value</code>, куда обычно записывается id или значение из справочника.</p>\n<p class='warn'>Правило <code class=\"language-text\">$entity</code> записывает в <code class=\"language-text\">value</code> только идентификатор сущности, а список ассоциированных значений содержится в справочнике.</p>\n<hr>\n<h2>$Pattern::Alias</h2>\n<p><code class=\"language-text\">$Pattern::Alias</code> — позволяет задать псевдоним для токена, под которым токен будет помещен в <code class=\"language-text\">$parseTree</code>.</p>\n<h3>Использование в сценарии</h3>\n<p>Рассмотрим пример <code class=\"language-text\">$Number::Hour</code>: паттерн <code class=\"language-text\">$Number</code> будет интерпретироваться в <code class=\"language-text\">parseTree</code> как <code class=\"language-text\">Hour</code>.</p>\n<p>Сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token storageType\">q!:</span> я приду в $Number::Hour</code></pre></div>\n<p>Запрос пользователя:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Я приду в 7</code></pre></div>\n<p>Дерево разбора:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"tag\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"root\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"pattern\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"root\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"text\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"я приду в 7\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"words\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">\"я\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"приду\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"в\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"7\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"Hour\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">\"tag\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Hour\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"pattern\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Number\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"text\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"7\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"words\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n                <span class=\"token string\">\"7\"</span>\n            <span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"_Hour\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"7\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Дерево разбора без использования псевдонима для сценария <code class=\"language-text\">q!: я приду в $Number</code> имеет вид:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"tag\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"root\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"pattern\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"root\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"text\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"я приду в 7\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"words\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">\"я\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"приду\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"в\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"7\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"Number\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">\"tag\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Number\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"pattern\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Number\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"text\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"7\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"words\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n                <span class=\"token string\">\"7\"</span>\n            <span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"_Number\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"7\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Практичный прием использования <code class=\"language-text\">$Pattern::Alias</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span>\n    <span class=\"token storageType\">q!:</span> сколько будет $Number::minuend минус $Number::subtrahend\n    <span class=\"token storageType\">q!:</span> вычти $Number::subtrahend из $Number::minuend\n    <span class=\"token variableParameter\">a:</span> <span class=\"token constantCharacter\">{{ $parseTree._minuend - $parseTree._subtrahend }}</span></code></pre></div>\n<p>Здесь смысл <code class=\"language-text\">$Number</code> зависит от положения в запросе: вычитаемое может быть названо первым или вторым числом.</p>\n<hr>\n<h2>(один:1 | два:2 …​)</h2>\n<p><code class=\"language-text\">(один:1 | два:2 …​) </code> — соответствие различных семантик, позволяет задать значение для той или иной фразы.\nУказанное значение записывается в поле <code class=\"language-text\">value</code> для <code class=\"language-text\">$parseTree</code> того паттерна, в котором соответствие объявлено.</p>\n<h3>Использование в сценарии</h3>\n<p>Объявление паттерна:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">$price = ((бесплатн*|ноль|0):0|(семь|7):7|(двести|200):200) [руб*]</code></pre></div>\n<p>Сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token storageType\">q!:</span> {подключить услугу [за] $price}</code></pre></div>\n<p>Запрос пользователя:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Подключить бесплатную услугу</code></pre></div>\n<p>Дерево разбора:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n        \"tag\": \"root\",\n        \"pattern\": \"root\",\n        \"text\": \"Подключить бесплатную услугу\",\n        \"words\": [\n            \"подключить\",\n            \"бесплатную\",\n            \"услугу\"\n        ],\n        \"price\": [\n            {\n                \"tag\": \"price\",\n                \"pattern\": \"price\",\n                \"text\": \"бесплатную\",\n                \"words\": [\n                    \"бесплатную\"\n                ],\n                \"value\": \"0\"\n            }\n        ]\n    }</code></pre></div>\n<hr>\n<h2>$repeat</h2>\n<p><code class=\"language-text\">$repeat&lt;именованный паттерн></code> — вложенный паттерн может повторяться в тексте неограниченное количество раз.</p>\n<p class='tip'>Использовать можно только именованные паттерны. Иначе будет появляться ошибка: <code class=\"language-text\">Repeat can contain only named pattern like $repeat&lt;$Number>.</code></p>\n<h3>Использование в сценарии</h3>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $color = (красный/белый/синий/зеленый/желтый/черный)\n\n<span class=\"token keyword\">theme:</span> /\n    <span class=\"token keyword\">state:</span> asd\n        <span class=\"token storageType\">q!:</span> (мой/мои) любимы* цвет* это $repeat&lt;$color>\n        <span class=\"token variableParameter\">if:</span> $parseTree.color.length > 1\n            <span class=\"token variableParameter\">a:</span> Ого! Целых <span class=\"token constantCharacter\">{{ $parseTree.color.length }}</span>\n        <span class=\"token variableParameter\">else:</span>\n            <span class=\"token variableParameter\">a:</span> Почему именно <span class=\"token constantCharacter\">{{ $parseTree._color }}</span>?</code></pre></div>\n<hr>\n<h2>$oneWord</h2>\n<p><code class=\"language-text\">$oneWord</code> — любое слово, число или символ.</p>\n<p>Этот именованный паттерн доступен в любом проекте без объявления.</p>\n<h3>Использование в сценарии</h3>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Dialog\n    <span class=\"token storageType\">q!:</span> * $you * [меня] * не (понимае*|поняла|поняли) * !\n    <span class=\"token storageType\">q!:</span> [$oneWord] не то\n    <span class=\"token variableParameter\">go!:</span> /CatchAll/CatchALLState</code></pre></div>\n<hr>\n<h2>$nonEmptyGarbage</h2>\n<p><code class=\"language-text\">$nonEmptyGarbage</code> — произвольный текст.</p>\n<p>Отличие от паттерна <code class=\"language-text\">*</code> в том, что текст не может быть пустым, а также знаком препинания.</p>\n<p>Этот именованный паттерн доступен в любом проекте без объявления.</p>\n<h3>Использование в сценарии</h3>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">$Text = * $nonEmptyGarbage * || converter = $converters.textConverter</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Action\n                <span class=\"token storageType\">q:</span> $nonEmptyGarbage\n                <span class=\"token variableParameter\">go!:</span> /NextStep</code></pre></div>","frontmatter":{"title":"","description":null},"headings":[{"value":"Расширенные элементы паттернов"}]}},"pageContext":{"slug":"/docs/ru/Patterns/advanced_patterns/","previous":{"fields":{"slug":"/docs/ru/Patterns/about_patterns/"},"frontmatter":{"title":"","description":null}},"next":{"fields":{"slug":"/docs/ru/NLU_functions/NLU_functions/"},"frontmatter":{"title":"","description":null}}}},
    "staticQueryHashes": ["1209419333"]}