이력서 데이터를 기반으로 작업 분류를 수행하려면 어떤 알고리즘을 사용해야합니까?


28

R에서 모든 일을하고 있습니다.

문제는 다음과 같습니다.

기본적으로 이력서 (CV) 목록이 있습니다. 일부 응시자는 이전에 업무 경험이 있고 일부는 그렇지 않습니다. 여기서 목표는 이력서의 텍스트를 기반으로 다른 작업 부문으로 분류하고 싶습니다. 나는 지원자가 경험이없는 학생 / 학생 인 경우에 특히 관심이 있으며, 졸업 후이 지원자가 속하는 직업 분야를 분류하기 위해 예측하고 싶습니다.

질문 1 : 머신 러닝 알고리즘을 알고 있습니다. 그러나 나는 전에 NLP를 한 적이 없다. 인터넷에서 Latent Dirichlet 할당을 발견했습니다. 그러나 이것이 내 문제를 해결하는 가장 좋은 방법인지 확실하지 않습니다.

내 원래 아이디어 : 이것을 감독 학습 문제로 만듭니다. 이미 많은 양의 레이블이 지정된 데이터가 있다고 가정합니다. 즉, 후보 목록에 대한 작업 섹터에 올바르게 레이블이 지정되어 있습니다. ML 알고리즘 (예 : 가장 가까운 이웃 ...)을 사용하여 모델을 학습하고 레이블이없는 데이터 를 입력합니다.이 데이터 는 실무 경험이 없거나 학생 인 후보이며 해당 직종이 어느 직업 분야에 속하는지 예측하려고합니다.

질문 2 업데이트 : 이력서의 모든 것을 추출하여 텍스트 파일을 작성하고 텍스트 파일에 이러한 데이터를 인쇄하여 각 이력서가 구조화되지 않은 문자열을 포함하는 텍스트 파일과 연결되도록하는 것이 좋습니다. 텍스트 파일에 텍스트 마이닝 기술을 적용하고 데이터를 구조화하거나 텍스트 파일에서 사용되는 용어 빈도 행렬을 만들 수 있습니까? 예를 들어, 텍스트 파일은 다음과 같습니다.

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

이것이 내가 '구조화되지 않은'의 의미입니다. 즉 모든 것을 한 줄로 묶습니다.

이 접근 방식이 잘못 되었습니까? 내 접근 방식이 잘못되었다고 생각되면 수정하십시오.

질문 3 : 까다로운 부분입니다 방법 : 확인하고 키워드를 추출 ? tmR 에서 패키지 사용 ? tm 패키지 는 어떤 알고리즘을 기반으로합니까? NLP 알고리즘을 사용해야합니까? 그렇다면 어떤 알고리즘을 살펴 봐야합니까? 볼만한 좋은 자료를 알려주세요.

어떤 아이디어라도 좋을 것입니다.

답변:


14

링크를 확인하십시오 .

여기서는 구조화되지 않은 텍스트를로드하여 wordcloud를 만듭니다. 이 전략을 적용하고 단어 구름을 만드는 대신 사용되는 용어 빈도 행렬을 만들 수 있습니다. 아이디어는 구조화되지 않은 텍스트를 가져 와서 어떻게 든 구조화하는 것입니다. 문서 용어 행렬을 통해 모든 것을 소문자 (또는 대문자)로 변경하고 중지 단어를 제거하며 각 작업 기능에 대해 자주 사용되는 용어를 찾습니다. 단어를 형태소 분석 할 수도 있습니다. 단어를 파생 시키면 같은 단어와 다른 형태의 단어를 감지 할 수 있습니다. 예를 들어 'programmed'및 'programming'은 'program'으로 이어질 수 있습니다. 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 x) 행렬, 3 개의 항목 및 X 개의 단어 수입니다.

여기서 당신이가는 곳은 당신에게 달려 있습니다. 특정 (보다 일반적인) 단어 만 유지하고이를 모델의 기능으로 사용할 수 있습니다. 또 다른 방법은 간단하게 유지하고 각 작업 설명에 사용 된 단어 비율을 유지하는 것입니다. "java"는 '소프트웨어 엔지니어'에서 80 %, '품질 보증'에서는 50 % 만 나타납니다.

이제 '보증'에 1 'r'이 있고 '발생'에 2 'r이있는 이유를 찾아 볼 시간입니다.


나는 당신의 모범을보고 싶습니다.
user1769197

빠른 예제로 업데이트되었습니다.
nfmcclure

11

키워드를 추출 하고 분류기 를 훈련시키기 만하면 됩니다. 그게 다야.

CV의 텍스트 대부분은 실제로 기술과 관련이 없습니다. 예를 들어 "저는 Java에 경험이 있고 매우 효율적입니다"라는 문장을 고려하십시오. 여기 7 단어 중 1 단어 만 기술 이름이고 나머지는 분류 정확도를 떨어 뜨리는 소음 일뿐입니다.

대부분의 CV는 실제로 구조화되어 있지 않습니다. 또는 너무 자유롭게 구성되었습니다. 또는 섹션에 이상한 이름을 사용하십시오. 또는 텍스트로 변환 할 때 구조를 유지하지 않는 파일 형식입니다. 나는 구조화되지 않은 텍스트에서 날짜, 시간, 이름, 주소 및 심지어 사람들의 의도를 추출한 경험이 있지만 기술 (또는 대학 또는 기타) 목록은 아니지만 밀접하게도 아닙니다.

따라서 CV를 토큰 화하고 (가능하면 줄기 ) 미리 정의 된 목록에서 단어 만 선택하십시오 (LinkedIn 또는 유사한 목록을 사용 하여이 목록을 잡을 수 있음). 특징 벡터를 만들고 몇 가지 분류기를 시도하십시오 (예 : SVM 및 Naive Bayes) .

(참고 : 비슷한 접근 방식을 사용하여 LinkedIn 프로필을 정확도가 90 % 이상인 50 개 이상의 클래스로 분류 했으므로 순진한 구현조차도 잘 작동합니다.)


내가 연결된 데이터를 분석한다고 가정 해 봅시다. 이전 직장 경험, 교육 권장 사항 및 한 프로필의 기술을 하나의 텍스트 파일로 병합하고 키워드를 추출하는 것이 좋은 생각이라고 생각하십니까?
user1769197

LinkedIn에는 이제 사람들이 자신에게 할당하고 다른 사용자가 승인 할 수있는 기술 태그가 있으므로 기본적으로 키워드를 수동으로 추출 할 필요가 없습니다. 그러나 덜 구조화 된 데이터의 경우-예, 모든 것을 병합 한 다음 키워드를 검색하는 것이 도움이 될 수 있습니다. 그러나 기본 규칙을 기억하십시오. 사용해보십시오 . 이론은 좋지만 다른 접근법을 사용하는 실용적인 실험만으로도 가장 좋습니다.
ffriend

@ffriend, 키워드 목록은 어떻게 얻습니까?
NG_21

1
@ffriend 다음 문장에서 "experience"= '5 years', "Language"= 'C'를 추출하는 가장 좋은 방법은 무엇입니까? "버그 추적 시스템을 개발하고 C로 데이터 관리 시스템 응용 프로그램을 만드는 데 5 년을 보냈습니다. 나는 NLTK와 함께 레이크를 사용했고 그것은 단지 스톱 워드 + 구두점을 제거했지만, 위 문장에서 개발, 버그 추적, 시스템, 생성, 데이터 등과 같은 단어는 필요하지 않습니다. 감사
Khalid Usman

3
@KhalidUsman : 이미 NLTL로 작업하고 있으므로 명명 된 엔티티 인식 도구 , 특히 "정규 표현식으로 청크"섹션을 살펴보십시오. 일반적으로 키워드 사전 (예 : "연도", "C"등)과 간단한 규칙 세트 (예 : " 'C'"또는 "<번호> 연도 포함")를 사용하여 명명 된 엔티티를 추출하려고합니다. 자유 형식의 텍스트.
ffriend

7

이것은 까다로운 문제입니다. 여러 가지 방법으로 처리 할 수 ​​있습니다. 이력서는 반 구조화 된 문서로 취급 될 수 있습니다. 때로는 문서에서 최소한의 구조를 갖는 것이 유리합니다. 나는 이력서에 몇 가지 표 형식의 데이터를 볼 것이라고 믿습니다. 이를 속성 값 쌍으로 취급 할 수 있습니다. 예를 들어 "스킬 세트"속성에 대한 용어 목록이 표시됩니다.

핵심 아이디어는 "기술", "교육", "공개"등과 같은 주요 문구 목록을 수동으로 구성하는 것입니다. 다음 단계는 어떤 식 으로든 구조를 활용하여 이러한 핵심 문구와 관련된 용어를 추출하는 것입니다 (예 : 예를 들어 "자바"라는 단어가 "기술"이라는 용어에 근접해 있다는 사실은 그 사람이 자바에 능숙하다는 것을 나타낼 수 있습니다.

이러한 정보를 추출한 후 다음 단계는 이러한 각 주요 문구에 대한 특징 벡터를 구축하는 것입니다. 그런 다음 문서를 다른 필드가있는 벡터로 표현할 수 있습니다 (키 문구마다 하나씩). 예를 들어, 두 개의 필드 ( 프로젝트교육)로 표시되는 다음 두 개의 이력서를 고려하십시오 .

Doc1 : {프로젝트 : (java, 3) (c, 4)}, {교육 : (컴퓨터, 2), (물리학, 1)}

Doc2 : {프로젝트 : (java, 3) (python, 2)}, {교육 : (수학, 3), (컴퓨터, 2)}

위의 예에서는 빈도가 포함 된 용어를 보여줍니다. 물론 용어를 추출하는 동안 중지 단어를 제거하고 제거해야합니다. 이력서가 Doc1 인 사람이 D2보다 C에 더 능숙하다는 것은 예에서 분명합니다. 현명하게 구현하면 Lucene에서 문서를 필드 벡터로 표현하는 것이 매우 쉽습니다.

이제 다음 단계는 작업 스펙이 주어진 순위의 이력서 목록을 검색하는 것입니다. 실제로 쿼리 (작업 사양)를 필드 벡터로 나타내는 경우에는 매우 간단합니다. 색인화 된 이력서 모음에서 Lucene을 사용하여 순위가 지정된 후보 (이력서) 목록을 검색하기 만하면됩니다.


알고리즘 현명한 : 당신은 무엇을 추천 하시겠습니까?
user1769197

쿼리 작업 벡터가 주어진 가장 유사한 이력서 벡터를 계산하는 알고리즘을 의미합니까? BM25 또는 언어 모델과 같은 표준 알고리즘을 사용할 수 있습니다.
Debasis

나는이 알고리즘에 대해 전혀 들어 본 적이 없다. 이 NLP 알고리즘 또는 ML 알고리즘입니까?
user1769197

이것들은 표준 검색 모델입니다 ... 검색 모델은 문서 (귀하의 경우 재개)와 쿼리 (귀하의 경우 작업) 사이의 유사성을 계산하는 방법을 정의합니다.
Debasis

정보 검색에 대한 지식이 없습니다. 클러스터링 / 가장 가까운 이웃과 같은 기계 학습 알고리즘도 제 경우에는 작동한다고 생각하십니까?
user1769197

7

나는 온라인 구직 사이트에서 일하고 있으며 이력서를 기반으로 구직을 추천하는 솔루션을 구축합니다. 우리의 접근 방식은 개인의 직책 (또는 학생이 알고있는 경우 원하는 직책)과 이력서에서 추출한 기술 및 위치 (대부분의 사람들에게 매우 중요한 위치)와이를 기반으로하는 직무와 일치하는 것을 찾습니다.

문서 분류 측면에서 비슷한 접근 방식을 취합니다. 각 이력서에 대한 tf idf 행렬을 표준 단어 가방 모델로 계산하여 사람의 직책과 기술 (추출 기술 목록을 정의해야 함)을 추출하여 ML에 공급하는 것이 좋습니다. 연산. knn과 SVM을 사용하는 것이 좋습니다. 후자는 높은 차원의 텍스트 데이터와 매우 잘 작동합니다. 리니어 SVM은 비선형보다 나은 경향이 있습니다 (예 : RBf 커널 사용). 합리적인 결과를 출력하면 자연 언어 파서 \ chunker를 사용하여 기능을 추출하고 정규 표현식과 일치하는 일부 사용자 정의 구문을 재생합니다.


3 개 이상의 클래스가있을 때 여전히 SVM을 사용합니까? 그리고 자연어 구문 분석기를 사용하여 추출 할 기능은 무엇입니까? 무슨 목적을 위해 ?
user1769197

하나의 전략과 나머지 전략을 사용하여 n 개의 클래스에 대해 n 개의 svm을 훈련시킬 수 있습니다. SciKitLearn에는이를 자동으로 수행하는 코드가 있습니다. 기술적으로 n-1 분류 기가 필요하지만 n이 더 잘 작동한다는 것을 알았습니다.
Simon

@Simon이 추천 시스템의 전체 단계를 작성할 수 있습니까? ML에서는 경험이 거의 없지만 (MS 논문 구현) IR 분야에서는 완전히 새로운 것입니다. 이제이 시스템을 작업 중이며 다음 단계를 작성했습니다. 1. NLTK를 사용하여 키워드를 추출합니다. 2. 키워드 및 구문에 대한 점수를 계산합니다. 3. Stemmer, 4. 분류 (가장 어려운 작업) 및 5. 빈도 매트릭스, tf-idf 또는 BM25 알고리즘. 내가 올바른 구현 방법에 있습니까? 감사합니다
칼리드 우스만

@ KhalidUsman 나는 그것이 어떻게 작동하는지 정확하게 말할 수 없어서 문제가 생길 수 있습니다. 가장 쉬운 해결책은 데이터를 Solr 또는 Elastic Search에 넣고 MLT 추천 구현을 사용하는 것입니다. 보다 복잡한 접근 방식은 키워드와 구를 추출하고 문서를 LSA를 통해 푸시하고 결과 벡터에 k-nn을 수행하는 것입니다. 그런 다음 Collaborative Filtering 및 전체적인 인기와 같은 다른 신호를 사용할 수 있습니다.
Simon

@Simon,지도 해 주셔서 감사합니다. 나는 두 번째 방법을 적용하고 있는데 RAKE + NLTK를 사용하여 키워드 / 키 구문을 추출했으며 그 후에 tf-idf 또는 BM25를 적용하려고했습니다. 내가 맞아? KNN 방식을 좀 더 정교하게 설명해 주시겠습니까? 키워드에 knn을 적용하는 방법을 의미합니다. 키워드를 기능으로 만들어야합니까? 감사합니다
칼리드 우스만
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.