Алгоритм поиска ключа в дереве формы

<< Показать Оглавление >>

Описание API      

Алгоритм поиска ключа в дереве формы

При голосовом заполнении сложных форм возникает проблема ввода значений полей, вложенных в группы (отдельные вкладки на форме или иные подобные элементы группировки). Проблема усугубляется, если поля имеют одинаковые названия (синонимы). Такие поля обязательно должны находиться в разных группах, иначе при произнесении синонима поля будет непонятно, к какому именно полю относится значение.

Для решения этой проблемы введены понятия

•группа элементов на форме

•фокуса элемента.

Они позволяют чётко определять, элементы какой группы пользователь заполняет в данный момент.

info

Подробные сведения о формате описания группировки элементов и управлении фокусом приведены в описании класса ContainerMetadata.

Все элементы на форме, описанные в метаданных, можно представить в виде дерева. Корневым узлом является сама форма, обычными узлами являются группы, а листьями — поля на форме.

info

Узлы — это элементы, содержащие другие дочерние элементы.

Листья — это элементы, не содержащие дочерних элементов.

Ниже рассмотрен алгоритм обхода дерева для поиска элементов в описании формы, соответствующих фразе пользователя.

Кратко основную идею можно объяснить правилом: «При заполнении полей, находящихся в какой-либо группе, следует произнести название этой группы. Тогда она станет активной».

 

После распознания фразы пользователя возникает несколько гипотез заполнения полей (в случае если произнесенная фраза соответствует сразу нескольким полям).

info

Гипотеза — это список групп, полей и их значений, которым может соответствовать произнесенная пользователем фраза.

Чтобы определить, какое поле заполнять, осуществляется поиск по дереву описания формы (метаданным). Обход дерева начинается с активного элемента. В самом начале этим активным элементом будет сама форма. Далее у активного элемента ищется родительская группа. Группой может быть и сам элемент, если он не является листом дерева.

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

Если для очередного элемента какой-либо гипотезы найден соответствующий узел или лист в данной группе, то все гипотезы, для которых не был найден соответствующий узел или лист, отбрасываются.

Если в рамках активного узла ни для одной из гипотез очередной элемент не найден, то осуществляется переход к родительскому узлу текущего активного узла и поиск повторяется уже в нём.

atten_red

Составное поле, хоть по факту и является узлом (имеет дочерние элементы), но при поиске родительского узла рассматривается как лист дерева.

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

Если в конце поиска остался единственный вариант заполнения полей, то эти поля и заполняются.

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

Если гипотез нет вообще, то фраза пользователя игнорируется.