我应该使用哪些算法来根据简历数据执行工作分类?

数据挖掘 机器学习 分类 nlp 文本挖掘
2021-09-19 21:58:27

请注意,我在 R 中做所有事情。

问题如下:

基本上,我有一份简历 (CV) 清单。有些候选人之前会有工作经验,有些则没有。这里的目标是:根据他们简历上的文字,我想将他们分类到不同的工作领域。我特别在那些候选人没有任何经验/是学生的情况下,我想做一个预测来分类这个候选人在毕业后最有可能属于哪些工作领域。

问题 1:我知道机器学习算法。但是,我以前从未做过 NLP。我在互联网上遇到了潜在的狄利克雷分配。但是,我不确定这是否是解决我的问题的最佳方法。

我最初的想法: 把它变成一个有监督的学习问题假设我们已经有大量的标记数据,这意味着我们已经正确地标记了候选人列表的工作部门。我们使用 ML 算法(即最近邻...)训练模型并输入那些未标记的数据,这些数据是没有工作经验的候选人/是学生,并尝试预测他们将属于哪个工作部门。

更新 问题2:通过提取简历中的所有内容并将这些数据打印到文本文件中来创建一个文本文件是否是个好主意,这样每个简历都与一个包含非结构化字符串的文本文件相关联,然后我们将文本挖掘技术应用于文本文件并使数据变得结构化,甚至创建文本文件中使用的术语的频率矩阵?例如,文本文件可能如下所示:

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

这就是我所说的“非结构化”的意思,即将所有内容折叠成一个单行字符串。

这种方法是错误的吗?如果您认为我的方法是错误的,请纠正我。

问题3:棘手的部分是:如何识别和提取关键字在 R 中使用tm包?tm 软件包基于什么算法?我应该使用 NLP 算法吗?如果是,我应该看什么算法?请指出一些好的资源来查看。

任何想法都会很棒。

4个回答

看看这个链接。

在这里,他们将引导您加载非结构化文本以创建 wordcloud。你可以调整这个策略,而不是创建一个词云,你可以创建一个使用术语的频率矩阵。这个想法是采用非结构化文本并以某种方式对其进行结构化。您可以通过 Document Term Matrices 将所有内容更改为小写(或大写),删除停用词,并查找每个工作职能的常用术语。您还可以选择词干。如果您使用词干,您将能够将不同形式的词检测为同一个词。例如,'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”。

只需提取关键字并在其上训练分类器就是这样,真的。

简历中的大部分文字实际上与技能无关。例如,考虑句子“我在 Java 方面经验丰富且效率很高”。这里只有 7 个单词中的 1 个是技能名称,其余的只是会降低分类准确性的噪音。

大多数简历都没有真正的结构化。或者结构过于自由。或者对部分使用不寻常的名称。或者翻译成文本时不保留结构的文件格式。我有从非结构化文本中提取日期、时间、姓名、地址甚至人员意图的经验,但不是技能(或大学或任何东西)列表,甚至不是很接近。

因此,只需对您的 CV 进行标记(也可能是词干),仅从预定义列表中选择单词(您可以使用 LinkedIn 或类似的工具来获取此列表),创建一个特征向量并尝试几个分类器(例如,SVM 和朴素贝叶斯) .

(注意:我使用类似的方法将 LinkedIn 个人资料分类为 50 多个类别,准确率 > 90%,所以我很确定即使是幼稚的实现也能很好地工作。)

这是一个棘手的问题。有很多方法可以处理它。我想,简历可以被视为半结构化文件。有时,在文档中有一些最小的结构是有益的。我相信,在简历中你会看到一些表格数据。您可能希望将它们视为属性值对。例如,您将获得属性“技能集”的术语列表。

关键思想是手动配置关键短语列表,例如“技能”、“教育”、“出版物”等。下一步是通过以某种方式利用结构来提取与这些关键短语相关的术语(例如作为表格)或利用这些关键短语周围的术语的相似性,例如,“Java”这个词与“skill”这个词非常接近这一事实可能表明该人精通Java。

提取这些信息后,下一步可能是为每个关键短语建立一个特征向量。然后,您可以将文档表示为具有不同字段的向量(每个字段用于关键短语)。例如,考虑以下两份简历,分别代表两个领域,即项目教育

Doc1: {project: (java, 3) (c, 4)}, {education: (computer, 2), (physics, 1)}

Doc2: {project: (java, 3) (python, 2)}, {education: (maths, 3), (computer, 2)}

在上面的例子中,我用频率显示了一个术语。当然,在提取术语时,您需要阻止和删除停用词。从例子中可以看出,简历为Doc1的人比D2更擅长C。在实现方面,在 Lucene 中将文档表示为字段向量非常容易。

现在,下一步是检索给定工作规范的简历排名列表。事实上,如果您也将查询(工作规范)表示为字段向量,那将是相当直接的。您只需要使用 Lucene 从索引的简历集合中检索候选人(简历)的排名列表。

我在一个在线工作网站工作,我们构建解决方案来根据简历推荐工作。我们的方法是使用一个人的职位(如果是学生并且已知,则为所需的职位),以及我们从他们的简历中提取的技能,以及他们的位置(这对大多数人来说非常重要),并以此为基础找到与职位匹配的职位。

在文档分类方面,我会采取类似的方法。我建议为每个简历计算一个 tf idf 矩阵作为标准的词袋模型,仅提取该人的职位和技能(您需要为此定义要查找的技能列表),并将其输入到 ML算法。我建议尝试 knn 和一个 SVM,后者在高维文本数据上效果很好。线性 SVM 往往比非线性(例如使用 RBf 内核)做得更好。如果您有输出合理的结果,那么我将使用自然语言解析器 \ chunker 以及一些与正则表达式匹配的自定义构建短语来提取特征。