SmartApp Framework поддерживает плагины. Плагин может расширять язык DSL, а также подменять или изменять компоненты приложения, например MainLoop или DialogueManager.
Плагин — это Python-пакет или модуль со специальным активационным методом.
Чтобы подключить плагин, добавьте его имя в переменную в PLUGINS в app_config
.
PLUGINS = ["some_plugin_name", "other_plugin_name", ...]
SAF Patterns — это плагин для SmartApp Framework, который позволяет использовать паттерны для распознавания запросов пользователя. Механизм матчинга паттернов реализован на C#.
Для работы плагина необходимо использовать Mono/.NET.
Установка плагина
Для работы плагина требуется проект Pythonnet. Как его установить, читайте в инструкции.
Напишите на developer@sberdevices.ru и запросите плагин SAF Patterns.
Новые возможности
Плагин содержит дополнительный тип Requirement pattern
и Action pattern_resolve_scenario
.
Requirement pattern
позволяет задать условие на входящий текст:
{
"type": "pattern",
"patterns": [
"[бывш~ прежн~] .{0,3} ([телефон~ номер]+ | сим карта)",
"([телефон~ номер]+ | сим карта) .{0,3} [бывш~ прежн~]"
]
}
Action patterns_resolve_scenario
позволяет выбрать сценарий с наиболее подходящим паттерном:
{
"type": "pattern_resolve_scenario",
"scenarios": {
"scenario_1": [
"some_pattern"
],
"scenario_2": [
"some_pattern"
]
},
"else": {
"type": "some_fallback_action"
}
}
Синтаксис регулярных выражений
Для создания паттернов используются регулярные выражения. Регулярное выражение – это способ записи текстовых шаблонов: обычная текстовая строка, написанная на специальном языке, которая задает правила, но не содержит конкретный набор символов.
Главная особенность регулярных выражений в том, что неделимая единица в сопоставляемой текстовой строке — слово, а не один символ. Это связано со спецификой работы голосового ассистента: он распознает строку из слов, а не из отдельных символов.
Операторы для регулярных выражений
Символ | Значение |
---|---|
. | Любое слово. Например, кровать, корова, помидор |
[] | Одно из слов. [да угу ага] – соответствует одному из слов «да», «угу» или «ага» |
() | Все слова внутри. (угу да) – соответствует только паре слов, сказанных вместе: «угу да», и не будет соответствовать им по отдельности |
| | Одно из выражений. (да | совершенно верно| так точно) – соответствует одному из выражений: «да», «совершенно верно» или «так точно» |
* | Отсутствие вхождений слов, стоящих перед *. да* – соответствует отсутствию «да», «да», «да да», «да да да». [да угу ага]* – соответствует отсутствию содержимого [], любому значению из [], любой комбинации значений из [] |
+ | Одно или более вхождение слов, стоящих перед +. да+ – соответствует «да», «да да», «да да да». [да угу ага]+ - соответствует любому значению из [], любой их комбинации |
? | Ноль или одно вхождений слов, стоящих перед ?. да? – соответствует отсутствию «да» или одному «да». [да угу ага]? – соответствует отсутствию содержимого [] или любому одному значению из [] |
{n,m} | От n до m слов, стоящих перед {n,m}. да3 – соответствует «да», «да да», «да да да». [да угу ага]2 – соответствует вхождению значений из [] от нуля до двух раз. {0,3} – соответствует вхождению от нуля до трех произвольных слов |
~ | Произвольная часть слова. карт~ – соответствует «карта», «карточка», «карты», «картой» и т. д. |
@ | Все словоформы слова, которое стоит после @. @номер – соответствует «номер», «номеру», «номером», «номера» |
Лингвистические теги
Вместо слова можно указать лингвистические теги, которым слово должно соответствовать. Набор тегов пишется в фигурных скобках после знака @ через пробел. С помощью тегов можно формировать правила.
Примеры правил:
- Для существительных мужского рода: @{NOUN masc}.
- Для существительных, которые стоят не в именительном падеже: @{NOUN ^nomn}. (Знак ^ работает как отрицание.)
- Для обработки фраз вида «Мой город / я живу в городе Название города»: город~ @{Geox}.
- Для фраз вида «уехал/переехал в Название города», в которых нужен конкретный падеж: [уехал переехал поехал перебрался съехал] в @{Geox accs}.
Все лингвистические теги можно посмотреть в Словаре граммем.
Рекомендации и ограничения
Рекомендации для составления регулряных выражений:
- Выделите ключевые слова. Обычно их 2-3.
- Составьте список синонимов и словоформ. Используйте операторы
~
или@
, где уместно. - Если между ключевыми словами возможны другие слова, учитывайте их в правиле с помощью конструкции
.{m,n}
между ключевыми словами, где обычно m = 0, n = 1, 2, 3, … . Для n выберите минимально достаточное значение. - Если правило может быть симметричным, вы можете найти симметричные ему относительно
.{m,n})
. Для этого выделите правило и нажмите клавиши alt+~. Делать симметричные правила следует только тогда, когда они применимы. - Аккуратно используйте оператор
~
, не делайте большую вариативную часть. - Нельзя использовать правило .*, потому что оно сопоставляет выражение с любым количеством произвольных слов.
- Нельзя использовать правило [слово_1 слово_2 … слово_n]*, потому что с ним сопоставляется любая фраза.
- Если правило используется во
phrases parts
, не нужно ставить произвольные слова в начале и в конце правила. Оно сработает, даже если что-то будет сказано до или после той части, которая попадает под шаблон. Дляphrases exact
данное утверждение неверно, нужно прописывать правило точно. - Старайтесь строить правила таким образом, чтобы чаще использовать оператор
[]
и как можно реже()
.