Использование сущностей в сценарии
Вы можете использовать сущности в сценарии несколькими способами:
Напрямую
Все сущности, найденные во фразе, доступны в сценарии через переменную $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
.
Рассмотрим сценарий. Выведем в отдельном сообщении название продукта, который хочет клиент, а также его тип.
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