Формат записи контактов и теги
Требования к телефонной книге
Для корректной работы приложения контакты телефонной книги должны отвечать следующим условиям:
Поле 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 в виде строки, и осуществляется поиск, который содержит следующие шаги:
- Препроцессинг строки и NER (распознавание сущностей);
- Поиск с использованием полученных сущностей;
- Если в результате поиска приложение нашло несколько подходящих контактов, то запрашивается уточнение (фамилия, департамент, отдел или группа). Полученные уточнения (сущности) сохраняются в контекст.
Далее разберем шаги подробнее.
Препроцессинг строки и NER
На данном этапе полученный от ASR текст отчищается от лишних слов (которых нет в словаре), и к оставшимся словам добавляются соответствующие теги.
Полученный от ASR текст: фефелова оля возьмите потом Результат препроцесcинга: {слово:"фефелова", тег:"secondname"}, {слово:"оля", тег:"firstname"} Полученный от ASR текст: направление разработки медиа цэпэе Результат препроцесcинга: {слово:"направление", тег:"notag"}, {слово:"разработки", тег:"notag"}, {слово:"медиа", тег:"notag"}, {слово:"цэпэе", тег:"notag"}
Поиск с использованием полученных сущностей
Поиск разделен на следующие этапы:
- Раскрытие псевдонимов (alias). Например, "оля" → "ольга"; "цэпэе" → "cpe", "медиа" → "media";
- Составление комбинаций строк с полученными псевдонимами: "фефелова оля", "фефелова ольга"; "направление разработки медиа цэпэе", "направление разработки медиа cpe", "направление разработки media цэпэе", "направление разработки медиа cpe";
- Объединение слов с тегом "notag", и подстановка тега для фразы {слово:"направление", тег:"notag"}, {слово:"разработки", тег:"notag"}, {слово:"media", тег:"notag"}, {слово:"cpe", тег:"notag"} → {слово:"направление разработки media cpe", тег:"department"};
- Поиск по полученным строкам.
Если в результате поиска обнаружено несколько абонентов, то запрашиваются уточнения
Ниже представлена вводная информация о контексте.
Контекст содержит следующие поля:
- CallRef — выступает "идентификатором" сессии диалога, задается на стороне софтсвича;
- OldResult — список контактов, полученный при прошлой итерации поиска. При первой итерации он пустой, в последующих заменяет телефонную книгу (то есть поиск происходит по нему, а не по всей книге);
- NextTag — тег для поиска по подстроке, изначально соответствует "FirstName", далее меняет свое значение в зависимости от содержимого OldResult.
Если результат поиска содержит больше одного контакта, то полученный результат записывается в OldResult.
Для составления, уточнения и изменения NextTag происходит сравнение полей полученных контактов в следующем порядке:
- FirstName
- SecondName
- Department
- Group
- SubGroup
- ThirdName
Сравнение полей происходит до того момента, пока все значения полей не станут равны.
Первое "неравное поле" записывается в NextTag, и все уникальные значения для текущего поля используются в строке для уточнения (если их меньше 6).