# Распознавание сущностей | Слот Synonym

## Назначение и общая информация

Слот Synonym позволяет совершать семантический поиск Сущность по таблице определенного формата с данными — Словарь — и сохранять найденную информацию в Контекстная переменная. Семантический поиск — распознавание различных словоформ синонимов, а не только полных совпадений с ними — доступен для языков, перечисленных в таблице <https://coda.io/d/\\_d\\_pM7PjYCmj#\\_tu9qV>. Для остальных языков работает поиск по полному совпадению.При выражении намерения естественным языком, Собеседник  может использовать в Реплика Сущность. К примеру, в Реплика“Как добраться в Питер на поезде” присутствует Сущность “город” (Питер) и “транспорт” (поезд). В некоторых случаях требуется выделять значения Сущность и записывать их в Контекстная переменная для последующего использования в Сценарий агента. Сущность могут быть выражены разными словами-синонимами. К примеру, “Питер” можно назвать “Санкт-Петербургом”, или “северной столицей”, а “поезд” — “электричкой” или “жд”.В некоторых сценариях требуется выделять значения Сущность и записывать их в Контекстная переменная для последующего использования в Сценарий агента. Для выделения Сущность  используется Слот Synonym в сочетании с функционалом Словарь.

![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-dUhrTqBNqW/4bc4d2e3939edd47b78df2924b0d63d60c33f2ba31b99c8141e7cb83cf8c44223ab1a677b33cc0f58621378e9353b5be086d61d0af937617fc43a5f600a6554af7fa6def50ca78a921836b1f9a19f6d71e72658affaa6f59e77eeebffb7065119e237429)

Примеры:

1. Необходимо определить полное официальное название города для передачи его во внешнюю систему. Для этого создается Словарь, состоящий из ряда  Сущность, каждая из которых соответствует определенному городу и содержит различные вариации его названия, например: название  Сущность — “Санкт-Петербург”, содержание — синонимы “Спб, Питер, Петербург, Ленинград”. Сообщение собеседника прогоняется Слотом Synonym через данный Словарь и найденное в нем название  Сущность используется далее в Сценарий агента.
2. Необходимо разделить Сценарий агента после определения Интента в зависимости от содержащейся в Реплика Сущность.
3. Интент: “Как найти < Сущность>?”.Набор  Сущность: “кабинет начальника”, “гардеробная”, “переговорная”, “кафетерий”, “кабинет врача”, “кухня”, “туалет”С помощью слота Synonym производится поиск  Сущность в Реплика, затем с помощью Слота Synonym производится деление Сценарий агента на несколько Ветка сценария в зависимости от  Сущность.

## Создание и настройки слота

### Атрибуты слота

![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-ohBgLhIvr1/bf6c921abeafe42599cb697992e89f979c6d8411f886df76c5bf65facc262ea2c903aa265d3539e9eb662d6b4137ab09f66a5d5e12511a4d28fd698c08acb56bfebc7d86cdd9e74c8d5d8402899b82624b97f510e832c7c550ba43dfbee3c259028da071)

1. NAME\* — название Слота, которое будет отображено в Дерево сценария. Максимальная длина значения поля — 40 символов.
2. Source\* — Выражение, дающее результат — строку (Проверяемая строка), в которой будет совершаться поиск Синонимов из Словарь. Может быть указано как полноценное Выражение с операторами, так и Выражение из одной Контекстная переменная, например {{ variable }} или {{ places\[0].name }}
3. RESULT VARIABLE\* — имя Контекстная переменная, в которую запишется найденная слотом информация. Формат: строка без скобок, например var1.
4. VOCABULARY\* —  Словарь из Ресурсы Компании.
5. Пар RESULT VARIABLE + VOCABULARY может быть несколько. Для добавления новой пары необходимо кликнуть по кнопке Add search.

![add search.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-Kd1ufv2W7w/31ddcb35d75b900d428723c65a1ff9de8c0c6a56c7c6927e6f38cc88b3ac3472dcc4d6596512737b81a6b442ba4f700649143441b4359dea655030b0a0bcc7c77707adf496c28bbfbbb8a8896b6e7fb0d0f2dff8dcd6e8f138f020544409de99a0e1d819)

При добавлении каждой дополнительной пары RESULT VARIABLE + VOCABULARY в поле VOCABULARY в выпадающем списке отображаются те Словарь Компания, которые не использованы в других полях VOCABULARY этого Слота. Таким образом, пар RESULT VARIABLE + VOCABULARY в одном Слот Synonym может быть максимум 20 (20- максимальное количество Словарь в Компания).

### Использование синтаксиса в Слоте

В Слоте Synonym допустимо использование Выражение и Выражение с управляющей конструкцией в поле Source.

## Словари

Словарь представляет собой объект Ресурсы Компании, то есть доступен из всех Агентов данной компании.О создании Словарь: Вкладка словарей — Vocabularies.

## Работа слота

При прохождении Слота Synonym выполняются следующие операции в указанном порядке:

1. Удаление из Контекст Чата все Контекстная переменная указанные в поле RESULT VARIABLE данного Слота;
2. Вычисление Выражение, указанное в поле Source, получение Проверяемая строка.
3. Если Выражение не удалось вычислить и получить строку (не существует Контекстная переменная, указанной в Выражение или некорректно описано Выражение), то в Контекст Чата будет создана Контекстная переменная error со значением Template rendering (source of synonym extraction) error occurred.
4. Приведение содержимого Проверяемая строка к нижнему регистру;
5. Разделение содержимого Проверяемая строка по словам с помощью специальной модели (например, по пробелу, по запятой и тп)  — получение массива слов;
6. Для каждой заполненной пары RESULT VARIABLE - VOCABULARY:\
   Поиск каждого слова из Проверяемая строка в Словарь , указанном в поле VOCABULARY, и запись результата в Контекстная переменная, указанную в соответствующем поле RESULT VARIABLE:
7. 1. В случае, если одно или несколько слов из Проверяемая строка совпадут
   2. 1. со словоформами Синонимов для языков, перечисленных в таблице Доступные для распознавания языки словарей
      2. или с точным значением Синонима для любых языков
      3. > Важно: регистр Синонимов в Словарь и Проверяемая строка не влияет на результат распознавания.
      4. Значением Контекстная переменная, указанной в поле RESULT VARIABLE является массив объектов, где каждый элемент массива — объект, содержащий положительный результат распознавания слова (положительный результат = слово было найдено в  Словарь).
      5. 1. Формат результата — JSON с информацией, в примере расписан только первый элемент, массива объектов-результатов:\
            \[\
            {'synonym': 'найденный в переменной синоним',\
            'reference': 'первый синоним в строке',\
            'entity': 'название сущности',\
            'start': порядковый номер первого символа найденного в переменной синонима,\
            'end': порядковый номер последнего символа найденного в переменной синонима },\
            ...\
            { \<N-й элемент - результат поиска> },\
            ]
         2. > Пример:\
            > \[\
            > {'synonym': 'honda',\
            > 'reference': 'HONDA',\
            > 'entity': 'car\_brand',\
            > 'start': 0,\
            > 'end': 5}\
            > ]
      6. В массиве может быть несколько элементов, их количество равно количеству найденных при проверке в Словарь совпадений, это возможно в следующих случаях (в т.ч. одновременно):
      7. 1. одно слово из Проверяемая строка соответствует нескольким  в данном Словарь (найдено в нескольких строках)
         2. > Пример: Проверяемая строка — мне нужно два билета до Краса\
            > Результат распознавания:\
            > \[\
            > {'synonym': 'Краса',\
            > 'reference': 'Красноярск',\
            > 'entity': 'Красноярск',\
            > 'start': 24, 'end': 29},\
            > {'synonym': 'Краса',\
            > 'reference': 'Краснодар',\
            > 'entity': 'Краснодар',\
            > 'start': 24,\
            > 'end': 29}]\
            > Слово Краса было найдено в 2 Сущность в одном Словарь.
         3. несколько слов из Проверяемая строка соответствует разным Сущность в данном Словарь
         4. > Пример: Проверяемая строка — хочу купить билеты из Москвы до Питера\
            > Результат распознавания:\
            > \[\
            > {'synonym': 'Москвы',\
            > 'reference': 'Москва',\
            > 'entity': 'Москва',\
            > 'start': 22,\
            > 'end': 28},\
            > {'synonym': 'Питера',\
            > 'reference':\
            > 'Санкт-Петербург',\
            > 'entity': 'Санкт-Петербург',\
            > 'start': 32,\
            > 'end': 38}\
            > ]\
            > Слово Москвы было найдено в 1 Сущность в Словарь, слово Питера было найдено в 1 Сущность в Словарь.
         5. несколько слов из Проверяемая строка соответствует одной Сущность в данном Словарь. Например, во фразе один город упоминается два раза, каждое упоминание — отдельное слово, которое даст свой объект-результат в переменной  RESULT VARIABLE
         6. > Пример: Проверяемая строка — купить билеты Москва Питер Москва\
            > \[\
            > {'synonym': 'Москва',\
            > 'reference': 'Москва',\
            > 'entity': 'Москва',\
            > 'start': 14,\
            > 'end': 20},\
            > {'synonym': 'Питер',\
            > 'reference': 'Санкт-Петербург',\
            > 'entity': 'Санкт-Петербург',\
            > 'start': 21,\
            > 'end': 26},\
            > {'synonym': 'Москва',\
            > 'reference': 'Москва',\
            > 'entity': 'Москва',\
            > 'start': 27,\
            > 'end': 33}]\
            > Слово Москва соответствует Сущность 'Москва' в Словарь  и присутствует в Проверяемая строка дважды.
   3. В случае, если ничего не будет найдено, Контекстная переменная, указанная в поле RESULT VARIABLE не будет создана в Контекст Чата.

<br>
