Время прочтения: 5 мин.

Всем доброго времени суток!

Многие из нас так или иначе сталкиваются в работе с обращениями своих клиентов, будь это жалоба, заявка или просто отзыв. Во многих компаниях существуют определенные скрипты отработки таких обращений. Как правило, скрипты не могут в полной мере раскрыть потребность клиента и дать четкое определение характера обращения. Так же есть и человеческий фактор: оператор может просто неправильно классифицировать заявку клиента или неверно сформировать запрос.

Как вы думаете: возможно ли без участия оператора дать правильную оценку и установить характер запроса, основываясь только на текстовом обращении клиента? Это поможет исключить человеческий фактор, более точно понять потребность своего клиента, проанализировать места, требующие внимания и корректировки.

Для решения этой задачи мы применили метод машинного обучения, искусственный интеллект распознал текст и классифицировал информацию.

Например, мы знаем, что обращение «Не удается зарегистрироваться в личном кабинете» относится к категории «Личный кабинет клиента», так же, как и обращение «Не могу войти на сайт». Человек на основе своего опыта может явно отнести эти данные в одну категорию, и задача машинного обучения – предоставить роботу идентичный опыт, основываясь на котором он сможет определить категорию обращения.

Такой метод обучения называется обучение с учителем.

Попробуем применить этот метод на практике.

Воспользуемся для этого языком программирования c# и библиотекой машинного обучения ML.Net.

Библиотека ML.Net представляет алгоритмы машинного обучения для классификации, прогнозирования и анализа данных.

В нашем примере мы будем использовать алгоритм многоклассовой классификации, так как одно и то же обращение может принадлежать к разным продуктам.

Итак, мы имеем лог обращений клиентов:

Необходимо по этому логу определить, к какой категории относится обращение и проверить на корректность уже имеющуюся в логе категорию.

Для обучения и проверки модели, из этого списка набирается пул данных для обучения, и еще один пул для оценки точности модели.

Данные для этих пулов должны быть корректными, то есть категория обращения должна соответствовать самому обращению, например: «Уточнение расчетов процентов по кредитному договору» соответствует категории «Сопровождение по кредитным продуктам».

Сохраним эти данные в файлы TrainData.txt и TestData.txt и обьявим в программе пути до этих файлов:

var pathToTrainData = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data\\TrainData.txt");
       var pathToTestData = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data\\TestData.txt");

Для обработки обращений и формирования на их основе прогнозов необходимо объявить классы для входных данных и прогнозов:

	public class Appeal
    {
        [LoadColumn(0)]
        public string ID { get; set; }
        [LoadColumn(1)]
        public string Category { get; set; }
        [LoadColumn(2)]
        public string Context { get; set; }
    }

    public class Prediction
    {
        [ColumnName(“PredictedLabel”)]
        public string Category;
    }

Теперь, когда у нас есть классы для входных данных, можно приступать к их загрузке и обработке.

ML.Net представляет инструмент для загрузки данных из разных источников, для простоты будем использовать текстовый файл:

trainData = _mlContext.Data.LoadFromTextFile<Appeal>(pathToTrainData, hasHeader: true);
var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Category", outputColumnName: "Label")
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Context", outputColumnName: "Features"))                            .AppendCacheCheckpoint(_mlContext);

Вышеприведенный код преобразует данные в столбцах Context и Description в формат, пригодный для использования в конвейере обработки. Колонка Category здесь является результатом, а колонка Context – признаками классификации.

Дальше можно перейти непосредственно к обучению робота по модели мульти-классовой классификации.

Соберем конвейер обучения с алгоритмом максимальной энтропии

var trainingPipeline = pipeline.Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features"))
                    .Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

и обучим модель, передав в конвейер обучения данные:

model = trainingPipeline.Fit(trainData);

Следующим шагом необходимо оценить точность прогнозирования полученной модели.

Для оценки необходимо использовать еще один набор данных, отличный от обучающего набора. По этим данным автомат сделает прогноз, сверит его с реальными данными и определит точность прогнозирования:

	var testData = _mlContext.Data.LoadFromTextFile<Appeal>(pathToTestData, hasHeader: true);
            var testMetrics = _mlContext.MulticlassClassification.Evaluate(model.Transform(testData));

Если точность модели мала для корректной классификации обращений – необходимо увеличить количество тренировочных данных, если точность модели удовлетворительная – можно сохранять ее и использовать в задаче:

private static void SaveModelAsFile(MLContext mlContext, DataViewSchema trainingDataViewSchema, ITransformer model)
        {
            mlContext.Model.Save(model, trainingDataViewSchema, _modelPath);
        }

public struct Result
    {
        public string Desc { get; set; }
        public string Category { get; set; }
        public string PredictedCategory { get; set; }
        public bool isCorrect { get; set; }
    }

public List<Result> CheckIssueCategory(string pathToData, string pathToSavedModel)
        {
            var data = _mlContext.Data.LoadFromTextFile<Appeal>(pathToData, hasHeader: true);
            ITransformer loadedModel = _mlContext.Model.Load(pathToSavedModel, out var modelInputSchema);
            _predEngine = _mlContext.Model.CreatePredictionEngine< Appeal, OutputPrediction>(loadedModel);
            var result = new List<Result>();
            foreach (var row in data)
            {
                var prediction = _predEngine.Predict(row.Description);
                var foo = new Result { Desc = row.Description, Category = row.Category, PredictedCategory = prediction.Category, isCorrect = row.Category == prediction.Category ? true : false };
                result.Add(foo);
            }

            return result;
        }

В результате анализа, проведенного роботом, мы получили итоговую таблицу, содержащую описание и тип обращения, проставленный вручную и определенный искусственным интеллектом. Статистика показала, что из 10 000 проанализированных роботом обращений по 1 321 (14%) дана не корректная оценка, присвоена ошибочная категория и, как следствие, клиент не получил нужную услугу.

Кроме того, данный инструмент позволяет произвести более детальный анализ и классифицировать текстовые данные к более узкому направлению. Например, обращение клиента, связанное с «проглатыванием» пластиковой карты банкоматом и обращение, связанное с ошибочным начислением % по кредитной карте, оператор распределил в одну общую категорию «ПЛАСТИКОВЫЕ КАРТЫ», хотя по сути это абсолютно разная тематика. Наш робот помогает выявлять подобные случаи и производить более детальную классификацию, обрабатывая большое количество текстовых данных за очень короткий срок.

В данном случае мы применили метод машинного обучения для классификации обращений клиентов. Уверен, что данный метод может найти свое применение в разных сферах деятельности. Искусственный интеллект помогает нам исключать ошибки, которые может допустить человек, тем самым улучшить сервис, предоставляемый клиенту.

Спасибо за внимание!