Изменение веса паттернов
Если вы реализуете в сценарии NLU на паттернах, вы можете принудительно изменять вес совпадения запросов с паттернами или их отдельными элементами.
Это может быть полезно в следующих случаях:
- Запрос совпадает с несколькими различными паттернами. В сценарии необходимо явным образом указать, какой из паттернов является приоритетным, чтобы присваивать ему больший вес.
- Необходимо пометить какой-либо элемент паттерна как нежелательный, чтобы при совпадении по этому элементу вес становился ниже порогового значения классификатора и запрос не попадал в стейт.
$weight
Чтобы изменить вес паттерна, используйте элемент $weight
.
Этот элемент может использоваться после тегов q
и q!
, а также при объявлении именованных паттернов при помощи тега patterns
.
Варианты записи $weight
:
$weight<a>
$weight<a+b>
$weight<a-b>
$weight<+b>
$weight<-b>
Вес паттерна изменяется по формуле:
где — итоговый вес паттерна,
и — значения, заданные в $weight
.
и могут быть произвольными вещественными числами. Отличия параметров и :
- изменяет значение веса линейно, то есть умножает в раз.
- сдвигает значение веса на константное значение, то есть прибавляет к нему .
Использование в сценарии
В сценарии ниже приведены примеры однотипных стейтов, отличающихся только наличием и значениями $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