SQL — это язык структурированных запросов, который популярен при выполнении запросов к реляционным базам данных для получения полезных результатов. Техническому специалисту нетрудно писать SQL-запросы, но нетехническому человеку может быть довольно сложно получить вывод из базы данных SQL. Допустим, HR компании хочет знать зарплату сотрудников определенного отдела, поэтому он / она не может написать запрос, поэтому им, возможно, придется использовать все данные, но технический специалист может получить это представление за секунды. Итак, эту проблему можно решить с помощью машинного обучения, когда пользователь должен задавать вопросы в текстовом формате, например «Какие зарплаты в отделе продаж» и заголовки таблицы.

1. Источник данных

WikiSQL — один из самых популярных бенчмарков семантического парсинга. Это контролируемый набор данных преобразования текста в SQL, прекрасно аннотированный вручную Amazon Mechanical Turk. Современные модели (по состоянию на май 2020 г.) моделируют генерацию SQL таблицы лидеров WikiSQL как проблему классификации для прогнозирования шести компонентов SQL. В некоторых ранних работах по WikiSQL это моделировалось как проблема генерации последовательности с помощью seq2seq, но мы от нее отходим.

1. SELECT column
2. AGGREGATION: None, COUNT, SUM, AVG, MIN, MAX
3. Number of WHERE conditions: 0, 1, 2, 3
4. WHERE column
5. WHERE OPERATORS: =, <, >
6. WHERE VALUE: a textspan (the beginning and the end position of the span using probability) in the NL question. It depends on both selected where-column and where operators.

2 . Предварительная обработка

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

3. Особенности

Поскольку у нас есть набор данных в SQL-запросах и заголовках, мы должны выделить текст с помощью токенизатора из библиотеки nltk, а затем объединить запрос и заголовки.

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

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

4. Построение модели кодер-декодер

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

Кодер

  • Стек из нескольких повторяющихся блоков (ячеек LSTM или GRU для повышения производительности), каждый из которых принимает один элемент входной последовательности, собирает информацию для этого элемента и распространяет ее дальше.
  • В задаче «вопрос-ответ» входная последовательность представляет собой набор всех слов из вопроса. Каждое слово представлено как x_i, где i — это порядок этого слова.

Декодер

  • Стек из нескольких повторяющихся блоков, каждый из которых предсказывает результат y_t на временном шаге t.
  • Каждая повторяющаяся единица принимает скрытое состояние от предыдущей единицы и производит выходные данные, а также собственное скрытое состояние.
  • В задаче «вопрос-ответ» выходная последовательность представляет собой набор всех слов из ответа. Каждое слово представлено как y_i, где i — это порядок этого слова.

Я реализовал модель кодер-декодер с нуля. Для этого я использовал встроенные функции build(), __init__(), call() в python для построения архитектуры класса. Также использовались эмбеддинги, слои lstm к модели.

Чтобы набор данных генерировался пакетами, для этого класса загрузчика текстовых данных реализован с нуля с использованием встроенных функций __init__(), __getitem__() для динамического создания пакетов набора данных.

5. Подгонка и предсказание

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

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

Затем я проверил оценку BLEU прогноза с истинными значениями тестовых данных и получил оценку BLEU 0,6.

6. Создание конвейера и развертывание

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

Я развернул код прогнозирования для прогнозирования пользовательских данных с помощью фляги и платформы Heroku.

7. Будущая работа

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

Фрагмент приложения:

Профиль LinkedIn

Ссылка на Github

Использованная литература:

  1. http://appliedaicourse.com/
  2. https://arxiv.org/pdf/2109.13066.pdf
  3. https://towardsdatascience.com/text-to-sql-learning-to-query-tables-with-natural-language-7d714e60a70d
  4. https://towardsdatascience.com/understanding-encoder-decoder-sequence-to-sequence-model-679e04af4346