Pavlov. Deep Pavlov. Или как определить «эмоциональности» в обращениях клиентов?

Pavlov. Deep Pavlov. Или как определить «эмоциональности» в обращениях клиентов?

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

DeepPavlov – это открытая программная библиотека разговорного AI для создания виртуальных диалоговых ассистентов и анализа текста. Официальный сайт проекта – http://ipavlov.ai/ru.

Перед обучением классификатора нам потребуется размеченный датасет обращений клиентов. В котором обращения с признаками эмоциональности помечены «1», а нейтральные обращения – «0».

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

Функция для очистки данных и лемматизации выглядит следующим образом:

1. #функция для лемматизации текста 2. def lemmatize(text): 3. text = re.sub('[^a-zA-Z]',' ',text).lower() 4. word_list = nltk.word_tokenize(text) 5. lemmatized_output = ' '.join([wordnet_lemmatizer.lemmatize(w) for w in word_list]) 6. return " ".join(lemmatized_output.split())

Сохраним полученный текст и целевой признак в файл для дальнейшего использования:

1. df.to_csv('comments.csv')

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

  • Установим DeepPavlov:
1. !pip install deeppavlov

2. Импортируем необходимые для работы классы:

1. #Импорт необходимых библиотек для DP 2. from deeppavlov.dataset_readers.basic_classification_reader import BasicClassificationDatasetReader 3. from deeppavlov.dataset_iterators.basic_classification_iterator import BasicClassificationDatasetIterator 4. from deeppavlov.models.preprocessors.str_lower import str_lower 5. from deeppavlov.models.tokenizers.nltk_moses_tokenizer import NLTKMosesTokenizer

3. Загружаем датасет из файла. При этом укажем целевую переменную, и колонку с текстом:

1. df_dp = BasicClassificationDatasetReader().read( 2. data_path='', 3. train='comments.csv', 4. x = 'edit_text', 5. y = 'emotional')

4. Для обучения и тестирования разобьем на трейн-тест в пропорции 20/80:

1. train_iterator = BasicClassificationDatasetIterator( 2. data=df_dp, 3. field_to_split='train' 4. split_fields=['train', 'valid'], 5. split_proportions=[0.8, 0.2], 6. split_seed=777, 7. seed=42)

5. Создадим объект для последующей разбивки по классам:

1. tokenizer = NLTKMosesTokenizer()

6. Запишем трейн-тест в отдельные переменные:

1. x_train, y_train = train_iterator.get_instances(data_type="train") 2. x_valid, y_valid = train_iterator.get_instances(data_type="valid")

7. Для дальнейшей работы токенизируем текст и переводим все символы в нижний регистр:

1. train_x_lower_tokenized = str_lower(tokenizer(train_iterator.get_instances(data_type='train')[0]))

8. Создадим из текста вектор, используем метод tf-idf – для измерения важности слова в документе:

1. tfidf = SklearnComponent( 2. model_class="sklearn.feature_extraction.text:TfidfVectorizer", 3. infer_method="transform", 4. save_path='./tfidf2_tmp.pkl', 5. load_path='./tfidf2_tmp.pkl', 6. mode='train') 7. 8. tfidf.fit(train_iterator.get_instances(data_type='train')[0]) 9. tfidf.save()

9. Объявим классификатор SGDClassifier:

1. cls = SklearnComponent( 2. model_class="sklearn.linear_model:SGDClassifier", 3. infer_method="predict", 4. save_path='./SGD_tmp.pkl', 5. load_path='./SGD_tmp.pkl', 6. C=1, 7. mode='train')

10. Обучим классификатор и сохраним модель:

1. cls.fit(tfidf(x_train), y_train) 2. cls.save()

11. Предскажем наличие эмоциональности на валидационной выборке:

1. y_valid_pred = cls(tfidf(x_valid))

12. Для оценки качества нашей модели мы будем использовать метрику F1:

11. f1_score(np.array(y_valid), np.array(y_valid_pred), average='binary', pos_label='1')

В нашем случае она составила 0,81.

Так, на простом примере за 12 шагов мы обучили свой классификатор текстов. Непосредственно наш классификатор был обучен на 15 тыс. обращений. После этого он может классифицировать 100 тыс. обращений за 10 мин. Для сравнения, человеку бы потребовалось 5 рабочих месяцев для выполнения аналогичной задачи, то есть в 5 тыс. раз дольше.

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

22
1 комментарий

Немного странно: статья типа про Deep Pavlov, а вся работа делается в sklearn. Насколько я знаю, в Deep Pavlov'е гораздо более мощные модели, чем TF-IDF с простеньким классификатором.

1
Ответить