讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛-三等奖方案

本文主要是介绍讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛-三等奖方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本文公开了”讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛“赛道的技术方案,本次比赛主要采用pdf解析特征工程的方法,通过使用lightgbm的树模型10折交叉验证进行二分类的任务,最终取得三等奖的成绩。

一、赛题任务

简历智能化判断,需要大量的数据集作为支撑,同时简历的半结构化数据特点和多变的简历风格给简历智能化判断带来了挑战,本次大赛将提供脱敏的学生中文简历数据集(pdf或docx格式)作为训练样本,参赛选手需要基于提供的样本数据构建模型,预测简历是否符合简历投递基本要求。任务如下:

简历完整性检测。根据要求提取简历要素特征数据,并根据样本数据构建模型,预测简历是否符合简历投递基本要求,预测结果可分为两个类别:即完整(标签1)不完整(标签0)

二、数据和评价指标

数据:脱敏后的学生简历数据集(pdf或docx格式)。训练数据提供脱敏后的数据集,共800余份。测试集不可见,由真实简历数据组成,共100余份。训练集全部为pdf格式。

注:数据集分为正样本负样本,其中正样本为完整性简历数据集,符合简历投递基本要求;负样本为不完整简历数据集,不符合简历投递基本要求。

评价指标:F1 score

三、方案

3.1.方案概述

本次比赛主要采用pdf解析和特征工程的方法,通过使用lightgbm的树模型10折交叉验证进行二分类的任务。

3.2.pdf2text解析

本次比赛主要实验了以下几种解析工具,最终最高分选择了pymupdf

  • pdfplumber
  • PyPDF2
  • pymupdf

3.3.特征工程

主要文本特征如下:

  • 页数

  • pdf2text的文本长度

  • 按行切分后的平均长度

  • 按行切分后的最大长度

  • 按行切分后的长度标准差

  • text字符集合的大小

  • pdf2text的文本长度-text字符集合的大小

  • text字符集合的大小/(pdf2text的文本长度+1)

  • text空格切分后的列表大小

  • text换行符切分后的列表大小

  • -的数量

  • x的数量

  • xxx的数量

  • 数字的数量

  • @的数量

  • .com的数量

  • *的数量

  • :的数量

  • ****的数量

  • 正则匹配电话号码的数量

特征提取对应的code

pattern = r"[\D]+(1\d{10})+(?!\d)"def extract_feature_from_pdf(path):doc = fitz.open(path)all_content = []page_nums = 0for i in doc.pages():page_nums += 1all_content.append(i.get_text())text = ''.join(all_content)text = ''.join(text.split('\n'))feat = [page_nums,len(text),np.mean([len(x) for x in text.split('\n')]),np.max([len(x) for x in text.split('\n')]),np.std([len(x) for x in text.split('\n')]),len(set(text)),len(text) - len(set(text)),len(set(text)) / (len(text) + 1),len(text.split()),len(text.split('\n')),text.count('-'),text.count('x'),text.count('xxx'),sum([text.count(x) for x in '0123456789']),text.count('@'),text.count('.com'),text.count('*'),text.count(':'),text.count('****'),len(re.compile(pattern).findall(text)),1 if '正样本' in path else 0,]return feat

3.4.训练代码

本次比赛主要使用的是lightgbm的树模型,视为二分类任务,进行10折交叉验证的训练。

#!/usr/bin/env python
# _*_coding:utf-8_*_
# Author   :    Junhui Yuimport warningswarnings.simplefilter('ignore')import gcimport pandas as pdpd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', 100)from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import accuracy_score, classification_reportimport lightgbm as lgbimport globimport pandas as pd
from tqdm import tqdm
import numpy as np
import re
import fitzpattern = r"[\D]+(1\d{10})+(?!\d)"def extract_feature_from_pdf(path):doc = fitz.open(path)all_content = []page_nums = 0for i in doc.pages():page_nums += 1all_content.append(i.get_text())text = ''.join(all_content)text = ''.join(text.split('\n'))feat = [page_nums,len(text),np.mean([len(x) for x in text.split('\n')]),np.max([len(x) for x in text.split('\n')]),np.std([len(x) for x in text.split('\n')]),len(set(text)),len(text) - len(set(text)),len(set(text)) / (len(text) + 1),len(text.split()),len(text.split('\n')),text.count('-'),text.count('x'),text.count('xxx'),sum([text.count(x) for x in '0123456789']),text.count('@'),text.count('.com'),text.count('*'),text.count(':'),text.count('****'),len(re.compile(pattern).findall(text)),1 if '正样本' in path else 0,]return feattrain_paths = glob.glob('../xfdata/校招简历信息完整性检测训练集/*/*.pdf')df_train = pd.DataFrame(columns=['page_nums','text_len','text_len_mean','text_len_max','text_len_std','text_set_len','lentext-lenset','lenset_div_lentext','text_split_len','text_split_ent_len','-_nums','x_nums','xxx_nums','dig_sum','@_nums','.com_nums','*_nums',':_nums','****_nums','phone_nums','label'])for t_p in tqdm(train_paths):df_train.loc[len(df_train)] = extract_feature_from_pdf(t_p)not_use_feats = ['label']
use_features = [col for col in df_train.columns if col not in not_use_feats]
print(len(use_features))
train = df_train[df_train['label'].notna()]NUM_CLASSES = 2
FOLDS = 10
TARGET = 'label'def run_lgb(df_train, use_features):target = TARGEToof_pred = np.zeros((len(df_train), NUM_CLASSES))folds = StratifiedKFold(n_splits=FOLDS, shuffle=True, random_state=42)for fold, (tr_ind, val_ind) in enumerate(folds.split(train, train[TARGET])):print(f'Fold {fold + 1}')x_train, x_val = df_train[use_features].iloc[tr_ind], df_train[use_features].iloc[val_ind]y_train, y_val = df_train[target].iloc[tr_ind], df_train[target].iloc[val_ind]train_set = lgb.Dataset(x_train, y_train)val_set = lgb.Dataset(x_val, y_val)params = {'learning_rate': 0.1,'metric': 'multiclass','objective': 'multiclass','num_classes': NUM_CLASSES,'feature_fraction': 0.75,'bagging_fraction': 0.75,'bagging_freq': 2,'n_jobs': -1,'seed': 1029,'max_depth': 10,'num_leaves': 100,'lambda_l1': 0.5,'lambda_l2': 0.8,'verbose': -1}model = lgb.train(params,train_set,num_boost_round=500,early_stopping_rounds=100,valid_sets=[train_set, val_set],verbose_eval=100)oof_pred[val_ind] = model.predict(x_val)print('acc:', accuracy_score(np.argmax(oof_pred, axis=1), df_train['label']))del x_train, x_val, y_train, y_val, train_set, val_setgc.collect()return oof_pred, modeloof_pred, model = run_lgb(train, use_features)
print(classification_report(np.argmax(oof_pred, axis=1), df_train['label']))model.save_model('model.txt')

3.5.推理代码

#!/usr/bin/env python
# _*_coding:utf-8_*_
# Author   :    Junhui Yuimport globimport pandas as pd
import numpy as np
import re
import fitzimport lightgbm as lgbpatter = r"[\D]+(1\d{10})+(?!\d)"def extract_feature_from_pdf(path):doc = fitz.open(path)all_content = []page_nums = 0for i in doc.pages():page_nums += 1all_content.append(i.get_text())text = ''.join(all_content)text = ''.join(text.split('\n'))feat = [page_nums,len(text),np.mean([len(x) for x in text.split('\n')]),np.max([len(x) for x in text.split('\n')]),np.std([len(x) for x in text.split('\n')]),len(set(text)),len(text) - len(set(text)),len(set(text)) / (len(text) + 1),len(text.split()),len(text.split('\n')),text.count('-'),text.count('x'),text.count('xxx'),sum([text.count(x) for x in '0123456789']),text.count('@'),text.count('.com'),text.count('*'),text.count(':'),text.count('****'),len(re.compile(patter).findall(text)),1 if '正样本' in path else 0,]return featdf = pd.DataFrame(columns=['page_nums','text_len','text_len_mean','text_len_max','text_len_std','text_set_len','lentext-lenset','lenset_div_lentext','text_split_len','text_split_ent_len','-_nums','x_nums','xxx_nums','dig_sum','@_nums','.com_nums','*_nums',':_nums','****_nums','phone_nums','label'])test_paths = glob.glob('/work/data/integrity-check-of-resume-test-set/*.pdf')[:]for t_f in test_paths:df.loc[len(df)] = extract_feature_from_pdf(t_f)not_use_feats = ['label']
use_features = [col for col in df.columns if col not in not_use_feats]model = lgb.Booster(model_file='model.txt')y_pred = model.predict(df[use_features])predict_label = np.argmax(y_pred, axis=1)pd.DataFrame({'ResumeID': [x.split('/')[-1] for x in test_paths],'label': predict_label.astype(int)
}).to_csv('/work/output/result.csv', index=None)

3.6.特征重要度与f1-score

                feature  split       gain
16              *_nums     96  23.080862
15           .com_nums     68  15.428008
6       lentext-lenset    126  12.632440
7   lenset_div_lentext    222  10.997545
13             dig_sum    218   7.045122
1             text_len    110   4.449556
17              :_nums    179   4.178767
8       text_split_len    165   4.169549
10              -_nums    137   3.483447
5         text_set_len    184   3.018025
14              @_nums     13   2.870494
11              x_nums     94   2.141016
19          phone_nums     16   1.668496
18           ****_nums     12   1.608449
12            xxx_nums     24   1.249654
2        text_len_mean     31   1.066294
0            page_nums     31   0.803168
3         text_len_max      5   0.109109
9   text_split_ent_len      0   0.000000
4         text_len_std      0   0.000000precision    recall  f1-score   support0       0.75      0.84      0.79       1051       0.98      0.96      0.97       710accuracy                           0.94       815macro avg       0.86      0.90      0.88       815
weighted avg       0.95      0.94      0.94       815

四、延伸

本次比赛任务相对简单,如果真正做到应用级别还需要考虑更多维度综合对简历的完整性进行评价。比如:简历中核心字段的填充率、设计简历中核心字段的重要性权值等等多维度信息。涉及技术可能有基于实体识别的简历解析(从本文特征工程也可以看出)技术等。

结论

本文仅记录8月份参与该比赛思路,至于代码也很普通。该比赛任务由于比较简单,线下指标虚高,训练数据与线上评测数据较少(耐心做特征工程分数可以非常高),并且技术价值不高。因此,前前后后投入差不多一个小时左右时间速刷了一下,最后偶然获奖。

参考文献

【1】校招简历信息完整性检测挑战赛:https://challenge.xfyun.cn/topic/info?type=information-integrity&option=ssgy

这篇关于讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛-三等奖方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/363918

相关文章

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比