В один прекрасный день в конце 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. Пробовали разные готовые варианты:
В итоге выбор пал на 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 и написать, что думаете).
ValCanada
1. Не все теги видны в поиске, например, Information Security выбрать нельзя, но можно Penetration Testing и в той же вакансии нажать на I.S. — поиск работает.
2. За бесконечную прокрутку, да еще и на кнопке, имхо — канделябром. Страницы чем не угодили?
3. Плашка с подпиской начинает надоедать уже к 3-му нажатию на «Show me more».
4. Поле с гражданством имеет значок локации, что как бы намекает, что это «где ты ищешь удаленку», хотя хинт подсказывает иное.
5. В связи с чем предложение ввести поле «в какой стране работа». Например, из Ванкувера будет тяжело работать с Мадридом, можно сразу отфильтровать.