Как мы запустили агрегатор удаленных вакансий и зачем в нем ML

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

В один прекрасный день в конце 2020 года мы решили сделать еще один агрегатор удаленных вакансий, начав с исключительно IT-позиций. Логично спросить: зачем? Мол, на рынке их уже достаточно. Ответ на этот вопрос звучит очень просто: мы понимали, как улучшить текущие решения как минимум по пяти параметрам.

  • Количество (агрегировать больше всех в мире);

  • Реальная удаленка (а не позиции в стиле "remote until COVID-19");

  • Актуальность (часто на схожих сайтах можно найти большое количество неактуальных вакансий);

  • Хороший поиск (по нашему мнению поиск на текущих сайтах с удаленными вакансиями находится на уровне 2005 года);

  • Фильтр по гражданству.

О последнем параметре я и хочу сегодня рассказать.

Прежде, чем вы начнете читать. Сегодня мы запустились с Bergamot на ProductHunt. И, если у вас вдруг возникло желание поддержать наш продукт, будет круто. Ищите нас тут.

Проблема

Иногда компании устанавливают ограничения для граждан некоторых стран (например, компания готова нанимать только ребят с гражданством США / или конкретным типом визы ЕС). Как правило, на страницах с описанием вакансий нет отдельного поля где выводились бы подобные ограничения. И поиска/фильтра, соответственно, тоже нет. Поэтому соискателю приходится внимательно читать текст каждой вакансии, чтобы понять, есть ли вообще смысл откликаться на эту позицию.

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

Анализ

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

Шаг №1

Ищем определенные ключевые слова в тексте, например: «only», «remote in», «authorized to work in» и так далее.

Шаг №2

Ищем рядом с ключевыми словами локацию. Как правило, это слово, которое начинается с заглавной буквы. Если такое слово-локация находится, то оно и является ограничением.

Окей, если в вакансии написано «USA only», то такая логика работает идеально. Но если капнуть глубже, становится понятно, что ограничения могут быть обозначены самыми разными, например:

  • This role is remote and you can be based anywhere across the UK

  • Living in Europe is a must

  • This opportunity is only open to candidates within Canada at this time

  • Location: Argentina (any part of the country it’s great for us!)

  • и еще сотни других описаний.

Очевидно, алгоритмами задачу не решить — и мы попробовали использовать силу ML-a.

Задача

На всякий случай ещё раз сформулирую задачу. На входе — текст с описанием вакансии, в котором, как правило, содержится описание компании, стек технологий, требования, условия, бенефиты и так далее. На выходе у нас должны быть параметры:

restriction: 0 (no) / 1 (yes)

если restriction = 1, то тогда необходимо выделять еще и страну, по которой есть ограничение

Решение

Структура решения

Итак: на входе у нас текст, в котором обычно содержится куча всего. Задача была несколько сложнее, чем просто написать обычный классификатор. Сначала нужно было найти, что именно классифицировать.

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

Нахождение локаций

Сначала мы также хотели решить задачу «в лоб»: найти где-нибудь список всех стран и городов и просто искать их вхождение в тексте. Но опять же, задача оказалась не такой очевидной.

Во-первых, ограничения касались не только стран и столиц мира, а также небольших городов и штатов. Например «Can work full time in Eugene, OR / Hammond, IN». А сделать список локаций всех уровней уже сложнее.

Во-вторых, написания локаций в вакансиях часто отличались от стандартного (например «100% Remote in LATAM»).

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

  • geoparsepy 2.1.4

  • Stanford NER

  • NeuroNER

  • spaCy EntityRecognizer

В итоге выбор пал на spaCy, потому что из готовых и бесплатных вариантов spaCy EntityRecognizer показал наилучший результат.

Итого: нам удалось выделить в тексте локации.

Разделение на предложения

Для разделения на предложения, где есть локации, мы тоже использовали spaCy.

На выходе мы получили список предложений из текста, где содержатся локации. Вот примеры таких предложений:

  • The position is remote so the only thing is they have to be in the US and be able to work Eastern or Central time.

  • This job is located out of our Chicago office, but remote, US-based applicants are still encouraged to apply.

  • This is a remote role, but we're looking for candidates based in Montreal, Canada.

Классификатор

Эти предложения и должна была разметить модель. Важно — у нас не было возможности сделать датасет с десятками тысяч таких предложений (на это нужно очень много времени), поэтому при подборе модели нам надо было учесть эти ограничения.

Решили попробовать несколько моделей, среди которых как более простые CNN и LSTM, так и более современные transformers. Последние предсказуемо оказались лучше, обучение которых сводилось по сути к fine-tunning — это нам точно подходило, ведь датасет, как я уже сказал выше, был невелик.

Среди transformers наилучший результат показала архитектура RoBERTa (roberta-base) с показателем точности 94% для нашего датасета.

Нормализация локаций

На основе классификатора и NER-a для каждой вакансии мы получили вот такие дополнительные поля:

restriction: 1 (yes); location: London

Restriction отдавал классификатор. А вот Location выдавал NER. Из-за того что в поле Location могли быть разные написания городов и стран, мы еще сделали дополнительную нормализацию через Google API. Остановились на том, чтобы сделать ограничения по странам.

То есть на выходе получалось:

restriction: 1 (yes); location: United Kingdom

Итог

В итоге мы теперь умеем это делать и кандидаты могут фильтровать неподходящие для них вакансии. Mission accomplished (вроде бы! вы можете сами потестить Bergamot и написать, что думаете).

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

Где вы обычно ищете работу?

  • 0,0%Рекрутеры сами пишут0
  • 100,0%Захожу на HH1
  • 0,0%Использую агрегаторы, международные борды0
  • 0,0%Телеграм-каналы0
  • 0,0%Другое0
Источник: https://habr.com/ru/post/559436/


Интересные статьи

Интересные статьи

В данной пошаговой инструкции мы подробно опишем весь процесс получения доступа к WhatsApp Business API через официального партнера Facebook — сервис Gupshup и подключени...
Поводом для написания размышлений ниже послужила статья «Нужны ли резюме в IT?». Так как тема в статье мне близка и интересна, я решил написать своеобразный ответ. На мой взгляд, стать...
Любое ПО содержит уязвимости, причем они появляются на разных этапах его жизненного цикла. Полностью избавиться от уязвимостей в коде достаточно сложно, но можно, как минимум, сократить и...
В Челябинске проходят митапы системных администраторов Sysadminka, и на последнем из них я делал доклад о нашем решении для работы приложений на 1С-Битрикс в Kubernetes. Битрикс, Kubernetes, Сep...
Проблема: На текущий момент наиболее удобным и полноценным программным обеспечением (далее ПО) для автоматизации торговли на российском биржевом рынке является небезызвестный ТСЛАБ. Несмотря на ...