Перейти к основному содержимому

Изменение веса паттернов

Если вы реализуете в сценарии NLU на паттернах, вы можете принудительно изменять вес совпадения запросов с паттернами или их отдельными элементами.

Это может быть полезно в следующих случаях:

  • Запрос совпадает с несколькими различными паттернами. В сценарии необходимо явным образом указать, какой из паттернов является приоритетным, чтобы присваивать ему больший вес.
  • Необходимо пометить какой-либо элемент паттерна как нежелательный, чтобы при совпадении по этому элементу вес становился ниже порогового значения и запрос не попадал в стейт.
предупреждение
Рекомендуем использовать данную возможность с осторожностью. Если слишком часто изменять вес паттернов, поведение классификатора становится менее предсказуемым и управляемым.

$weight

Чтобы изменить вес паттерна, используйте элемент $weight. Этот элемент может использоваться после тегов q и q!, а также при объявлении именованных паттернов при помощи тега patterns.

Варианты записи $weight:

  • $weight<a>
  • $weight<a+b>
  • $weight<a-b>
  • $weight<+b>
  • $weight<-b>

Вес паттерна изменяется по формуле:

S=Sa+bS = S \cdot a + b

где SS — итоговый вес паттерна, aa и bb — значения, заданные в $weight.

aa и bb могут быть произвольными вещественными числами. Отличия параметров aa и bb:

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

Использование в сценарии

В сценарии ниже приведены примеры однотипных стейтов, отличающихся только наличием и значениями $weight. Через обработчик postProcess в ответе бота выводится вес совпадения запроса с паттернами. Для каждого запроса вида test [1..5] этот вес будет разным.

theme: /

init:
bind("postProcess", function(ctx) {
$reactions.answer("Вес: " + ctx.nBest[0].score);
});

state: Start
q!: $regex</start>
a: Начнем.

state: Test1
q!: test 1
# Вес: 0.79

state: Test2
q!: test 2 $weight<1.001>
# Вес: 0.7908

state: Test3
q!: test 3 $weight<0.9+0.05>
# Вес: 0.75

state: Test4
q!: test 4 $weight<+0.3>
# Вес: 1.03

state: Test5
q!: test 5 $weight<-0.2>
# Вес: 0.63

$localWeight

Если в паттерне использован элемент $weight, то изменяется вес совпадения строки со всем паттерном целиком. В отдельных случаях может потребоваться более гибкое поведение, чтобы изменить вес только отдельных частей паттерна, выделенных в именованный паттерн. Для этого используйте элемент $localWeight.

Варианты записи $localWeight такие же, как для $weight. После элемента обязательно ставится ссылка на именованный паттерн. Указанное в $localWeight число используется только при расчете веса подстроки, совпавшей по этому именованному паттерну.

Использование в сценарии

Разницу между $weight и $localWeight можно пронаблюдать на следующем примере сценария. При попадании в стейт Test1 вес совпадения ниже, чем для Test2:

  • В Test1 вес совпадения по всему паттерну уменьшается на 20%.
  • В Test2 уменьшается только вес совпадения подстроки test, а вес токена 2 остается прежним.
patterns:
$test = test

theme: /

init:
bind("postProcess", function(ctx) {
$reactions.answer("Вес: " + ctx.nBest[0].score);
});

state: Start
q!: $regex</start>
a: Начнем.

state: Test1
q!: $weight<0.8> $test 1
# Вес: 0.8

state: Test2
q!: $localWeight<0.8> $test 2
# Вес: 0.84