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. Будущая работа
В будущем мы можем работать с запросами к нескольким таблицам, которые используют соединения между таблицами для прогнозирования конечного результата.
Фрагмент приложения:
Использованная литература: