Подбор персонала — это поиск иголки в стоге сена, с одной оговоркой: иголка должна хотеть работать именно у вас. Когда на входе — сотни резюме с hh.ru, а на выходе нужно выбрать топ-5 кандидатов, без автоматизации не обойтись. Но как научить алгоритм отличать будущего топ-менеджера от человека, который в графе «Опыт работы» указал «10 лет в Minecraft»?

Разберёмся, как ранжировать резюме, чтобы не тратить часы на бессмысленные собеседования.
«Когда я впервые попробовал автоматизировать отбор резюме, то наивно полагал, что всё просто: бери ключевые слова — и фильтруй. Реальность оказалась сложнее. После 20 итераций, сотен ручных проверок и десятков часов обсуждений с HR я понял: автоматизация — это не про "заменить рекрутера", а про то, чтобы дать ему суперспособность видеть сквозь стог сена. В этой статье (поделённой на несколько частей) — только проверенные на практике решения, а не абстрактная теория».
Часть 1: Трезвый взгляд на данные
Прежде чем учить машину ранжировать кандидатов, нужно понять, как она их "читает". Резюме — это неструктурированный текст, где важная информация размазана между:
Опытом работы (от "10 лет в Minecraft" до "Создал отдел продаж с нуля").
Навыками (от "уверенный пользователь Excel" до "Python (на уровне пет проектов)").
Образованием (от "неоконченное высшее" до "MBA INSEAD").
Скрытыми маркерами (например, "участвовал в хакатоне" vs."опыт управления командой 5+ лет").
Если просто искать ключевые слова, алгоритм пропустит перспективных кандидатов с нестандартными формулировками и отберет тех, кто хорошо копирует шаблоны из интернета.
Проблема: хаос в данных

На примере парсинга с HH.ru мы собрали 1000 резюме по направлению «Разработка». В итоге получилась таблица с 183 столбцами — почему так много?
Разный уровень опыта
У junior-разработчиков может не быть столбцов с опытом работы, зато много строк о курсах.
Senior-специалисты, наоборот, заполняют детальные описания проектов, но могут пропускать раздел "Дополнительное образование".
Изменчивость платформ
HH.ru может в любой момент поменять структуру данных или добавить экспериментальные поля для отдельных групп кандидатов.
Названия столбцов нестабильны: сегодня это "Опыт работы: Компания", а завтра — "Работа: Организация".
Решение: классификация и очистка данных
Прежде чем анализировать резюме, нужно привести их к единой структуре.
Шаг 1. Классификация столбцов
Вместо того чтобы полагаться на исходные названия, мы обучаем алгоритм определять тип данных в каждом столбце.
Как это работает?
Берем 20-30% случайных строк из каждого столбца.
С помощью NLP-модели (например, BERT или простого Word2Vec + классификатора) предсказываем, к какой категории относится столбец:
Опыт работы
Образование
Навыки
Контактные данные
и т. д.
Присваиваем столбцу тег (например, Education) и объединяем схожие данные.
Пример:
Есть разрозненные поля:
"Образование 1: Учреждение"
"Образование 1: Факультет"
"Образование 1: Год окончания"
После классификации все они получают тег Education, и мы объединяем их в один осмысленный текст.

Шаг 2. Фильтрация бесполезных данных
Не все столбцы стоит учитывать. Отбрасываем:
Пустые или почти пустые (более 50% пропусков).
Содержащие мусор (например, столбец "Новое", где в каждой строке написано "Новое").
Несущественные для анализа (например, "Пол" — если только вы не набираете актеров для роли в историческом фильме).
Шаг 3. Использование регулярных выражений
Здесь всё просто, мы обрабатываем, ссылки, даты, цифры так как в 90% случаев анализа резюме они не важны.

Что дальше?
После очистки и классификации данных мы получаем структурированный датасет, с которым можно работать. В следующих частях разберем:
Как выделять ключевые навыки (и отличать "знакомство" от "профессионального владения").
Как оценивать релевантность опыта (потому что "5 лет в стартапе" ≠ "5 лет в корпорации").
Как учитывать "мягкие" факторы (участие в хакатонах, открытые исходники, рекомендации).
Главное: автоматизация подбора — это не про замену рекрутера, а про то, чтобы дать ему лазерное зрение в этом стоге сена.
(Надеюсь вы оцените данную статью, что бы я скорее написал продолжение. Продолжение следует...)