Які алгоритми я повинен використовувати для класифікації роботи на основі даних резюме?


28

Зауважте, що я все роблю в Р.

Проблема полягає в наступному:

В основному, у мене є список резюме (резюме). Деякі кандидати будуть мати досвід роботи раніше, а деякі ні. Мета полягає в тому, щоб: грунтуючись на тексті їх резюме, я хочу класифікувати їх у різні сфери роботи. Я, зокрема, в тих випадках, коли кандидати не мають жодного досвіду / є студентом, і я хочу зробити прогноз, щоб класифікувати, до яких галузей роботи цей кандидат, швидше за все, належить після закінчення навчання.

Питання 1: Я знаю алгоритми машинного навчання. Однак я ніколи раніше не робив НЛП. Я зіткнувся з виділенням Латентного Діріхле в Інтернеті. Однак я не впевнений, чи це найкращий підхід для вирішення моєї проблеми.

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

Оновіть питання 2: Чи було б гарною ідеєю створити текстовий файл, витягнувши все з резюме та надрукувавши ці дані у текстовому файлі, щоб кожне резюме було пов’язане з текстовим файлом, який містить неструктуровані рядки, і тоді ми застосовано методи виведення тексту до текстових файлів і зробити дані структурованими або навіть створити матрицю частот термінів, що використовуються з текстових файлів? Наприклад, текстовий файл може виглядати приблизно так:

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

Це те, що я мав на увазі під «неструктурованим», тобто згортанням всього в єдиний рядок.

Чи не такий підхід? Будь ласка, виправте мене, якщо ви вважаєте, що мій підхід невірний.

Питання 3: Хитра частина полягає в тому, як визначити та витягнути ключові слова ? Використовуючи tmпакет в R? на якому алгоритмі tm базується пакет? Чи варто використовувати алгоритми NLP? Якщо так, то які алгоритми слід переглянути? Будь ласка, вкажіть мені кілька хороших ресурсів, на які слід також звернути увагу.

Будь-які ідеї були б чудовими.

Відповіді:


14

Перевірте це посилання.

Тут вони перенясуть вас через завантаження неструктурованого тексту до створення wordcloud. Ви можете адаптувати цю стратегію і замість того, щоб створити wordcloud, ви можете створити частотну матрицю використовуваних термінів. Ідея - взяти неструктурований текст і якось структурувати його. Ви змінюєте все на малі (чи великі регістри), видаляєте стоп-слова та знаходите часті терміни для кожної функції завдання через матриці термінів документа. Ви також маєте змогу стримувати слова. Якщо ви покладете слова, ви зможете виявити різні форми слів як одне і те ж слово. Наприклад, "запрограмовані" та "програмування" можуть бути пов'язані з "програмою". Ви, можливо, можете додати появу цих частих термінів як зважену особливість у навчанні вашої моделі 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)

Тепер у нас є матриця частоти, taskFreq, тобто матриця (3 на х), 3 записи та кількість X.

Куди ви підете звідси, залежить від вас. Ви можете зберігати лише конкретні (більш поширені) слова і використовувати їх як функції у вашій моделі. Інший спосіб полягає в тому, щоб зробити його простим і мати відсоток слів, що використовуються в кожному описі вакансії, скажімо, "java" матиме 80% випадків у "інженері програмного забезпечення" і лише 50% зустрічається в "забезпеченні якості".

Тепер прийшов час розібратися, чому "впевненість" має 1 "r", а "зустрічальність" - 2 "r".


Я хотів би бачити ваш приклад.
користувач1769197

Оновлено швидким прикладом.
nfmcclure

11

Просто витягніть ключові слова та навчіть класифікатор . Це все, насправді.

Більшість тексту в резюме насправді не пов'язані з навичками. Наприклад, розгляньте речення "Я досвідчений та високоефективний у Java". Тут лише 1 з 7 слів - це вміння, а решта - це лише шум, який знизить вашу точність класифікації.

Більшість резюме насправді не структуровані. Або структуровано занадто вільно. Або використовуйте незвичні назви для розділів. Або формати файлів, які не зберігають структуру при перекладі в текст. У мене є досвід вилучення дат, часу, імен, адрес і навіть намірів людей з неструктурованого тексту, але не списку навичок (або університету чи чогось іншого), навіть не близько.

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

(Примітка. Я використовував подібний підхід для класифікації профілів LinkedIn на понад 50 класів з точністю> 90%, тому я впевнений, що навіть наївна реалізація спрацює добре.)


Скажімо, я аналізую пов'язані дані, чи вважаєте ви, що для мене було б гарною ідеєю об'єднати попередній досвід роботи, рекомендації щодо освіти та навички одного профілю в один текстовий файл та витягнути з нього ключові слова?
користувач1769197

Тепер LinkedIn має теги навичок, які люди призначають собі, а інші користувачі можуть схвалювати, тому в основному немає необхідності вилучати ключові слова вручну. Але у випадку менш структурованих даних - так, може бути корисним об'єднати все, а потім отримати ключові слова. Однак пам’ятайте головне правило: спробуйте . Теорія хороша, але лише практичні експерименти з різними підходами виявлять найкращий.
подруга

@ffriend, Як ми можемо отримати цей список ключових слів?
NG_21

1
@ffriend Який найкращий спосіб отримати "досвід" = "5 років", "Мова" = "С" з наступного речення. "Я витратив 5 років на розробку систем відстеження помилок та створення системних програм управління даними на C". Я використовував Rake з NLTK, і він просто видалив зупинку + розділові знаки, але з наведеного речення мені не потрібні такі слова, як розробка, відстеження помилок, системи, створення, дані тощо. Дякую
Халід Усман

3
@KhalidUsman: оскільки ви вже працюєте з NLTL, подивіться на названі засоби розпізнавання об'єктів , особливо в розділі "Чунчінг з регулярними виразами". Загалом, ви хочете використовувати словник ключових слів (наприклад, "років", "С" тощо) та простий набір правил (наприклад, "містить" С "або" <число> років ") для вилучення названих сутностей з тексту у вільній формі.
ffriend

7

Це складна проблема. Є багато способів впоратися з цим. Я здогадуюсь, резюме можна розглядати як напівструктуровані документи. Іноді вигідно мати в документах якусь мінімальну структуру. Я вважаю, у резюме ви побачили б деякі табличні дані. Ви можете розглядати це як пари значень атрибутів. Наприклад, ви отримаєте перелік термінів для атрибута "Набір навичок".

Основна ідея полягає в ручному налаштуванні списку ключових фраз, таких як "майстерність", "освіта", "публікація" і т. Д. Наступним кроком є ​​вилучення термінів, що стосуються цих ключових фраз, або шляхом використання структури певним чином (наприклад, як таблиці) або використовуючи близькість термінів навколо цих ключових фраз, наприклад, той факт, що слово "Java" знаходиться в безпосередній близькості до терміна "вміння", може вказувати на те, що людина вміє в Java.

Після вилучення цієї інформації наступним кроком може стати побудова функціонального вектора для кожної з цих ключових фраз. Потім ви можете представляти документ у вигляді вектора з різними полями (по одному для ключової фрази). Наприклад, розглянемо наступні два резюме, представлені двома напрямами, а саме: проект та освіта .

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

Doc2: {проект: (java, 3) (python, 2)}, {освіта: (математика, 3), (комп'ютер, 2)}

У наведеному вище прикладі я показую термін із частотою. Звичайно, під час вилучення термінів потрібно стримувати та видаляти стоп-слова. З прикладів видно, що людина, резюме якої є Doc1, є більш кваліфікованою на C, ніж у D2. З розумною реалізацією, в Lucene дуже просто представити документи як польові вектори.

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


Алгоритм: що б ти порадив?
користувач1769197

ви маєте на увазі алгоритм обчислення найбільш подібних векторів резюме, заданих вектором завдання запиту? ви можете використовувати будь-який стандартний алгоритм, такий як BM25 або Мовна модель ...
Debasis

Я взагалі ніколи не чув про ці алгоритми. Це алгоритми NLP або ML algo?
користувач1769197

це стандартні моделі пошуку ... модель пошуку визначає, як обчислити подібність документа (резюме у вашому випадку) та запиту (завдання у вашому випадку).
Дебасіс

Я не маю знань щодо пошуку інформації, чи вважаєте ви, що в моєму випадку також працюватимуть такі алгоритми машинного навчання, як кластеризація / найближчий сусід?
користувач1769197

7

Я працюю на веб-сайті, що працює в Інтернеті, і ми розробляємо рішення, щоб рекомендувати роботу на основі резюме. Наш підхід - це посадова особа людини (або бажана посада, якщо вона є студентом і відомою), а також навички, які ми отримуємо з їх резюме, та їх місце розташування (що дуже важливо для більшості людей), і на основі цього знаходимо збіги із завданнями.

з точки зору класифікації документів, я би застосував подібний підхід. Я рекомендую обчислити матрицю tf idf для кожного резюме як стандартну модель пакету слів, витягуючи лише назву роботи та навички людини (для чого вам потрібно буде визначити список навичок, які потрібно шукати), і подати їх у ML алгоритм. Я рекомендую спробувати knn та SVM, останній дуже добре працює з текстовими даними з високими розмірами. Лінійні SVM, як правило, краще, ніж нелінійні (наприклад, використання ядер RBf). Якщо у вас з'являються розумні результати, я б пограв з вилученням функцій за допомогою природного мовного аналізатора \ chunker, а також деяких побудованих на замовлення фраз, узгоджених з регексом.


Ви все ще використовуєте SVM, коли у вас є 3 або більше занять? І які функції ви хочете отримати, використовуючи природний мовний аналізатор? З якою метою?
користувач1769197

Ви можете тренувати n svm для n класів, використовуючи стратегію один проти решти. У SciKitLearn є код, щоб зробити це автоматично. Технічно вам потрібні n-1 класифікатори, але я виявив, що n працює краще.
Саймон

@Simon Чи можете ви написати ці кроки для цієї системи рекомендацій? У мене мало досвіду (реалізуємо дисертацію MS) в галузі МЛ, але абсолютно нова в галузі ІЧ. Зараз я працюю над цією системою, і я написав наступні кроки. 1. Використовуйте NLTK для вилучення ключових слів, 2. Обчисліть бал за ключовими словами та фразами, 3. Стеммер, 4. Категоризація (найскладніше завдання) та 5. Матриця частоти, tf-idf або альго BM25. Я на правильному шляху реалізації? Спасибі
Халід Усман

@KhalidUsman Я не можу точно сказати вам, як це працює, це може спричинити мені проблеми. Найпростішим рішенням буде введення даних у Solr або Elastic Search та використання їх реалізацій MLT-рекомендацій. Більш складний підхід полягає в вилученні ключових слів і фраз, просуньте документи через LSA і виконайте k-nn на отриманих векторах. Тоді ви можете використовувати інші сигнали, такі як спільна фільтрація та загальна популярність.
Саймон

@Simon, дякую за ваші вказівки. Я застосовую другий спосіб, я вилучив ключові слова / ключові фрази за допомогою RAKE + NLTK, і після цього я планував застосувати tf-idf або BM25. Чи правий я? Чи можете ви, будь ласка, трохи розробити спосіб KNN, я маю на увазі, як застосувати knn до ключових слів, чи слід робити ключові слова як функції? Спасибі
Халид Усман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.