Модель ответов на вопросы - это просто компьютерная программа, которая отвечает на ваши вопросы.

Чтобы программа могла это делать, нам нужно обучить алгоритм машинного обучения с помощью ряда вопросов и ответов.

Мы увидим, как это сделать, в этой статье.

Набор данных, который мы будем использовать, - это набор данных Ответы на вопросы Стэнфорда, он ссылается на более 100 000 ответов, связанных с их вопросом.
В этом наборе данных у нас также есть другая информация, которую мы не будем использовать в этом простом случае.

Подготовка данных

получить данные в кадре данных

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

Применяя эту функцию, мы переходим от Json к фреймворку данных, с которым мы сможем работать:

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

Обучающие модели встраивания слов

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

  1. Мы обучаем наши модели встраивания слов контексту (текстам, к которым относятся вопросы).
  2. Мы векторизуем наши вопросы и ответы с помощью полученной ранее модели.
  3. Мы обучаем нашу модель машинного обучения с помощью этих векторизованных вопросов и ответов.

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

Функция предварительной обработки и этикетка

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

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

Для вопросов это намного проще, мы просто используем простую функцию предварительной обработки 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 минут, мы не можем попробовать многие параметры для них.
С большей мощностью мы могли бы выполнить некоторую перекрестную проверку или поиск по сетке найти лучшие параметры.