Какие алгоритмы я должен использовать для выполнения классификации работы на основе данных резюме?

28

Обратите внимание, что я делаю все в R.

Проблема заключается в следующем:

В основном, у меня есть список резюме (резюме). Некоторые кандидаты будут иметь опыт работы раньше, а некоторые нет. Цель здесь состоит в том, чтобы: основываясь на тексте их резюме, я хочу классифицировать их по различным секторам работы. Я особенно в тех случаях, когда кандидаты не имеют никакого опыта / является студентом, и я хочу сделать прогноз, чтобы классифицировать, какие сферы работы этот кандидат наиболее вероятно будет принадлежать после окончания учебы.

Вопрос 1: Я знаю алгоритмы машинного обучения. Тем не менее, я никогда не делал НЛП раньше. Я наткнулся на распределение скрытого Дирихле в Интернете. Однако я не уверен, что это лучший подход к решению моей проблемы.

Моя оригинальная идея: сделать это контролируемой проблемой обучения . Предположим, у нас уже есть большой объем помеченных данных, что означает, что мы правильно пометили секторы работ для списка кандидатов. Мы дорабатываем модель с использованием алгоритмов ML (т.е. ближайшего соседа ...) и вводим эти немеченые данные , которые являются кандидатами, которые не имеют опыта работы / являются студентами, и пытаемся предсказать, к какому сектору работы они будут принадлежать.

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

I deployed ML algorithm in this project and... Skills: Java, Python, c++ ...

Это то, что я имел в виду под «неструктурированным», то есть сворачивая все в одну строку.

Это неправильный подход? Пожалуйста, поправьте меня, если вы думаете, что мой подход неверен.

Вопрос 3: хитрая часть: как определить и извлечь ключевые слова ? Используя tmпакет в R? на каком алгоритме основан tm пакет? Должен ли я использовать алгоритмы НЛП? Если да, на какие алгоритмы мне следует обратить внимание? Пожалуйста, укажите мне несколько хороших ресурсов, чтобы посмотреть на них.

Любые идеи будут великолепны.

user1769197
источник

Ответы:

14

Проверьте эту ссылку.

Здесь они проведут вас через загрузку неструктурированного текста для создания облака слов. Вы можете адаптировать эту стратегию и вместо создания облака слов вы можете создать частотную матрицу используемых терминов. Идея состоит в том, чтобы взять неструктурированный текст и как-то его структурировать. Вы изменяете все на строчные (или прописные), удаляете стоп-слова и находите частые термины для каждой функции задания через Матрицы термина документа. У вас также есть возможность остановить слова. Если вы остановите слова, вы сможете обнаружить разные формы слов как одно и то же слово. Например, «запрограммировано» и «программирование» могут быть обозначены как «программа». Возможно, вы можете добавить вхождение этих частых терминов в качестве взвешенной функции в вашем обучении модели ML.

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

Пример:

1) Загрузите библиотеки и создайте пример данных

library(tm)
library(SnowballC)

doc1 = "I am highly skilled in Java Programming.  I have spent 5 years developing bug-tracking systems and creating data managing system applications in C."
job1 = "Software Engineer"
doc2 = "Tested new software releases for major program enhancements.  Designed and executed test procedures and worked with relational databases.  I helped organize and lead meetings and work independently and in a group setting."
job2 = "Quality Assurance"
doc3 = "Developed large and complex web applications for client service center. Lead projects for upcoming releases and interact with consumers.  Perform database design and debugging of current releases."
job3 = "Software Engineer"
jobInfo = data.frame("text" = c(doc1,doc2,doc3),
                     "job" = c(job1,job2,job3))

2) Теперь мы немного структурируем текст. Я уверен, что есть более быстрые / короткие способы сделать следующее.

# Convert to lowercase
jobInfo$text = sapply(jobInfo$text,tolower)

# Remove Punctuation
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[[:punct:]]"," ",x))

# Remove extra white space
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[ ]+"," ",x))

# Remove stop words
jobInfo$text = sapply(jobInfo$text, function(x){
  paste(setdiff(strsplit(x," ")[[1]],stopwords()),collapse=" ")
})

# Stem words (Also try without stemming?)
jobInfo$text = sapply(jobInfo$text, function(x)  {
  paste(setdiff(wordStem(strsplit(x," ")[[1]]),""),collapse=" ")
})

3) Составьте корпус источника и матрицу терминов документа.

# Create Corpus Source
jobCorpus = Corpus(VectorSource(jobInfo$text))

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

# Create Term Frequency Matrix
jobFreq = as.matrix(jobDTM)

Теперь у нас есть матрица частот, jobFreq, то есть матрица (3 на x), 3 записи и X количество слов.

Куда вы идете отсюда зависит от вас. Вы можете хранить только определенные (более распространенные) слова и использовать их в качестве функций в вашей модели. Другой способ - сохранить простоту и использовать процент слов, используемых в каждой должностной инструкции, например, «java» встречается на 80% в «инженере-программисте» и только на 50% в «обеспечении качества».

Теперь пришло время посмотреть, почему у «уверенности» 1, а у «вхождения» 2.

nfmcclure
источник
Я хотел бы увидеть ваш пример.
user1769197
Обновлено с быстрым примером.
nfmcclure
11

Просто извлеките ключевые слова и обучите их по классификатору . Вот и все, правда.

Большая часть текста в резюме на самом деле не связана с навыками. Например, рассмотрим предложение «Я опытный и очень эффективный в Java». Здесь только 1 из 7 слов - это название навыка, а остальные - просто шум, который снизит точность вашей классификации.

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

Так просто разметить (и , возможно , проистекает ) Ваше резюме, выберите только слова из предопределенного списка (вы можете использовать LinkedIn или что - то подобное , чтобы захватить этот список), создать вектор функции и попробовать пару классификаторов (скажем, SVM и наивный Байес) ,

(Примечание: я использовал аналогичный подход для классификации профилей LinkedIn на более чем 50 классов с точностью> 90%, поэтому я уверен, что даже наивная реализация будет работать хорошо.)

ffriend
источник
Скажем, я анализирую данные в формате linkedin. Как вы думаете, было бы неплохо объединить предыдущий опыт работы, рекомендации по образованию и навыки одного профиля в один текстовый файл и извлечь из него ключевые слова?
user1769197
В LinkedIn теперь есть теги навыков, которые люди назначают себе и могут одобрять другие пользователи, поэтому в принципе нет необходимости извлекать ключевые слова вручную. Но в случае менее структурированных данных - да, может быть полезно объединить все и затем извлечь ключевые слова. Однако помните главное правило: попробуйте . Теория хороша, но только практические эксперименты с разными подходами покажут лучший.
друг
@ffriend, Как мы можем получить этот список ключевых слов?
NG_21
1
@ffriend Каков наилучший способ извлечь слова «опыт» = «5 лет», «язык» = «С» из следующего предложения. «Я потратил 5 лет на разработку систем отслеживания ошибок и создание приложений системы управления данными в C». Я использовал Rake с NLTK, и он просто убрал стоп-слово + знаки препинания, но из вышеприведенного предложения мне не нужны такие слова, как разработка, отслеживание ошибок, системы, создание, данные и т. Д. Спасибо
Халид Усман
3
@KhalidUsman: поскольку вы уже работаете с NLTL, взгляните на инструменты распознавания именованных сущностей , особенно раздел «Разделение на части с регулярными выражениями». В общем, вы хотели бы использовать словарь ключевых слов (например, "years", "C" и т. Д.) И простой набор правил (например, "содержит" C "или" <число> лет ") для извлечения именованных объектов из текста в свободной форме.
друг
7

Это сложная проблема. Есть много способов справиться с этим. Я думаю, резюме можно рассматривать как полуструктурированные документы. Иногда полезно иметь какую-то минимальную структуру в документах. Полагаю, в резюме вы увидите некоторые табличные данные. Возможно, вы захотите рассматривать их как пары значений атрибутов. Например, вы получите список терминов для атрибута «Набор навыков».

Основная идея заключается в том, чтобы вручную настроить список ключевых фраз, таких как «навык», «образование», «публикация» и т. Д. Следующим шагом является извлечение терминов, которые относятся к этим ключевым фразам, либо путем использования структуры каким-либо образом (например, в виде таблиц) или используя близость терминов вокруг этих ключевых фраз, например, тот факт, что слово «Java» находится в непосредственной близости от термина «навык», может указывать на то, что человек является специалистом по Java.

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

Doc1: {проект: (java, 3) (c, 4)}, {образование: (компьютер, 2), (физика, 1)}

Doc2: {проект: (Java, 3) (Python, 2)}, {образование: (математика, 3), (компьютер, 2)}

В приведенном выше примере я показываю термин с частотой. Конечно, при извлечении терминов вам нужно ставить и удалять стоп-слова. Из примеров видно, что человек, чье резюме - Doc1, более квалифицирован в C, чем в D2. В случае реализации очень легко представлять документы в виде векторов полей в Lucene.

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

Debasis
источник
По алгоритму: что бы вы порекомендовали?
user1769197
Вы имеете в виду алгоритм для вычисления наиболее похожих векторов резюме с учетом вектора задания запроса? Вы можете использовать любой стандартный алгоритм, такой как BM25 или Language Model ...
Debasis
Я никогда не слышал об этих алгоритмах вообще. Это алгоритмы НЛП или алгоритм ML?
user1769197
это стандартные модели поиска ... модель поиска определяет, как вычислить сходство между документом (резюме в вашем случае) и запросом (работа в вашем случае).
Debasis
Я ничего не знаю о поиске информации, как вы думаете, алгоритмы машинного обучения, такие как кластеризация / ближайший сосед, также будут работать в моем случае?
user1769197
7

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

с точки зрения классификации документов, я бы взял аналогичный подход. Я бы порекомендовал вычислять матрицу TF IDF для каждого резюме в качестве стандартной модели набора слов, извлекая только название должности и навыки человека (для которого вам нужно будет определить список навыков, которые нужно искать), и передать их в ML алгоритм. Я бы порекомендовал попробовать knn и SVM, который очень хорошо работает с текстовыми данными большого размера. Линейные SVM, как правило, работают лучше, чем нелинейные (например, с использованием ядер RBf). Если у вас есть такой вывод с приемлемыми результатами, я бы поэкспериментировал с извлечением функций, используя синтаксический анализатор \ chunker на естественном языке, а также некоторые пользовательские фразы, сопоставленные с регулярными выражениями.

Саймон
источник
Вы все еще используете SVM, когда у вас есть 3 или более классов? А какие функции вы хотите извлечь, используя синтаксический анализатор естественного языка? С какой целью ?
user1769197
Вы можете обучить n svm для n классов, используя стратегию «один против остальных». У SciKitLearn есть код, который делает это автоматически. Технически вам нужны n-1 классификаторы, но я обнаружил, что n работает лучше.
Симон
@Simon Можете ли вы написать полные шаги для этой системы рекомендаций? У меня мало опыта (реализация тезисов MS) в ML, но я совершенно новый в области IR. Сейчас я работаю над этой системой и написал следующие шаги. 1. Используйте NLTK для извлечения ключевых слов, 2. Рассчитайте оценку для ключевых слов и фраз, 3. Стеммер, 4. Категоризация (самая сложная задача) и 5. Матрица частот, алгоритм tf-idf или BM25. Я на правильном пути реализации? Спасибо
Халид Усман
@KhalidUsman Я не могу сказать вам точно, как это работает, это может привести к неприятностям Самым простым решением было бы поместить данные в Solr или Elastic Search и использовать их реализации рекомендателя MLT. Более сложный подход заключается в извлечении ключевых слов и фраз, проталкивании документов через LSA и выполнении k-nn для результирующих векторов. Тогда вы можете использовать другие сигналы, такие как совместная фильтрация и общая популярность.
Саймон
@ Симон, спасибо за ваше руководство. Я применяю 2-й способ, я извлек ключевые слова / ключевые фразы, используя RAKE + NLTK, и после этого я планировал применить tf-idf или BM25. Я прав? Не могли бы вы немного рассказать о KNN, я имею в виду, как применять knn к ключевым словам, если я сделаю ключевые слова как функции? Спасибо
Халид Усман