Что такое сопоставление шаблонов?
Сопоставление шаблонов можно настроить для группирования намерений и сущностей шаблонов в PatternMatchingModel
. С помощью этой группировки можно получить доступ к более сложным типам сущностей, которые помогают сделать распознавание намерений более точным.
Дополнительные сведения о поддерживаемых языковых стандартах см . здесь.
Шаблоны и точные фразы
В средстве сопоставления шаблонов используются два типа строк: "точные фразы" и "шаблоны". Важно понимать разницу между ними.
Точные фразы — это строки точных слов, которые вы хотите сопоставить. Например:
"Доставьте меня на этаж 7".
Шаблон — это фраза, которая содержит помеченную сущность. Сущности помечаются с помощью "{}", чтобы определить их место внутри шаблона, а текст внутри "{}" ссылается на идентификатор сущности. Если брать предыдущий пример, возможно, вам потребовалось бы извлечь имя этажа с помощью сущности с именем floorName. Для этого можно использовать следующий шаблон:
"Доставьте меня на этаж {floorName}"
Структура PatternMatchingModel
PatternMatchingModel
содержит идентификатор, ссылающийся на эту модель, список объектов PatternMatchingIntent
и список объектов PatternMatchingEntity
.
Намерения сопоставления шаблонов
PatternMatchingIntent
объекты представляют коллекцию фраз, которые используются для вычисления речи или текста в объекте IntentRecognizer
. Если совпадают фразы, IntentRecognitionResult
возвращенный имеет идентификатор сопоставленного PatternMatchingIntent
.
Сущности сопоставления шаблонов
Объекты PatternMatchingEntity
представляют ссылку на отдельную сущность и ее соответствующие свойства, указывающие IntentRecognizer
, как ее обрабатывать. Все PatternMatchingEntity
объекты должны иметь идентификатор, который присутствует в фразе или не совпадает.
Ограничения именования сущностей
Имена сущностей, содержащие символы ":", назначают роль сущности.
Типы сущностей
Сущность Any (любая)
Сущность Any соответствует любому тексту, который отображается в этом слоте независимо от текста, содержащегося в нем. Если мы рассмотрим наш предыдущий пример, с помощью шаблона "Доставьте меня на этаж {floorName}" пользователь мог бы сказать примерно следующее:
"Доставьте меня на этаж стоянки 2"
В этом случае сущности floorName будет соответствовать словосочетание "стоянка 2"
Эти сущности являются отложенными совпадениями, которые пытаются соответствовать как можно меньше слов, если он не отображается в начале или конце речевых фрагментов. Рассмотрим следующий шаблон:
"Доставьте меня на этаж {floorName1} {floorName2}"
В этом случае речевой фрагмент "Доставьте меня на этаж стоянки 2" зафиксирует соответствие и возвратит ответ: floorName1 = "стоянка" и floorName2 = "2".
Это может быть сложно обрабатывать дополнительный захваченный текст. Возможно, пользователь продолжил говорить и в речевой фрагмент записалась не только команда. "Доставьте меня на этаж стоянки 2. Да, Наташ, я в курсе, так что давай". В этом случае floorName1 будет правильным, но floorName2 получит значение "2. Да, Наташ, я в курсе, так что давай". Важно учитывать способ сопоставления сущностей и соответствующим образом настраивать сценарий. Тип любой сущности является самым простым и наименее точным типом сопоставления.
Сущность списка
Сущность List состоит из списка фраз, направляющих подсистему сопоставления с ней. У сущности List есть два режима: "строгий" и "нестрогий".
Предположим, у нас есть список этажей для лифта. Так как мы имеем дело с речью, мы добавляем записи с помощью лексического формата, а также.
"1", "2", "3", "вестибюль", "цокольный этаж, "один", "два", "три"
Если сущность идентификатора типа "List" используется в режиме "Строгий", подсистема совпадает только в том случае, если текст в слоте отображается в списке.
"Доставьте меня на этаж один" — соответствие.
"Доставьте меня на этаж 5" — несоответствие.
Важно отметить, что все намерение не будет соответствовать, а не только сущности.
Если сущность идентификатора типа "List" используется в режиме "Нечеткий", подсистема по-прежнему соответствует намерению и возвращает текст, который появился в слоте в речевых фрагментах, даже если он не находится в списке. Это совпадение полезно за кулисами, чтобы сделать распознавание речи лучше.
Предупреждение
Сущности нестрогого списка реализуются, но не интегрируются в часть распознавания речи. Таким образом, они будут соответствовать сущностям, но не улучшают распознавание речи.
Предварительно созданная целочисленная сущность
Сущность PrebuiltInteger используется, если в этом слоте должно появиться целое число. Он не будет соответствовать намерению, если целое число не удается найти. Возвращаемое значение является строковым представлением числа.
Примеры допустимых совпадений и возвращаемых значений
"Две тысячи сто пятьдесят пять" - > "2155"
"Один" -> "1"
"Раз" -> "1"
"четыре ноль семь один"- > "4071"
Если есть текст, который не распознан как число, сущность и намерение не будут соответствовать.
Примеры недопустимого соответствия
"Третий"
"Давай на первый этаж"
"Двойка плюс три"
"Тридцать три и что хочешь"
Рассмотрим наш пример с лифтом.
"Доставьте меня на этаж {floorName}"
Если "floorName" является предварительно созданной целочисленной сущностью, ожидается, что любой текст внутри слота представляет целое число. Здесь номер этажа будет соответствовать хорошо, но этаж с именем, таким как "лобби" не будет.
Группирование обязательных и необязательных элементов
В шаблоне разрешено включать слова или сущности, которые "могут" присутствовать в высказывании. Это особенно удобно для уточняющих слов, таких как "мне" или "меня". С функциональной точки зрения это мало чем отличается от жесткого кодирования множества комбинаций, но помогает сократить количество требуемых шаблонов. Необязательные элементы заключаются в квадратные скобки "[ ]". Укажите обязательные элементы с символами "(" и ")". Вы можете включить несколько элементов в одну группу, разделив их символом "|".
Чтобы узнать, как это уменьшит количество необходимых шаблонов, рассмотрите следующий набор:
"Доставьте на этаж {floorName}"
"Доставь меня на этаж {floorName}"
"Доставь меня на {floorName}"
"Доставь меня на этаж {floorName}, пожалуйста"
"Доставь меня на ярус {floorName}, пожалуйста"
"Доставь меня на {floorName}, пожалуйста"
"Привези меня на {floorName}, пожалуйста"
"Привези на этаж {floorName}, пожалуйста"
Все эти шаблоны можно сократить до одного шаблона с группированием и необязательными словами. Во-первых, можно группировать "to" и "the" в качестве необязательных слов, как так: "[to | the], и второй мы можем сделать "пожалуйста" необязательным, а также. Наконец, мы можем сгруппировать слова "доставь" и "привези" необходимым образом.
"(Доставь | Привези) меня на [этаж | ярус] {floorName} [пожалуйста]"
Кроме того, можно включить дополнительные сущности. Предположим, у нас многоуровневая парковка, и вы хотите сопоставить слово после {floorName}. Для этого можно использовать следующий шаблон:
"Доставьте меня на этаж {floorName}, [{floorType}]"
Необязательные компоненты также полезны, если вы можете использовать распознавание ключевых слов и функцию push-to-talk. Это означает, что иногда ключевое слово присутствует, и иногда это не будет. Предположим, что ключевым словом было слово "компьютер", тогда шаблон будет выглядеть примерно следующим образом.
"[Компьютер], доставь меня на этаж {floorName}"
Примечание.
Необязательные элементы удобны в использовании, но повышают вероятность конфликтов шаблонов. Это происходит, когда два шаблона могут соответствовать одной и той же произнесенной фразе. В этом случае проблему иногда можно решить, разнеся необязательные элементы по отдельным шаблонам.
Роли сущности
В шаблоне может возникнуть сценарий, в котором требуется использовать одну сущность несколько раз. Рассмотрим сценарий бронирования билетов на авиарейс из одного города в другой. В этом случае список городов один и тот же, но нужно понять, какой город является местом отправления, а какой — местом назначения. Для этого можно использовать роль, назначенную сущности с помощью символа ":".
"Забронируй билет на рейс из {city:from} в {city:destination}"
В результате такого шаблона будут получены две сущности с пометками "city:from" и "city:destination", но для целей сопоставления они обе будут ссылаться на сущность "city" (город).
Приоритет сопоставления намерений
Иногда несколько шаблонов соответствуют одному и тому же высказыванию. В этом случае подсистема обеспечивает приоритет шаблонов следующим образом.
- Точные фразы.
- Шаблоны, где больше сущностей.
- Шаблоны с целочисленными сущностями.
- Шаблоны с сущностями List.
- Шаблоны с сущностями Any.
- Шаблоны с более байтами, соответствующими.
- Пример. Шаблон "select {something} слева" будет выше приоритета, чем "select {something}".
Следующие шаги
- Начните с простого сопоставления шаблонов.
- Улучшение сопоставления шаблонов с помощью настраиваемых сущностей.
- Просмотрите наши примеры на GitHub.