|
<< Показать Оглавление >> Алгоритм поиска ключа в дереве формы |
![]()
|
При голосовом заполнении сложных форм возникает проблема ввода значений полей, вложенных в группы (отдельные вкладки на форме или иные подобные элементы группировки). Проблема усугубляется, если поля имеют одинаковые названия (синонимы). Такие поля обязательно должны находиться в разных группах, иначе при произнесении синонима поля будет непонятно, к какому именно полю относится значение.
Для решения этой проблемы введены понятия
•группа элементов на форме
•фокуса элемента.
Они позволяют чётко определять, элементы какой группы пользователь заполняет в данный момент.
Подробные сведения о формате описания группировки элементов и управлении фокусом приведены в описании класса ContainerMetadata. |
Все элементы на форме, описанные в метаданных, можно представить в виде дерева. Корневым узлом является сама форма, обычными узлами являются группы, а листьями — поля на форме.
Узлы — это элементы, содержащие другие дочерние элементы. Листья — это элементы, не содержащие дочерних элементов. |
Ниже рассмотрен алгоритм обхода дерева для поиска элементов в описании формы, соответствующих фразе пользователя.
Кратко основную идею можно объяснить правилом: «При заполнении полей, находящихся в какой-либо группе, следует произнести название этой группы. Тогда она станет активной».
После распознания фразы пользователя возникает несколько гипотез заполнения полей (в случае если произнесенная фраза соответствует сразу нескольким полям).
Гипотеза — это список групп, полей и их значений, которым может соответствовать произнесенная пользователем фраза. |
Чтобы определить, какое поле заполнять, осуществляется поиск по дереву описания формы (метаданным). Обход дерева начинается с активного элемента. В самом начале этим активным элементом будет сама форма. Далее у активного элемента ищется родительская группа. Группой может быть и сам элемент, если он не является листом дерева.
После этого для каждой из гипотез выбирается первый элемент гипотезы и в рамках него ищется соответствующий гипотезе узел или лист (при этом дочерние узлы не обходятся).
Если для очередного элемента какой-либо гипотезы найден соответствующий узел или лист в данной группе, то все гипотезы, для которых не был найден соответствующий узел или лист, отбрасываются.
Если в рамках активного узла ни для одной из гипотез очередной элемент не найден, то осуществляется переход к родительскому узлу текущего активного узла и поиск повторяется уже в нём.
Составное поле, хоть по факту и является узлом (имеет дочерние элементы), но при поиске родительского узла рассматривается как лист дерева. |
Поиск продолжается до тех пор, пока всем элементам из оставшихся гипотез не будет найдено соответствие, либо пока не будет достигнут корневой узел (при этом все гипотезы отбрасываются).
Если в конце поиска остался единственный вариант заполнения полей, то эти поля и заполняются.
Если таких гипотез окажется несколько, то приходит уведомление о распознавании нескольких значений.
Если гипотез нет вообще, то фраза пользователя игнорируется.