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

Использование сущностей в сценарии

Вы можете использовать сущности в сценарии несколькими способами:

Напрямую

Все сущности, найденные во фразе, доступны в сценарии через переменную $entities. Из внешних JavaScript-файлов обращайтесь к ней как $jsapi.context().entities.

state: ProductInfo
q!: информация по продукту *
a: Информация по продукту: {{ $entities[0] ? $entities[0].value : "продукт не найден" }}

В интентах

Сущности можно использовать в качестве слотов в интентах.

При активации интента в переменную $parseTree._<имя слота> попадут справочные данные по соответствующему слоту.

подсказка
Если справочные данные по сущности не заданы, переменная будет содержать исходный текст, по которому найдено совпадение.
state: BuyProduct
intent: /купить
a: Действие: {{ $parseTree._Action }}, продукт: {{ $parseTree._Product }}

В паттернах

Сущности можно использовать в паттернах, ссылаясь на них как @<имя сущности> или @<имя сущности>::<имя слота>.

Для сущности, указанной в паттерне, автоматически создается слот, и она попадает в дерево разбора $parseTree. Значение сущности доступно в сценарии как $parseTree._<имя слота>.

state: ProductInfo
q!: * @Product::p1 *
a: Информация по продукту: {{ $parseTree._p1 }}

Кроме того, вы можете использовать конвертеры в сущностях. Для этого необходимо задать сущность через именованный паттерн с помощью тега patterns, а затем объявить для него конвертер. Например:

patterns:
$four = @four || converter = function() { return 4; }

В этом примере мы создали сущность @four, в которой объявили конвертер. Функция конвертера возвращает значение 4.

В сущностях

В JAICP сущности могут ссылаться на другие сущности.

Заполнение значения сущностей

Рассмотрим пример заполнения адреса клиента. Адрес состоит из двух составных частей: улица и номер дома.

В меню проекта перейдите на вкладку NLUСущностиМои сущности и создайте сущности:

  • street_name с паттернами: Ленина, Школьная, Центральная.
  • street с паттерном улица @street_name.

Теперь создадим сущность address, которая будет ссылаться на сущность street и на системную сущность @duckling.number: @street дом @duckling.number.

Допустим, что клиент вводит сообщение Улица Ленина. Поле Значение будет заполнено следующим образом:

  • Ленина у сущности street_name;
  • Улица Ленина у сущности street.

Если клиент вводит сообщение Улица Школьная дом 15, то Значение будет заполнено так:

  • Школьная у сущности street_name;
  • Улица Школьная у сущности street;
  • Улица Школьная дом 15 у сущности address.

Заполнение справочных данных

Допустим, у нас есть свой интернет-магазин, который занимается продажей фруктов и овощей. Будем использовать сущности, чтобы из запроса клиента выделить, какие именно овощи и фрукты нужны.

В меню проекта перейдите на вкладку NLUСущностиМои сущности и создайте сущности:

  • fruit с паттернами: (яблок*|ренет*), (банан*), (лимон*).
  • vegetable с паттернами: (картошк*|картох*|картофель), (томат*|помидор*).

Кроме того, в поле DATA для каждого паттерна добавим значение сущности в формате JSON. В это поле можно указать любую информацию, которая может быть нужна для сценария. В нашем случае мы будем указывать характеристики name и type, которые отвечают за название и тип продукта.

Например, для паттерна (банан*) укажите:

{
"name": "banana",
"type": "fruit"
}

Сделайте то же самое для каждого паттерна сущности vegetable. Например:

{
"name": "potato",
"type": "vegetable"
}

Теперь объединим эти сущности в сущность grocery. Создайте сущность grocery и в поле Справочник укажите паттерны @vegetable и @fruit.

Сущность grocery

Рассмотрим сценарий. Выведем в отдельном сообщении название продукта, который хочет клиент, а также его тип.

state: Start
q!: $regex</start>
a: Здравствуйте! В нашем магазине представлен широкий ассортимент овощей и фруктов. Что вы хотите?

state: Grocery
q!: * @grocery *
a: Название продукта: {{ $parseTree._grocery.name }}
a: Тип продукта: {{ $parseTree._grocery.type }}

Таким образом, если клиент напишет сообщение Картошку, то это сообщение будет распознано сущностью vegetable, на которую ссылается сущность grocery. Поле DATA у сущности grocery заполнится содержимым поля DATA сущности vegetable. Бот выведет сообщения:

  • Название продукта: potato
  • Тип продукта: vegetable