Эта статья является частью текущей серии о фреймворке DeepPavlov. Вы также можете ознакомиться с полным списком статей.
Перейдем сразу к делу. Предположим, ваши клиенты, вероятно, зададут очень ограниченный круг вопросов. Вы можете ответить на эти вопросы либо через колл-центр поддержки клиентов, либо через виджет чата на веб-странице. В обоих этих случаях для пользовательского ввода вы должны решить, является ли он семантически похожим на один из предопределенных вопросов, а затем вернуть соответствующий ответ. Формально это проблема классификации текста. Классификация текстов - одна из широко используемых задач в области обработки естественного языка (НЛП).
Классификация текста позволяет решить следующие задачи:
- Распознавайте намерения пользователя на любой платформе чат-бота.
- Различайте спам и сообщения, не являющиеся спамом.
- Определите настроение отзывов клиентов.
- Классифицируйте товарный элемент по одному или нескольким типам товаров из каталога.
Если вы столкнулись с одной из этих проблем, в вашем распоряжении есть несколько решений. Вы можете нанять инженера НЛП, который будет собирать для вас обучающие данные, обучать, настраивать и переобучать модель до тех пор, пока ее производительность не удовлетворит вас. В качестве альтернативы вы можете использовать одну из служб NLP API, которая сделает эту работу за вас. Оба решения имеют свои преимущества и недостатки. Инженер НЛП обходится дорого, и служба API черного ящика может быть не в состоянии предоставить вам гибкость для тестирования нескольких моделей и точной настройки всех параметров, которые вам нужны.
К счастью, диалоговый AI-фреймворк с открытым исходным кодом DeepPavlov предлагает бесплатное и простое в использовании решение. DeepPavlov поставляется с набором предопределенных компонентов на базе TensorFlow и Keras для решения проблем, связанных с НЛП, включая классификацию текста. Фреймворк позволяет точно настраивать гиперпараметры и тестировать несколько моделей.
Далее я хотел бы показать, как можно выполнять классификацию текста с помощью фреймворка DeepPavlov, особенно я сосредоточусь на случае, когда данные обучения ограничены. Популярным сценарием использования этих моделей является отнесение высказывания пользователя к одному из вопросов FAQ и получение соответствующего ответа (модели autoFAQ). Код, использованный в этой статье, доступен в Colaboratory по ссылке.
Классификация текста с DeepPavlov
Мы используем FAQ для студентов с сайта Московского физико-технического института (МФТИ) в качестве набора данных для демонстрации. FAQ состоит из студенческих вопросов с соответствующими ответами. Вот образец файла данных.
Question,Answer How to get a bank card?,Visit the social service on the second floor of the building housing the dining hall. The social service is next to local internal affairs office.
Фреймворк DeepPavlov уже содержит предварительно обученные модели для классификации этих вопросов. Вы можете взаимодействовать с предварительно обученной моделью, запустив код Python или через командную строку. Взаимодействие с моделью через командную строку проиллюстрировано приведенным ниже фрагментом. Но сначала установите все требования к модели.
python -m deeppavlov install tfidf_logreg_en_faq python -m deeppavlov interact tfidf_logreg_en_faq -d q::I need help >> If you have any further inquiries, you can address them to the International Students Office, which is located in the Auditorium Building, Room 315. The phone number is (7-495) 408-7043.
Где tfidf_logreg_en_faq
- это файл конфигурации модели, а -d
указывает на то, что все данные, относящиеся к модели, должны быть загружены.
В качестве альтернативы вы можете взаимодействовать с моделью, запустив следующий код Python. Кроме того, вы можете перемещаться по файлам конфигурации с помощью автозаполнения (клавиша Tab) в конфигурациях.
Описание модели
DeepPavlov содержит несколько моделей классификации текста, которые хорошо работают на нескольких обучающих парах. Модели описаны в отдельных файлах конфигурации в папке config / faq.
Файл конфигурации состоит из четырех основных разделов: dataset_reader, dataset_iterator, chainer и train. dataset_reader определяет местоположение набора данных вместе с форматом набора данных (x_col_name, y_col_name). После загрузки данные разделяются на наборы для обучения, проверки и тестирования в соответствии с настройками dataset_iterator.
"dataset_reader": { "class_name": "faq_reader", "x_col_name": "Question", "y_col_name": "Answer", "data_url": "https://files.deeppavlov.ai/faq/school/faq_school_en.csv"}, "dataset_iterator": { "class_name": "data_learning_iterator", "field_to_split": "train", "split_fields": ["train","test"], "split_proportions": [0.8,0.2]}
Раздел chainer файлов конфигурации состоит из трех подразделов. Разделы in и out определяют вход и выход для цепочки, тогда как раздел pipe определяет конвейер необходимых компонентов для взаимодействия с модели - то есть токенизатор, векторизатор tf-idf и другие. Токенизатор разбивает строку на токены. Векторизатор tf-idf преобразует токены в векторы tf-idf. В приведенной ниже конфигурации токенизатор с включенным лемматизатором (lemmas: true) делит входной вопрос на токены и преобразует токены в леммы, а затем сохраняет вывод в q_token_lemmas. Следующий компонент , fasttext, загружает вложения fastText (из файла load_path) и преобразует все q_token_lemmas лемм в векторы слов. На выходе он вычисляет среднее значение всех векторов слов и сохраняет его в out. Наконец, компонент cos_sim_classifier может предоставить top_n кандидатов из обучающих данных fit_on на нашем входе q_vect с помощью косинусная мера подобия.
"chainer": { "in": "question", "pipe": [{ "class_name": "tokenizer", "in": "question", "lemmas": true, "out": "q_token_lemmas" }, { "class_name": "fasttext", "in": "q_token_lemmas", "load_path": "embeddings/100.bin", "mean": true, "out": "question_vector" }, { "class_name": "cos_sim_classifier", "in": "question_vector", "fit_on": ["question_vector","y"], "top_n": 1, "save_path": "faq/ft_cos_classifier.pkl", "load_path": "faq/ft_cos_classifier.pkl", "out": ["answer", "score"] }], "out": ["answer"] }
Вы можете обучить модель, запустив ее с параметром train, модель будет обучена на наборе данных, определенном в разделе dataset_reader файла конфигурации. Фреймворк DeepPavlov позволяет вам протестировать все доступные модели на ваших данных, чтобы определить наиболее эффективную модель. Чтобы протестировать модель, укажите разделение набора данных вместе с полями разделения в разделе dataset_iterator файла конфигурации. Кроме того, вы должны определить измеряемые показатели в разделе поезд следующим образом
"train": { "metrics": ["accuracy"], "validate_best": false, "test_best": true }
Затем обучите модель, запустив
python -m deeppavlov train tfidf_logreg_en_faq ... {"test": {"eval_examples_count": 9, "metrics": {"accuracy": 0.7778}, "time_spent": "0:00:01"}}
Кроме того, вы можете обучить модель, запустив следующий код Python.
Оценка модели
Производительность модели измерялась на базе данных FAQ МФТИ (с добавленными вручную пересказами для каждого вопроса). Из-за ограниченного количества пар вопрос-ответ мы измеряем эффективность с помощью перекрестной проверки с исключением по одному (LOOCV).
Все модели основаны на двух основных текстовых представлениях: встраивание слов fastText и представление tf-idf.
Модель fastText (fasttext_avg_autofaq.json) - популярный подход, который усредняет встраивание слов fastText и присваивает метку ближайшего высказывания из обучающего набора в соответствии с косинусным расстоянием. Модель tf-idf (tfidf_autofaq.json) использует представление высказываний tf-idf; затем, как и в предыдущей модели, для присвоения метки используется косинусное расстояние. Гибридная модель взвешивания fastText tf-idf (fasttext_tfidf_autofaq.json) взвешивает встраиваемые слова fastText по значениям tf-idf, а также использует подход косинусного сходства. Наконец, модель логистической регрессии tf-idf (tfidf_logreg_autofaq.json) тренирует логистическую регрессию на представлении tf-idf входных данных.
Результаты в отсортированном порядке представлены в таблице 1.
Модель на основе среднего значения fastText превосходит все модели на основе tf-idf с большим отрывом, этот результат может быть вызван большой лексической изменчивостью набора данных. Логистическая регрессия tf-idf, которая учится назначать веса словам, превосходит остальные модели на основе tf-idf.
Заключение
В этой статье я описал модели классификации текста фреймворка DeepPavlov. Соответствующий код можно найти в Блокноте Colab . Эти модели были специально разработаны, чтобы быть эффективными для небольшого набора обучающих данных. Однако, если доступен достаточно большой набор данных, можно применять более сложные модели глубокого обучения.
Хочу поблагодарить Михаила Бурцева, Луизу Сайфуллину, Ольгу Каирову и всю команду лаборатории iPavlov за ценные комментарии.