Извлечение объявлений о вакансиях на сайте Indeed и использование тематического моделирования для поиска скрытых тем в объявлениях о вакансиях

Как человек, недавно находившийся на рынке для новой работы по науке о данных, я просматривал объявления о вакансиях на ряде сайтов и подумал, что было бы интересно проанализировать сообщения на Действительно и применить скрытое распределение Дирихле (LDA) к работе. описания. Мы надеемся, что темы, созданные LDA, должны дать представление о ключевых навыках обработки данных, востребованных работодателями.

Для этого был предпринят следующий процесс:

  1. Собрать данные с Действительно с помощью Beautiful Soup
  2. Проанализируйте объявления о вакансиях
  3. Очистите данные и примените тематическое моделирование

На данный момент я собираю вакансии только в Большом Лондоне, поскольку это имеет отношение ко мне, но я также могу собирать вакансии из других мест в Великобритании, чтобы увеличить набор данных. Весь код, используемый для этого анализа, можно найти на Github.

1. Удаление объявлений о вакансиях

Информация в каждом объявлении о вакансии на Indeed включает:

  • Название работы
  • Компания
  • Место расположения
  • Форма контракта*
  • Оплата труда*
  • Описание работы

*не во всех объявлениях о вакансиях. Тип контракта (постоянный, контракт и т. д.) предоставлялся только в 40% случаев, а зарплата — примерно в 50% случаев.

Скрапинг объявлений о вакансиях был выполнен с использованием библиотеки Beautiful Soup, и код, созданный для этого, содержится на странице Github. Однако приведенный ниже пример вывода показывает извлеченную информацию:

2. Анализ данных

Объем постов от компаний/рекрутеров

Неудивительно, что большинство компаний, которые часто размещают объявления, являются рекрутерами. Хотя в Большом Лондоне кажется, что Harnham и Datatech Analytics имеют наибольшее количество ролей. Возможно, стоит поговорить напрямую с этими двумя, чтобы лучше понять роли, которые они выполняют.

Удаление дубликатов сообщений

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

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

Удаление похожих описаний вакансий с косинусным сходством

Косинусное сходство — это метрика, используемая для определения того, насколько похожи документы независимо от их размера. Он измеряет косинус угла между двумя векторами (содержащими количество слов), спроецированными в многомерном пространстве, где каждое измерение соответствует слову в документе. Косинусное сходство фиксирует ориентацию (угол) документов, а не величину.

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

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

Я сделал несколько проверок, вставив достаточно длинную контактную информацию рекрутера, не связанную с ним, в объявления, которые имели высокое косинусное сходство с другим (около 1). С этим «шумом» косинусное подобие уменьшилось, но все же вернуло косинусное сходство >0,99, что предполагает, что эти похожие описания работы все еще следует использовать. Однако евклидово расстояние заметно увеличилось, что указывает на то, почему не стоит использовать меру расстояния для удаления похожих документов.

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

Название рабочих должностей

Data Scientist или инженер по машинному обучению — самые высокооплачиваемые результаты для этой должности. Однако из примерно 600 результатов, полученных в результате поиска, кажется, что в используемых названиях много различий, и примерно 400 названий должностей используются только один раз.

На данный момент я разделю все названия должностей на следующие категории:

  • Лид: любое название, содержащее лид, начальник, руководитель или менеджер.
  • Старший: любое название, содержащее старший или главный
  • Выпускник: любое название, содержащее выпускник.
  • Обычная: классифицирует все остальное как обычную роль.

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

Форма контракта

На Indeed представлены как контрактные, так и постоянные должности. 40% ролей связаны с типом контракта. Возможно, удастся дополнительно изучить те, у которых нет типа контракта, и узнать больше из их описания. Сейчас я буду классифицировать типы контрактов следующим образом:

  • Контракт: все, что связано с «контрактом» или «временным»
  • Ученичество
  • производственная практика
  • Неполная занятость
  • Постоянный: любой контракт, который классифицируется как «полный рабочий день» или «постоянный».

Python против R

Изучение того, что Python или R указано в описании вакансии, больше связано с любопытством.

Python в подавляющем большинстве случаев является предпочтительной программой в описаниях вакансий. Это выше, чем я думал, и обосновывает использование Python вместо R для создания анализа/моделей, связанных с наукой о данных.

Оплата труда

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

Средняя зарплата для обычных постоянных должностей выше, чем я ожидал, что наводит меня на мысль, что некоторые старшие должности включены туда, но этот стаж не был включен в плитку. Для ролей подрядчиков, кажется, есть ошибка в некоторых зарплатах, которая показана для ролей между 0–200 фунтами стерлингов в день. Эти роли были загружены по цене 400–500 фунтов стерлингов в неделю, когда, вероятно, они означали день (и ставили бы их в один ряд с другими ролями).

3. Тематическое моделирование

Предварительная обработка текстовых данных

Существует множество доступных материалов о методах предварительной обработки текстовых данных. Метод, принятый для этой работы, включает в себя:

  • Удаление специальных символов и пробелов
  • Преобразование в нижний регистр
  • Токенизация документа
  • Удаление стоп-слов
  • Лемматизация токенов
  • Удаление слов, состоящих только из 1 символа
  • Удаление чисел, но не слов, которые являются числами

Вся эта предварительная обработка выполняется с помощью библиотеки Python NLTK (Natural Language Toolkit).

Использование Gensim для создания словаря и набора корпусов слов

Gensim — это библиотека Python для тематического моделирования, индексации документов и поиска сходства с большими корпусами.

Gensim требует, чтобы слова (токены) были преобразованы в уникальные идентификаторы, что можно сделать, создав словарь, который сопоставляет слова с идентификаторами. После того, как словарь создан, можно создать набор слов, содержащий идентификатор слова и его частоту в каждом документе. Фактически это эквивалент матрицы Document-Term.

Тематическое моделирование с LDA

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

Подводя итог процессу LDA простым способом:

  • Количество тем, которые будут использоваться, выбрано
  • LDA просмотрит каждое слово в каждом документе и назначит его одной из K тем.
  • Анализируется % слов в каждом документе, отнесенном к теме.
  • Для каждого слова в документе также анализируется % случаев, когда это слово было назначено теме (по всем документам).

P(тема t | документ d) = % слов в документе d, которые в настоящее время относятся к теме t

P(word w | тема t) = % случаев, когда слово w было назначено теме t во всех документах

LDA переместит слово w из темы A в тему B, когда:

p(тема A | документ d) * p(слово w | тема A) ‹ p(тема B | документ d) * p(слово w |тема B)

После заданного количества проходов LDA «сходится» к более оптимальному состоянию, в котором представления тем и документы, представленные в терминах этих тем, являются более приемлемыми.

Оценка согласованности

Согласованность темы модели определяется с помощью следующих шагов:

  1. Выберите первые n наиболее часто встречающихся слов в каждой теме.
  2. Подсчитайте парные баллы для каждого из слов, выбранных выше, и сгенерируйте балл согласованности для каждой темы, объединив эти парные баллы.
  3. Оценка модели темы рассчитывается как среднее значение оценок согласованности по теме.

Подход к поиску оптимального количества тем для построения множества различных моделей с разным количеством тем (k) и выбора модели с наивысшим показателем согласованности.

Как видно из графика, оптимальное количество тем равно 9. Темы и связанные с ними ключевые слова можно визуализировать с помощью отличного пакета pyLDAvis (на основе пакета LDAvis в R).

Каждый пузырь на графике представляет одну из тем. Чем больше кружок, тем более распространена тема. Хорошая тематическая модель будет иметь относительно большие неперекрывающиеся кружки, разбросанные по диаграмме. Исходя из этого и оценки согласованности, кажется, что эту конкретную модель можно улучшить (увеличение размера данных должно привести к улучшениям), однако я считаю ее хорошей отправной точкой в ​​качестве базовой модели.

Темы, содержащиеся в объявлениях о работе

2 из 9 тем связаны с информацией для рекрутеров (например, равные возможности или схемы направления). Однако остальные темы связаны с наукой о данных и охватывают следующие области:

  1. Аналитика и статистическое моделирование
  2. Глубокое обучение, НЛП и компьютерное зрение
  3. Машинное обучение, большие данные и облачные вычисления
  4. Создание информационных продуктов
  5. Управление проектами и поддержка клиентов

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

Назначение тем для объявлений о вакансиях

Вклад каждой темы для работы рассчитывается в модели LDA. Я извлек 3 основные темы в порядке доминирования ролей, чтобы можно было наблюдать моментальный снимок того, что включает в себя каждая работа.

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

Спасибо за чтение. Если у вас есть какие-либо отзывы, пожалуйста, свяжитесь с нами, прокомментировав этот пост или написав мне в LinkedIn.

LinkedIn: https://www.linkedin.com/in/t-caffrey/

Репозиторий Github: https://github.com/tcaffrey/LDA_Job_Search