$nlp.match
Метод выполняет классификацию текста в контексте указанного стейта.
Синтаксис
Метод принимает в качестве аргументов:
- Текст запроса.
- Полный путь к теме или стейту, в котором нужно выполнить классификацию.
$nlp.match("пока", "/");
Возвращаемое значение
- Сработал паттерн
- Сработал интент
{
"parseTree": {…},
"targetState": "/Order",
"pattern": "как [я могу] (оформить|сделать) заказ *",
"effectivePattern": "как сделать заказ *",
"score": "1.0",
"nBest": […],
"nluResults": {…},
"entities": […]
}
{
"parseTree": {…},
"targetState": "/Bye",
"pattern": null,
"effectivePattern": null,
"score": "1.0",
"nBest": […],
"nluResults": {…},
"intent": {
"id": 2014,
"path": "/пока",
"priority": 0,
"shared": false
},
"entities": […]
}
Метод возвращает объект, который содержит поля:
parseTree
— дерево разбора для запроса.targetState
— стейт, который сработал на запрос.pattern
— полный паттерн, который сработал на запрос. Имеет значениеnull
, если сработал интент.effectivePattern
— та часть паттерна, которая совпала с запросом. Имеет значениеnull
, если сработал интент.score
— вес паттерна или интента. Принимает значения от0
до1.0
.nBest
— массив из наиболее вероятных правил активации.nluResults
— объектnluResults
.intent
— информация о сработавшем интенте. Поле отсутствует, если сработал паттерн.entities
— массив из сущностей, распознанных в запросе.
По умолчанию поля nBest
, nluResults
, intent
и entities
содержат те же данные, что и $context.nBest
, $context.nluResults
, $context.intent
, $entities
.
Различия возможны, если вы используете слот-филлинг или переопределяете порядок срабатывания правил.
Если у классификации нет результатов, то метод возвращает null
.
$nlp.match и слот-филлинг
Если в сценарии запрос пользователя попал в интент со слот-филлингом и бот задал уточняющие вопросы:
- У объектов в массиве
$entities
появится дополнительное полеslot
— название слота, в который попала сущность. - У объекта
$context.intent
не будет поляpriority
.
Но если вы обработаете этот же запрос через $nlp.match
, то entities
и intent
в ответе метода не будут содержать этих изменений.
$nlp.match и правила активации
При использовании метода $nlp.match
правила активации всегда срабатывают в следующем порядке: сначала паттерны, затем интенты.
Если вы переопределили порядок срабатывания правил c помощью обработчика selectNLUResult
, это не повлияет на nBest
и nluResults
в ответе $nlp.match
.
Пример использования
Метод может использоваться для управления порядком классификации фраз в специфичных контекстах.
Например, есть сценарий, в котором бот предоставляет клиенту информацию о запрашиваемых акциях. Информация об акциях хранится в стороннем сервисе.
state: Promos || modal = true
# Выводим названия акций
a: {{$session.promos.join(", ")}}
a: Про какую из наших акций вам рассказать подробнее?
state: Get
event: noMatch
script:
$temp.match = $nlp.matchExamples($parseTree.text, $session.promos);
# Если нашли в запросе название акции — сохраняем и переходим в /PromoDetails
if: $temp.match && $temp.match.weight >= 0.2
script:
$session.promoSelected = $temp.match.example;
go!: /PromoDetails
# Если не нашли — пытаемся найти соответствие запросу из других стейтов
script:
$temp.match = $nlp.match($parseTree.text, "/");
# Если нашли совпадение с другим стейтом — переходим туда
if: $temp.match && $temp.match.score >= 0.2
script:
$parseTree = $temp.match.parseTree;
go!: {{$temp.match.targetState}}
# Если запрос не был распознан, выводим сообщение:
a: Извините, я не понял, про какую акцию вы хотели бы узнать.
Создадим стейт Promos
, в котором клиенту будет предложен список акций. Установим стейту флаг modal = true
для того, чтобы остаться в контексте этого стейта, пока не будет обработан запрос клиента.
Как было сказано ранее, информация об акциях хранится в стороннем сервисе, а не в сценарии бота. Поэтому использование паттернов для получения этой информации нецелесообразно. Вместо этого будем использовать стейт Get
с событием noMatch
, в который будут попадать нераспознанные запросы клиента.
Поскольку мы все еще хотим распознать фразу клиента для предоставления информации об акциях, будем использовать метод $nlp.matchExamples
для определения запрашиваемой акции и перенаправления диалога. Если к полученному запросу не удалось найти соответствующего названия акции, тогда используем метод $nlp.match
для распознания всей фразы. Если в этом случае соответствующей стейт также не был найден, выводим следующее сообщение:
Извините, я не понял, про какую акцию вы хотели бы узнать.
$nlp.match
, используется флаг modal = true
, то в результате вызова метода $nlp.match
будут учитываться только вложенные стейты.