当前位置: 首页 > article >正文

基于Python的人工智能应用案例系列(18):SpaCy简历信息抽取

        在这一篇案例中,我们将深入探讨如何利用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的预训练语言模型和自定义实体识别器,能够快速适应不同类型的文档处理任务。

        最后,结合可视化分析,我们不仅可以深入了解数据,还能够识别其中的模式和趋势。这对于简历信息提取特别有用,因为可以帮助公司或招聘系统自动评估候选人的技能匹配度,为人力资源决策提供智能化支持。

        通过这个案例的探索,我们看到了文本处理和自然语言处理在自动化简历筛选中的巨大潜力,并为其他领域的类似任务提供了强大的技术基础和实现思路。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!


http://www.kler.cn/news/330149.html

相关文章:

  • 旅游避坑指南
  • 基础岛第6关:OpenCompass 评测 InternLM-1.8B 实践
  • 深入了解 Ne10:优化 ARM 处理器的数字信号处理库
  • [C++][第三方库][gflags]详细讲解
  • Vue项目开发注意事项
  • Ubuntu22.04之测试本机网口速度(二百七十二)
  • PySpark把一列数据上下移动,时序数据
  • 【趣学Python算法100例】三色球
  • 认知杂谈94《菜鸟的自我修炼:创业的那些事》
  • 两数相加leetcode
  • 样式重置 normalize.css
  • 【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?
  • 死锁的成因与解决方案
  • 景联文科技入选《2024中国AI大模型产业图谱2.0版》数据集代表厂商
  • Vue3.0面试题汇总
  • 如何实现一个Mini Spring Boot
  • Leecode热题100-283.移动零
  • AI学习指南深度学习篇-权重正则化的实现机制
  • 技术成神之路:设计模式(十八)适配器模式
  • 深度学习中的优化方法(Momentum,AdaGrad,RMSProp,Adam)详解及调用
  • 后台管理系统脚手架
  • ICM20948 DMP代码详解(58)
  • 深入探索 Pygwalker:Python 数据可视化的强大工具
  • STM32-MPU6050+DAM库源码(江协笔记)
  • Ps:打开与置入
  • C++——函数功能是:将两个两位数的正整数a、b合并成一个整数c,合并规则是将a的十位和个位分别放在c的千位和个位,将b的十位和个位分别放在c的十位和百位。
  • 小论树形dp
  • 游戏如何对抗改包
  • 【JavaScript】JIT
  • 【gradio】gradio构建webui demo时只支持一个访问?