Модель ответов на вопросы - это просто компьютерная программа, которая отвечает на ваши вопросы.
Чтобы программа могла это делать, нам нужно обучить алгоритм машинного обучения с помощью ряда вопросов и ответов.
Мы увидим, как это сделать, в этой статье.
Набор данных, который мы будем использовать, - это набор данных Ответы на вопросы Стэнфорда, он ссылается на более 100 000 ответов, связанных с их вопросом.
В этом наборе данных у нас также есть другая информация, которую мы не будем использовать в этом простом случае.
Подготовка данных
получить данные в кадре данных
Так выглядят данные в предоставленном нам Json-файле.
Мы хотим получить поле response_text для каждого ответа, а также связанную с ним информацию. Для этого мы можем поступить следующим образом:
Применяя эту функцию, мы переходим от Json к фреймворку данных, с которым мы сможем работать:
Здесь каждая строка представляет собой ответ на вопрос. Это поможет нам, когда мы собираемся обучать нашу модель машинного обучения, поскольку мы собираемся задать ей вопрос как функцию и ответ как метку.
Обучающие модели встраивания слов
Модели машинного обучения можно обучать только с помощью чисел, поэтому нам придется векторизовать наши вопросы и ответы, следуя этой диаграмме.
- Мы обучаем наши модели встраивания слов контексту (текстам, к которым относятся вопросы).
- Мы векторизуем наши вопросы и ответы с помощью полученной ранее модели.
- Мы обучаем нашу модель машинного обучения с помощью этих векторизованных вопросов и ответов.
Итак, в качестве первого шага нам нужно получить наши контексты, предварительно обработать их и обучить им наши модели встраивания слов.
Функция предварительной обработки и этикетка
в качестве ответа мы возьмем предложение, в котором есть ответ. Мы поможем нам, когда будем оценивать нашу модель.
Эта функция просматривает контекст и находит предложение, в котором находится ответ, после чего просто предварительно обрабатывает эти предложения и отбрасывает некоторые неоценимые ответы.
Для вопросов это намного проще, мы просто используем простую функцию предварительной обработки gensim.
Вставить вопрос и ответ
Мы будем использовать два разных метода для вставки наших вопросов и ответов. Затем мы сравним их производительность.
Первый метод, который мы будем использовать, очень прост, мы будем использовать FastText для встраивания всего. FastText имеет то преимущество, что обрабатывает слова, которые отсутствуют в словарном запасе, поэтому у нас не будет никаких ошибок из-за того, что мы пытаемся вставить слова, которые отсутствуют в словарном запасе.
Второй способ немного сложнее, вот код:
Фактически, весь этот загадочный код можно свести к этой диаграмме.
Затем мы можем применить эти функции к нашему набору данных, чтобы встроить вопросы и ответы.
Начнем с вложения смеси:
Мы усредняем каждый вопрос, чтобы иметь вектор на предложение, а не на слово.
Мы можем сделать то же самое для встраивания FastText:
Непосредственно перед обучением нашей модели машинного обучения нам нужно разобраться с формой входных данных. Действительно, модель машинного обучения scikit learn принимает в качестве входных данных двумерный массив, чего нельзя сказать о серии pandas, которую мы только что создали.
Чтобы справиться с этой проблемой, мы создаем функцию, которая преобразует серию панд в двумерный массив, который может использоваться моделью обучающейся машины.
- question_np, answer_np: 2D-массивы, содержащие вопросы и ответы, векторизованные с помощью метода смешивания
- question_fastText_np, answer_fastText_np: 2D-массивы, содержащие вопросы и ответы, векторизованные с помощью единственного метода FastText
Тренировочные и оценочные модели
Обучение нашим моделям машинного обучения
Мы будем использовать две разные модели из библиотеки scikit learn: Support Vector Regressor (SVR) и Gradient Boosting regressor (GBR). Мы собираемся использовать регрессор с несколькими выходами, который, как указывает его название, позволяет нам получить набор выходных значений (здесь векторизованный ответ).
Чтобы проверить эффективность наших методов встраивания слов, мы обучим модели с двумя разными наборами вопросов и ответов, которые у нас есть.
Итак, у нас будет 4 разные модели:
- Модель SVR с вопросами и ответами, встроенными с помощью метода смешивания
- Модель SVR с вопросами и ответами, встроенными с помощью единственного метода fastText
- модель GBR с вопросами и ответами, встроенными с помощью метода смешивания
- модель GBR с вопросами и ответами, встроенными с помощью единственного метода fastText
Оценка наших моделей
Теперь будет важно протестировать наши обученные модели. Для этого мы не сможем использовать функции, уже созданные scikit learn, основываясь на нашем варианте использования.
В этой статье я покажу вам, как выполнять эти функции, но я не буду их запускать, потому что они принимают несколько дней на обработку всего набора данных.
Итак, мы будем использовать две основные функции:
- get_vectorized_context принимает контекст в качестве входных данных и возвращает массив, содержащий каждое предложение этого контекста, связанное с его векторизацией.
- Минимальное расстояние принимает вектор x и массив векторов y в качестве входных данных и возвращает ближайший вектор y к x, применяя евклидово расстояние.
Если в нашем контексте ближайший к предсказанному нами вектор является истинным ответом, мы считаем предсказание хорошим.
В этой статье мы рассмотрели классическую задачу НЛП, которая позволила нам поэкспериментировать с различными шагами, необходимыми для предварительной обработки и анализа текстовых данных.
Мы также поняли весь интерес к облачной обработке: для обучения одной из представленных моделей требуется более 20 минут, мы не можем попробовать многие параметры для них.
С большей мощностью мы могли бы выполнить некоторую перекрестную проверку или поиск по сетке найти лучшие параметры.