Плагин SAF Patterns


SmartApp Framework поддерживает плагины. Плагин может расширять язык DSL, а также подменять или изменять компоненты приложения, например MainLoop или DialogueManager.

Плагин — это Python-пакет или модуль со специальным активационным методом.

Чтобы подключить плагин, добавьте его имя в переменную в PLUGINS в app_config.

PLUGINS = ["some_plugin_name", "other_plugin_name", ...]

SAF Patterns — это плагин для SmartApp Framework, который позволяет использовать паттерны для распознавания запросов пользователя. Механизм матчинга паттернов реализован на C#.

Для работы плагина необходимо использовать Mono/.NET.

Установка плагина

Для работы плагина требуется проект Pythonnet. Как его установить, читайте в инструкции.

Установить плагин можно из git.

python -m pip install git+https://github.com/sberdevices/saf_patterns@main

Новые возможности

Плагин содержит дополнительный тип 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}.

да{1,3} – соответствует «да», «да да», «да да да».

[да угу ага]{0,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 данное утверждение неверно, нужно прописывать правило точно.
  • Старайтесь строить правила таким образом, чтобы чаще использовать оператор [] и как можно реже ().

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней