Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Формат записи контактов и теги

Требования к телефонной книге

Для корректной работы приложения контакты телефонной книги должны отвечать следующим условиям:

Поле FN должно соответствовать одному из шаблонов, где все слова должны быть на русском языке:

  • <фамилия> <имя> <отчество>
  • <фамилия> <имя>
  • <имя>

В поле CATEGORIES может содержаться от 0 до 3 наименований, разделенных символом ";" — названия отдела, группы и подгруппы.
Каждое наименование может содержать буквы русского и английского алфавитов, пробельные символы и тире, все остальные символы будут игнорироваться системой.

В поле TEL цифрами записывается номер абонента, все отличные от цифр символы будут игнорироваться.

Пример контакта

Телефонная книга в приложении заполняется из заранее подготовленной адресной книги с контактами в формате vcard.

Пример контакта в vcard:

BEGIN:VCARD
VERSION:4.0
UID:2368919030008402998
CATEGORIES:Отдел разработки;Космические аппараты;Микропроцессоры
FN:Петрова Маргарита Дмитриевна
REV:2023-09-12 09:06:38
TEL;TYPE=WORK:112
TITLE:Инженер-программист
END:VCARD

Пример сформированного контакта в телефонной книге секретаря:

{
      "UID": "2368919030008402998",
      "FirstName": "маргарита",
      "SecondName": "петрова",
      "ThirdName": "дмитриевна",
      "Department": "отдел разработки",
      "Group": "космические аппараты",
      "SubGroup": "микропроцессоры",
      "Number": "112",
}

Формирование контактов из vcard во внутреннее представление автосекретаря происходит следующим образом:

  • Поле UID берется без изменений.
  • Поле TEL записывается в поле Number.
  • Поле FN разбивается по пробелам и обрабатывается одним из способов, в зависимости от полученных слов:
    • Получено одно слово: оно записывается в поле FirstName. SecondName и ThirdName заполняются пустыми строками;
    • Получено два слова: первое записывается в поле SecondName, второе — в поле FirstName, и ThirdName заполняется пустой строкой;
    • Получено три слова: первое записывается в поле SecondName, второе записывается в поле FirstName, третье — в поле ThirdName.
  • Поле CATEGORIES разбивается на значения (разделенные ";"), и полученные значения заполняются в следующем порядке:
    • Первое в Department;
    • Второе в Group;
    • Третье в SubGroup.

Если полученных значений получается меньше трех, то недостающие поля заполняются пустой строкой.

Работа со словарем

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

  • firstname — имя;
  • secondname — фамилия;
  • thirdname — отчество;
  • department — отдел;
  • group — группа;
  • subgroup — подгруппа;
  • notag — слова, не относящиеся к остальным тегам (необходимо для собирания фраз, например, следующие слова ["отдел", "коммерции"] по отдельности имеют тег "notag", но фраза "отдел коммерции", уже будет иметь тег "department").

Алгоритм поиска

На входе поиск получает текст с ASR в виде строки, и осуществляется поиск, который содержит следующие шаги:

  1. Препроцессинг строки и NER (распознавание сущностей);
  2. Поиск с использованием полученных сущностей;
  3. Если в результате поиска приложение нашло несколько подходящих контактов, то запрашивается уточнение (фамилия, департамент, отдел или группа). Полученные уточнения (сущности) сохраняются в контекст.

Далее разберем шаги подробнее.

Препроцессинг строки и NER

На данном этапе полученный от ASR текст отчищается от лишних слов (которых нет в словаре), и к оставшимся словам добавляются соответствующие теги.

Полученный от ASR текст: фефелова оля возьмите потом
Результат препроцесcинга: {слово:"фефелова", тег:"secondname"}, {слово:"оля", тег:"firstname"}

Полученный от ASR текст: направление разработки медиа цэпэе
Результат препроцесcинга: {слово:"направление", тег:"notag"}, {слово:"разработки", тег:"notag"}, {слово:"медиа", тег:"notag"}, {слово:"цэпэе", тег:"notag"}

Поиск с использованием полученных сущностей

Поиск разделен на следующие этапы:

  1. Раскрытие псевдонимов (alias). Например, "оля" → "ольга"; "цэпэе" → "cpe", "медиа" → "media";
  2. Составление комбинаций строк с полученными псевдонимами: "фефелова оля", "фефелова ольга"; "направление разработки медиа цэпэе", "направление разработки медиа cpe", "направление разработки media цэпэе", "направление разработки медиа cpe";
  3. Объединение слов с тегом "notag", и подстановка тега для фразы  {слово:"направление", тег:"notag"}, {слово:"разработки", тег:"notag"}, {слово:"media", тег:"notag"}, {слово:"cpe", тег:"notag"} → {слово:"направление разработки media cpe", тег:"department"};
  4. Поиск по полученным строкам.

Если в результате поиска обнаружено несколько абонентов, то запрашиваются уточнения

Ниже представлена вводная информация о контексте.
Контекст содержит следующие поля:

  1. CallRef — выступает "идентификатором" сессии диалога, задается на стороне софтсвича;
  2. OldResult — список контактов, полученный при прошлой итерации поиска. При первой итерации он пустой, в последующих заменяет телефонную книгу (то есть поиск происходит по нему, а не по всей книге);
  3. NextTag — тег для поиска по подстроке, изначально соответствует "FirstName", далее меняет свое значение в зависимости от содержимого OldResult.

Если результат поиска содержит больше одного контакта, то полученный результат записывается в OldResult.

Для составления, уточнения и изменения NextTag происходит сравнение полей полученных контактов в следующем порядке:

  1. FirstName
  2. SecondName
  3. Department
  4. Group
  5. SubGroup
  6. ThirdName

Сравнение полей происходит до того момента, пока все значения полей не станут равны.
Первое "неравное поле" записывается в NextTag, и все уникальные значения для текущего поля используются в строке для уточнения (если их меньше 6). 


  • Нет меток