В этом разделе рассматривается механизм ранжирования паттернов, который применяется в стандартном режиме работы Code.
При обработке каждого запроса клиента Code сопоставляет реплики пользователя со всеми активными правилами (паттернами). Далее выполняется ранжирование полученных гипотез по алгоритму, рассмотренному ниже.
После выполнения ранжирования, гипотеза с наибольшим весом отправляется на обработку в сценарий, то есть запускается выполнение сценария в выбранном стейте. Остальные гипотезы разбора сохраняются в массиве $context.nBest, если в chatbot.yaml задан соответствующий параметр.
Вычисление конечного веса каждого патт ерна состоит из следующих этапов:
- Вычисление
cost; - Вычисление
score; - Добавление весов из правил
$weight; - Контекстное ранжирование.
Вычисление cost
cost — штраф, который начисляется сопоставлению, если фраза пользователя не полностью соответствует паттерну. Рассчитывается как сумма штрафов по всем парам слово — паттерн. Расчет штрафа для каждой пары зависит от правила.
Формула расчета:
cost = sum c(r,w,p)
Где:
c- штрафcost;r- правило;w- слово;p- текст паттернаlen(w)- длина слова (фомула в таблице);ed(w,p)- расстояние редактирования между словом пользователя и словом из паттерна (формула в таблице).
Где r принимает значения:
| r | Формула | Соответствие паттерну |
|---|---|---|
word | 0 | слово |
spelling | ed(w,p)*0,5 | * |
lemma | 0 | ~lemma |
morph | 0 | $morph<часть речи и/или граммема> |
stem | ed(w,p)*0,97 | корень |
regex | 0 | $regexp<литералы и метасимволы> |
star | len(w)*1+0,01 | * |
garbage | len(w)*0,99 | $nonEmptyGarbage |
oneWord | len(w)*0,98 | $oneWord |
punctuation | len(w)*0,1 | * |
namedEntity | 0 | $entity<именованная сущность> |
Вычисление score
score — нормализованный обратный штраф. Предполагалось, что score будет принимать значения в диапазоне от 0 до 1, но с вводом дополнительного штрафа для паттерна * диапазон значений расширился и включает в себя отрицательные значения.
Формула расчета:
S = 1 - c/(сумма len(w)+ сумма len(p)*0.1)
Здесь:
len(w)- длина слова;len(p)- длина символов пунктуации;c- штрафcost.