Перейти к основному содержимому

$nlp.match

Метод выполняет классификацию текста в контексте указанного стейта.

Синтаксис

Метод принимает в качестве аргументов:

  1. Текст запроса.
  2. Полный путь к теме или стейту, в котором нужно выполнить классификацию.
$nlp.match("пока", "/");

Возвращаемое значение

{
"parseTree": {},
"targetState": "/Order",
"pattern": "как [я могу] (оформить|сделать) заказ *",
"effectivePattern": "как сделать заказ *",
"score": "1.0",
"nBest": [],
"nluResults": {},
"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 будут учитываться только вложенные стейты.

Пишите, я помогу!

Пишите, я помогу!

База знаний по документации