Транслитерация в текстовом канале
В этой статье мы настроим бота, чтобы он мог понимать транслитерацию в казахском языке. Бот будет работать в текстовом канале.
В этом языке есть буквы, которых нет на стандартной клавиатуре с английской и русской раскладкой.
А мы знаем, что часть пользователей предпочитает именно такие клавиатуры.
Например, им приходится вместо иә
писать еэ
или йэ
.
Такой бот сможет правильно считывать казахские слова, написанные другой раскладкой.
Решение
Для наибольшей эффективности применим следующую последовательность действий:
- Установить тот системный язык, который нужно распознавать. В нашем случае казахский.
- Выбрать классификатора Transformer.
- Добавить обучающие фразы, которые содержат транслитерацию.
- Создать регулярные выражения.
1. Установка системного языка
- Перейдите на главную страницу JAICP и найдите нужный проект в секции Мои проекты.
- Нажмите в карточке проекта и выберите Настройки проекта.
- В поле Язык NLU выберите казахский.
2. Использование классификатора Transformer
- В том же окне настроек перейдите на вкладку Классификатор.
- В пункте Алгоритм классификатора выберите Transformer.
- Нажмите Сохранить.
3. Использование транслита в обучающих фразах
Примеры скриптов в этом разделе написаны на Python.
- В проекте перейдите в NLU → Интенты.
- Создайте или загрузите интенты, где часть тренировочных фраз написана транслитом. Т.е. часть фраз там написана не казахским алфавитом, а с заменой букв на русские/английские.
Тренировочные фразы
Скрипт для создания тренировочных фраз с транслитерацией
Воспользуемся этим скриптом для генерации транслитерации набора слов.
Генерируем транслитерации
Теперь вы можете создать и импортировать список интентов, используя в них сгенерированные транслитерации.
Создание регулярного выражения
Если вам все еще не хватает точности распознавания или срабатывают не все интенты, то напишите регулярные выражения для наиболее популярных слов проекта в специальный паттерн. Укажите стандартное написание в качестве значения. Регулярное выражение, поймавшее один из таких паттернов, передаст дальше слово в стандартном виде.
Скрипт для создания регулярного выражения с транслитерацией
Используем этот скрипт, чтобы сгенерировать регулярные выражения для нескольких слов
Генерация регулярных выражений
Теперь мы можем использовать эти сгенерированные регулярные выражения в preMatch, чтобы приводить слова к стандартной казахской орфографии.
require: common.js
module = sys.zb-common
patterns:
$kz_trans = (
$regexp<<(ш|ч)(е|а|и|э)(ш|ч)(і|и|ы|е)?лм(и|(е|а|и|э)(й|и))д(і|и|ы|е)?>:шешілмейді
| $regexp<оп(е|а|и|э)р(а|ау)тор\s*(ғ|г)(а|ау)>:Оператор ға
| $regexp<кр(е|а|и|э)д(и|е)т(і|и|ы|е)?мд(і|и|ы|е)?>:кредитімді
| $regexp<(а|ау)с{1,2}(а|ау)л(а|ау)м(а|ау)(ғ|г)(а|ау)л(и|(е|а|и|э)(й|и))кум>:Ассаламағалейкум
)
$kz = * $kz_trans *
init:
bind("preMatch", function($context) {
// В preMatch заменяем слова, попавшие в регулярное выражение на стандартное написание
var match = $nlp.matchPatterns($.request.query, ["* $repeat<$kz> *"]);
if (match && match.parseTree && match.parseTree.kz) {
var query = $.request.query;
var transliterations = match.parseTree.kz.map(function(pattern) {
return pattern.kz_trans && pattern.kz_trans[0];
});
transliterations.forEach(function(pattern) {
query = query.replace(pattern.text, pattern.value);
});
// Редактируем запрос — далее обрабатываться будет уже исправленная версия
$context.request.query = query;
}
});
theme: /
state: Start
q!: $regex</start>
a: Начнём.
state: NoMatch
event!: noMatch
a: Я не понял. Вы сказали: {{$request.query}}