在这一篇案例中,我们将深入探讨如何利用Python中的自然语言处理技术,从简历文本中提取关键信息。这些信息可以包括求职者的技能、工作类别以及其他相关信息。本案例的应用场景并不仅限于简历,类似的方法还可以用于处理其他类型的文档,例如法律文书、财务报告、医疗文件等。
我们将使用两个数据集:第一个是包含简历文本的简历数据集,第二个是技能模式数据集,用于创建技能提取的规则。在本文中,我们将一步步展示如何加载、清理、处理数据,并通过可视化的方式展示最终的分析结果。
1. 加载数据
1.1 简历数据集
简历数据集来自于Kaggle,包含了2400多份简历文本。这些简历是从真实的求职网站上抓取的,数据集的主要字段包括:
ID
: 每份简历的唯一标识符,通常也是文件名。Resume_str
: 简历的纯文本格式。Resume_html
: 简历的HTML格式(在网络抓取时获取的原始HTML数据)。Category
: 简历所申请职位的类别(如HR、设计师等)。
我们将简历数据集缩减到200条记录进行处理,以便提高处理速度。
import pandas as pd
import numpy as np
df_resume = pd.read_csv("../data/resume.csv")
# 随机化工作类别,确保200个样本中包含不同类别的简历
df_resume = df_resume.reindex(np.random.permutation(df_resume.index))
# 将数据集限制为200个样本
df_resume = df_resume.copy().iloc[0:200,]
df_resume.head()
1.2 技能模式数据集
技能模式数据集是一个JSONL格式的文件,包含了不同的技能名称及其变体形式。例如,某个技能可能有多个不同的写法或表达方式,这些写法都需要被识别为同一个技能。该技能数据集可以帮助我们创建一个基于SpaCy的EntityRuler
,用来识别简历文本中的技能。
import spacy
nlp = spacy.load("en_core_web_md")
skill_pattern_path = "../data/skills.jsonl"
# 加载技能模式到SpaCy的EntityRuler中
ruler = nlp.add_pipe("entity_ruler")
ruler.from_disk(skill_pattern_path)
nlp.pipe_names # 确认EntityRuler已加载
EntityRuler
是SpaCy中的一个组件,它允许我们通过预定义的规则来识别文本中的实体。通过加载技能模式文件,我们可以定义如何识别简历文本中的技能。
2. 数据清理
在处理文本数据时,清理步骤是非常重要的。我们需要对简历文本进行标准化,以便后续的自然语言处理步骤能够顺利进行。具体的清理步骤包括:
- 移除超链接、特殊字符和标点符号:简历文本可能包含超链接或一些无关的符号,这些都会对模型训练产生干扰。
- 转换为小写:将文本中的所有字母转换为小写,以避免同一个词因大小写不同而被视为不同的词。
- 词形还原:将单词转换为其词根形式。例如,动词"running"会被还原为"run"。
- 移除停用词:停用词(如“的”、“是”等)在信息提取过程中往往没有实际意义,因此需要移除。
import re
def remove_hyperlinks(sentence):
sentence = re.sub(
'(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)|^rt|http.+?"',
" ",
sentence
)
return sentence
def preprocessing(sentence):
sentence = remove_hyperlinks(sentence)
doc = nlp(sentence)
cleaned_tokens = []
for token in doc:
if token.is_stop == False and token.pos_ not in ['SYM', 'PUNCT', 'SPACE']:
cleaned_tokens.append(token.lemma_.lower().strip())
return " ".join(cleaned_tokens)
我们可以将这个函数应用到简历数据集中的所有简历文本,以生成清理后的简历数据。
for i, row in df_resume.iterrows():
clean_txt = preprocessing(row['Resume_str'])
df_resume.at[i, 'Clean_resume'] = clean_txt
df_resume.head()
3. 信息提取
接下来,我们将从清理后的简历文本中提取技能信息。我们将使用两个函数:
get_skills
: 该函数会遍历简历文本中的所有实体,并识别出技能实体。unique_skills
: 该函数会去除重复的技能,确保每个简历的技能列表中没有重复项。
def get_skills(text):
doc = nlp(text)
subset = []
for ent in doc.ents:
if ent.label_ == "SKILL":
subset.append(ent.text)
return subset
def unique_skills(x):
return list(set(x))
df_resume["skills"] = df_resume.Clean_resume.apply(get_skills)
df_resume["skills"] = df_resume.skills.apply(unique_skills)
df_resume.head()
通过上述步骤,我们成功从简历中提取了技能信息。
4. 数据可视化
4.1 工作类别分布
我们可以通过绘制直方图来可视化简历数据集中不同工作类别的分布情况。
import plotly.express as px
fig = px.histogram(
df_resume, x="Category", title="Distribution of Jobs Categories"
).update_xaxes(categoryorder="total descending")
fig.show()
4.2 技能分布(信息技术领域)
我们还可以深入分析某一类别的技能分布情况。以下代码展示了在INFORMATION-TECHNOLOGY
类别中的常见技能分布。
category = 'INFORMATION-TECHNOLOGY'
cond = df_resume.Category == category
df_it = df_resume[cond]
df_it.shape # 10 samples
all_skill_list = np.concatenate(df_it.skills.values)
from collections import Counter, OrderedDict
counting = Counter(all_skill_list)
counting = OrderedDict(counting.most_common(10))
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 3), dpi=80)
plt.xticks(rotation=45)
plt.bar(counting.keys(), counting.values())
4.3 实体识别可视化
通过SpaCy的displacy
,我们可以直观地展示从简历中识别出的技能。
from spacy import displacy
doc = nlp(df_resume.Clean_resume.iloc[0])
colors = {"SKILL": "linear-gradient(90deg, #aa9cfc, #fc9ce7)"}
options = {"colors": colors}
displacy.render(doc, style="ent", jupyter=True, options=options)
5. 加载PDF文件并提取信息
我们还可以通过PyPDF2
库从PDF文件中提取简历文本,并应用相同的技能提取方法。
from PyPDF2 import PdfReader
reader = PdfReader("../data/someone_cv.pdf")
page = reader.pages[0]
text = page.extract_text()
text = preprocessing(text)
doc = nlp(text)
displacy.render(doc, style="ent", jupyter=True, options=options)
结语
在本案例中,我们通过深入探索基于Python和SpaCy的自然语言处理技术,成功展示了如何从简历中提取关键信息,特别是技能的提取。这一过程不仅帮助我们提高了对简历文本结构的理解,也为如何自动化处理大规模文本数据提供了有效的方案。通过对数据集的预处理、实体识别模型的构建、技能模式的匹配、以及技能分布的可视化,我们能够高效地将杂乱的文本转化为具有分析价值的结构化数据。
此外,这个案例展示了如何在数据科学和机器学习的背景下,合理利用现有的自然语言处理工具来实现复杂文本的解析与信息抽取。这一方法不仅限于简历信息的提取,还可以扩展到更多领域,例如:
- 法律文书:从法律文本中提取关键信息如条款、法规、日期等;
- 医疗记录:从医生的病历记录中提取出患者的病史、药物使用情况等;
- 金融文档:分析股票报告、公司财务报表等,自动识别关键财务指标和趋势。
在处理大量文本数据时,数据清理和预处理是不可忽视的步骤,它确保了我们能够有效识别和提取关键信息。同时,利用类似SpaCy的预训练语言模型和自定义实体识别器,能够快速适应不同类型的文档处理任务。
最后,结合可视化分析,我们不仅可以深入了解数据,还能够识别其中的模式和趋势。这对于简历信息提取特别有用,因为可以帮助公司或招聘系统自动评估候选人的技能匹配度,为人力资源决策提供智能化支持。
通过这个案例的探索,我们看到了文本处理和自然语言处理在自动化简历筛选中的巨大潜力,并为其他领域的类似任务提供了强大的技术基础和实现思路。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!