Создание лучшего механизма запросов

tl; dr В этой статье рассказывается о том, как мы представили механизм запросов с произвольным текстом, чтобы заменить традиционный подход, основанный на фильтрах, для запроса данных с использованием распознавания именованных сущностей и некоторых других приемов.

Данные генерируются с огромной скоростью во всех компаниях. Когда объемы данных велики, мы хотели бы посмотреть на подмножества (применить фильтры) данных, которые могут нас заинтересовать. Традиционно эти фильтры преобразуются в запросы к базе данных. Простой запрос для всех профилей в IBM будет выглядеть так:

ВЫБРАТЬ * из профилей, где компания = «IBM»

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

Вот как выглядит подход, основанный на фильтрах.

Когда в каждой категории есть только несколько вариантов, фильтровать легко, но по мере того, как количество вариантов для каждой категории увеличивается, сложность выходит за рамки.

Альтернативный подход к запросам

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

- Show me data engineers skilled in python
- Someone who is located at san francisco with the qualification of a data scientist.
- Show me top executives in Amazon
- Adam from Microsoft, Redmond

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

ВЫБРАТЬ * из профилей, где JOB_TITLE = «инженер данных» и SKILL = «python».

Мы подошли к этой проблеме с точки зрения машинного обучения. Эта проблема известна как распознавание именованных сущностей (NER) в мире машинного обучения.

Построение системы распознавания именованных сущностей

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

Есть блестящие модели с открытым исходным кодом (1, 2, 3, 4) для NER, но они очень общие по своей природе. Эти модели хорошо работают с общими типами сущностей, такими как имена людей, местоположения, организации, даты и т. Д., Но в Draup нас интересует гораздо больше. У нас есть несколько других сущностей, таких как навыки, суб-вертикали, бизнес-функции, уровень в организации и т. Д., Которые не могут быть охвачены этими предварительно обученными моделями. Итак, мы пришли к выводу, что мы должны построить свою собственную систему NER.

Создание набора данных

Обычно это самая важная часть любого процесса машинного обучения (ML). ML следует простому правилу: «мусор на входе, мусор на выходе». Это означает, что модель машинного обучения хороша ровно настолько, насколько хороши данные, на которых она обучается. Помня об этом, мы работали над созданием как можно большего количества примеров. Мы смогли охватить около 200 возможных запросов. Это относительно небольшой набор данных для обучения модели. Тщательное изучение шаблонов запросов пользователей дало нам идеи о том, как сгенерировать больше данных за счет увеличения данных. Люди, похоже, не заботятся о том, чтобы правильно использовать заглавные буквы в важных словах в запросе с произвольным текстом. Многие пользователи не обращают внимания на правильную пунктуацию, но все же ожидают, что модели будут работать. Эти идеи помогают нам создать конвейер быстрого пополнения данных, чтобы создать для нас больше обучающих примеров. Все эти усилия привели к созданию 1000 обучающих примеров.

Выбор техники моделирования

Есть две основные темы для построения системы NER:

  1. Традиционные алгоритмы, такие как условные случайные поля (CRF)
  2. Подходы, основанные на глубоком обучении

Подходы, основанные на глубоком обучении, в области текстовых данных очень хорошо работают, если у вас большой набор данных. Около 1000 примеров не подходят. Совсем недавно общеязыковые модели, такие как Google's BERT или OpenAI’s GPT-2, показали многообещающие результаты на небольших наборах данных. Однако эти модели огромны по размеру, и мы чувствовали, что они немного излишни для нашей задачи. Еще один важный недостаток глубокого обучения по сравнению с традиционными подходами - сложность интерпретации и объяснения поведения модели.

С другой стороны, условные случайные поля довольно хорошо работают в задаче NER, даже когда данные ограничены.

Модель условных случайных полей

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

При работе с последовательностями используется модель условных случайных полей. В нашем случае ввод - это последовательность слов, а вывод - последовательность тегов сущностей.

Давайте назовем последовательность слов как x̄, а последовательность тегов - как y̅.
Также давайте определим то, что мы называем функциями функций: f (yᵢ₋₁, yᵢ, x̅, i)
Здесь функция функции принимает 4 параметра: -

1: i, текущий индекс в последовательности
2: x̄, вся входная последовательность
3: yᵢ₋₁, предыдущий тег вывода, индексированный на i
4: yᵢ, текущий вывод тег проиндексирован на i

Чтобы прояснить ситуацию, давайте определим пример функции функции.

f (yᵢ₋₁, yᵢ, x̅, i) = {1, если yᵢ₋₁ и yᵢ имеют значение TITLE, а текущее слово - «Engineers», иначе 0}

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

f (yᵢ₋₁, yᵢ, x̅, i) = {1, если yᵢ₋₁ - OTHER, yᵢ - TITLE, а текущее слово - в верхнем регистре, иначе 0}

Собрав кучу функций функций, мы хотим найти функцию распределения вероятностей. Эта функция должна сообщать, какова вероятность каждого возможного y̅ при заданном x̅. Уравнение ниже определяет эту вероятность.

Здесь exp - экспоненциальная функция. Вышеупомянутая функция использует экспоненты для плавного распределения вероятности по всем возможным последовательностям меток и гарантирует, что сумма вероятностей равна 1.

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

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

Что ж, это кажется большой работой, но мы использовали библиотеку sklearn-crfsuite для обучения модели CRF на нашем наборе данных из примерно 1000 примеров.

Точность, отзывчивость и оценка F1

Давайте объясним точность и запоминание на простом примере. Предположим, мы построили модель, которая может предсказать / извлечь все навыки, упомянутые в тексте, и наш вводимый текст имеет 9 навыков. Предположим, что модель предсказывает 10 навыков, из которых 6 на самом деле являются навыками, а остальные 4 не являются навыками.

A = Количество релевантных записей = 9
B = Количество извлеченных релевантных записей = 6
C = Количество извлеченных записей = 10
D = Количество извлеченных нерелевантных записей = 10–6 = 4

Точность = B / C = 0,6
Напоминание = B / A = 0,667

Хорошая модель будет иметь высокие значения как точности, так и отзывчивости. Однако иногда полезно иметь одно значение, чтобы оценить, насколько хороша модель. Таким образом, наступает счет f1. Он гармонично сочетает в себе точность и отзывчивость.

В нашем примере показатель f1 равен 0,632.

Проверка и улучшения модели

Это в некоторой степени приемлемо, если модель не распознает все сущности в запросе. Но если модель неправильно идентифицирует объекты, это отрицательно скажется на результатах. Например, если модель идентифицирует имя человека как компанию, то вполне вероятно, что результатов поиска не будет или, что еще хуже, система выдаст неверные результаты. Таким образом, нам нужна очень хорошая точность и максимально возможная отзывчивость.

Наши первоначальные усилия привели нас к следующим результатам.

Точность: 0,790
Напоминание: 0,635
Оценка F1: 0,702

Эти результаты относятся к совершенно невидимым данным.

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

Чтобы решить проблему низкой отзывчивости, мы ввели несколько функций, которые используют наши тщательно отобранные списки из нескольких сущностей.

f (yᵢ₋₁, yᵢ, x̅, i) = {1, если yᵢ₋₁ - ДРУГОЙ, yᵢ - НАВЫК и текущее слово присутствует в нашем списке известных навыков, иначе 0}

Допустим, в нашем списке есть такие навыки, как:
(«AutoCAD», «python», «java», «MongoDB», «nodejs», ……)

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

Точность: 0,862
Напоминание: 0,754
Оценка F1: 0,803

Еще одна уловка, которая помогает нашему движку хорошо работать в производстве, - это использование Коррекция орфографии. Похоже, что пользователи спешат, когда делают запросы к системе. Мы часто сталкиваемся с такими запросами:

Покажи мне менеджеров в amzon
java разработчиков в Лондоне

Процесс исправления орфографии помогает нам в значительной степени исправить такие случаи и сделать нашу систему более удобной.

На что это похоже

Система теперь позволяет пользователям вводить произвольный текстовый запрос, затем извлекает и показывает пользователю сущности, а также показывает результаты на основе этих сущностей / фильтров.

В приведенном выше примере показан запрос «Директор в Microsoft». Система правильно определяет объекты Директор и Microsoft и применяет эти фильтры за вас.

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

Ссылки: -