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

Coggle数据科学 | 科大讯飞AI大赛:人岗匹配挑战赛 赛季3

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。

原文链接:科大讯飞AI大赛:人岗匹配挑战赛 赛季3

  • 赛题名称:人岗匹配挑战赛 赛季3

  • 赛题类型:自然语言处理、文本匹配

  • 赛题任务:基于提供的样本构建模型,预测简历与岗位匹配与否。

报名链接:https://challenge.xfyun.cn/topic/info?type=match-challenge-s3&ch=dw24_AtTCK9

赛事背景

讯飞智聘是一款面向企业招聘全流程的智能化解决方案。运用科大讯飞先进的智能语音、自然语言理解、计算机视觉等AI技术及大数据能力,具备业界领先的简历解析、人岗匹配、AI面试、AI外呼等产品功能,助力企业提升招聘效率,降低招聘成本。

人岗匹配是企业招聘面临一个重大挑战,尤其在校园招聘等集中招聘的场景下,面对海量的简历,如何快速分类筛选出最适合招聘岗位的简历,以及在内推和猎头场景下,如何为一份简历找到合适的岗位,做到人适其岗、岗适其人,提升人岗匹配的效率和准确度,是困扰每一个HR和面试官的难题。

赛事任务

智能人岗匹配需要强大的数据作为支撑,本次大赛提供了大量的岗位JD和求职者简历的加密脱敏数据作为训练样本,参赛选手需基于提供的样本构建模型,预测简历与岗位匹配与否。

数据说明

本次比赛为参赛选手提供训练集与测试集,数据包含数据结构为:

岗位JD数据包含4个特征字段:positionName, positionDescription, positionRequirements, positionID,对应含义分别为:岗位名称、岗位介绍、岗位要求、岗位ID。

求职者简历数据包含如下字段:

出于数据安全保证的考虑,所有数据均为脱敏处理后的数据。

评估指标

本模型依据提交的结果文件,采用macro-F1 score进行评价。

赛题 Baseline

  • 读取比赛数据

import pandas as pd
import numpy as np
import json
import re
from tqdm import tqdm

train = json.load(open('dataset/train.json'))
test = json.load(open('dataset/test.json'))
job_list = json.load(open('dataset/job_list.json'))
  • 人工特征工程

    • 简历部分单词与岗位名称、描述和要求中单词的交集的大小。

    • 简历部分单词与岗位名称、描述和要求中单词交集的大小,除以岗位名称、描述和要求中单词的数量,得到匹配比例。

    • 简历部分单词与岗位名称、描述和要求中单词交集的大小,除以简历部分单词的数量加一,得到匹配比例的另一种计算方式。

    • 对于简历中的每个关键部分(如教育经历、社会经验等),使用正则表达式模式\b\w+\b提取单词,并存储在cv_sample_word字典中。

    • 遍历岗位列表(job_list),对于每个岗位样本,使用相同的正则表达式模式提取岗位名称、岗位描述和岗位要求中的单词。

    • 对于简历中的每个关键部分,计算以下特征:

# 正则表达式模式,匹配单词,其中单词由空格、标点符号或字符串的开始和结束进行分割
pattern = re.compile(r'\b\w+\b')

train_feat = []
for train_sample in tqdm(train):
    cv_sample_word = {}
    for key in ['profileEduExps', 'profileSocialExps', 'profileLanguage', 'profileProjectExps', 'profileSkills', 'profileAwards', 'profileWorkExps', 'profileDesire']:
        cv_sample_word[key] = pattern.findall(str(train_sample['resumeData'][key]))
                           
    for job_sample in job_list:
        positionName_word = re.findall(pattern, job_sample['positionName'])
        positionDescription_word = pattern.findall(job_sample['positionDescription'])
        positionRequirements_word = pattern.findall(job_sample['positionRequirements'])

        feat = [
            len(train_sample['resumeData']['profileEduExps']),
        ]

        for key in ['profileEduExps', 'profileSocialExps', 'profileLanguage', 'profileProjectExps', 'profileSkills', 'profileAwards', 'profileWorkExps', 'profileDesire']:
            feat.append(len(set(cv_sample_word[key]) & set(positionName_word)))
            feat.append(len(set(cv_sample_word[key]) & set(positionDescription_word)))
            feat.append(len(set(cv_sample_word[key]) & set(positionRequirements_word)))

            feat.append(len(set(cv_sample_word[key]) & set(positionName_word)) / len(set(positionName_word)))
            feat.append(len(set(cv_sample_word[key]) & set(positionDescription_word)) / len(set(positionDescription_word)))
            feat.append(len(set(cv_sample_word[key]) & set(positionRequirements_word)) / len(set(positionRequirements_word)))

            feat.append(len(set(cv_sample_word[key]) & set(positionName_word)) / (len(set(cv_sample_word[key])) + 1))
            feat.append(len(set(cv_sample_word[key]) & set(positionDescription_word)) / (len(set(cv_sample_word[key])) + 1))
            feat.append(len(set(cv_sample_word[key]) & set(positionRequirements_word)) / (len(set(cv_sample_word[key])) + 1))


        if train_sample['positionID'] == job_sample['positionID']:
            feat.append(1)
        else:
            feat.append(0)


        train_feat.append(feat)
  • 模型训练

from lightgbm import LGBMClassifier

model = LGBMClassifier()
model.fit(train_feat[:-20000, :-1], train_feat[:-20000, -1])

model.score(train_feat[-20000:, :-1], train_feat[-20000:, -1])

完整代码见:

https://github.com/datawhalechina/competition-baseline/tree/master/competition/%E7%A7%91%E5%A4%A7%E8%AE%AF%E9%A3%9EAI%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E8%B5%9B2024

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。


http://www.kler.cn/a/304328.html

相关文章:

  • mysql 更改 字段长度
  • 常见error集合
  • 通用项目工程的过程视图概览
  • git初始化和更新项目中的子模块
  • Flink API 的层次结构
  • mysql 快速解决死锁方式
  • 怎么将几个pdf合成为一个?把几个PDF合并成为一个的8种方法
  • opencv图像透视处理
  • 机器学习(西瓜书)第 6 章 支持向量机
  • Jupyter notebook配置与使用(安装过程+环境配置+运行实例)
  • redis基本数据结构-string
  • 关于OceanBase 多模一体化的浅析
  • 探索螺钉设计:部分螺纹与全螺纹,哪种更适合你的项目?
  • 学习笔记 韩顺平 零基础30天学会Java(2024.9.14)
  • HashMap在并发场景下的问题
  • hku-mars雷达相机时间同步方案-硬件(MID360与海康MV-CB060-10UMUC-S)
  • Spring-cloud-gateway报错问题总结
  • 卷轴模式系统中的任务起源探索与趣味性设计策略分析
  • 【大模型专栏—进阶篇】语言模型创新大总结——“后起之秀”
  • rocketmq-client5.2手动给生产者和消费者设置access-key和secret-key值
  • Sparse4D v1
  • 从零开始学PostgreSQL (十四):高级功能
  • 【来学Vue吧】创建一个Vue项目
  • 通过adb命令打开手机usb调试
  • 青铜级与大师级删库跑路:黑色幽默的背后
  • 几何概率模型