经过了一周多对数据集的研究,以及对项目本身的理解,终于在4月15日将数据集的处理基本结束。
首先,说说现阶段我对于项目的理解,经过这两周的上手处理,目前对于项目有了更深一步的理解。
这是目前我对项目理解的简图
数据集图:
简历表
简历描述表 table1_user:
字段 字段说明
user_id 用户标识
live_city 现居住地
desire_city 期望工作城市
desire_industry 期望行业
desire_jd_type 期望职类
desire_jd_salary_id 期望薪水
cur_industry 最近工作行业
cur_jd_type 最近工作职类
cur_salary 最近薪水
degree 学历
age 年龄(虚拟年龄)
start_work_date 开始工作时间
experience 经验
薪资表:
0000000000 面议
0000001000 1000元以下
0100002000 1000-2000元/月
0200104000 2001-4000元/月
0400106000 4001-6000元/月
0600108000 6001-8000元/月
0800110000 8001-10000元/月
100001150000 100000元以上
1000115000 10001-15000元/月
1500120000 15000-20000元
1500125000 15000-25000元/月
2000130000 20000-30000元
2500199999 25000元/月以上
3000150000 30000-50000元
3500150000 35000-50000元/月
5000170000 50000-70000元/月
70001100000 70000-100000元/月
2500135000 25000-35000元/月
期望薪资是10位或者12位(遇到9位或者11位前面或者后面补0,超过上面列表部分为脏数据)
岗位表
岗位描述表 table2_jd:
字段 字段说明
jd_no 职位代码
jd_title 职位标题
company_name 公司
city 城市
jd_sub_type 职位子类
require_nums 需求人数
max_salary 最高月薪
min_salary 最低月薪
start_date 开始日期
end_date 结束日期
is_travel 是否要求出差
min_years 工作年限(103:一年到三年,305:三年到五年,510:五年到十年,1099:十年以上)
key 关键字
min_edu_level 最低学历
max_edu_level 最高学历
is_mangerial 是否要求管理经验
resume_language_required 语言需求
job_description 职位描述
这是岗位与简历的关系图
行为表 table3_action:
字段 字段说明
user_id 用户标识
jd_no 职位代码
browsed 是否浏览
delivered 是否投递
satisfied HR是否认可
行为表表示的是当为简历投放相应岗位后的行为,其中satisfied为1表示HR认可,delivered为1表示已经投递,browsed为1表示预览。
评估数据表为 user_ToBePredicted和user_exposure,其中user_ToBePredicted是需要预测的简历的详细信息(具体meta参见训练数据table1_user),user_exposure是user_ToBePredicted中每个简历被曝光的岗位。其中,user_exposure表:
字段 字段说明
user_id 用户标识
jd_no user_id对应被曝光的简历
提交的格式参考submit文件,包含user_id和jd_no两个字段,文件格式为以逗号分隔的CSV。提交的submit文件有两个要求:
1.user_id字段和user_exposure表中的user_id字段一致,不可以增加或者删除,否则没有分数
2.每个user_id对应的jd_no需要和user_exposure中的jd_no内容完全一致,只是顺序调整,否则没有分数。所以选手模型实现的效果是,把每个简历的被曝光岗位中MAP(参照评估标准)分高的排在当前简历对应的jd_no的前序位置。
目前完成的部分:
1、数据集结构很乱,很多内容是我们不要的,所以首先要对关键信息进行提取,归纳之后创建一个新的表,方便之后的数据处理
这部分将action(行为表)与jd(岗位表)、user(简历表)进行联表
排除掉冗余的信息后,方便根据机器学习需要的向量值输入进行数据处理。
2、机器学习向量输入初步设计
我们初步打算,将工资,学历,简历经历与岗位需求的匹配度(tfidf值),城市作为输入,是否拿到offer作为输出。
3、使用tfidf算法计算岗位要求与简历经历项的匹配度
分词后计算岗位中各个词的idf
分词后计算简历中各词的idf
两张表进行内连接后输出新表
对于每个词,在输入分词计算出词频后,从数据库中搜索,取出idf从而计算tfidf。由于目前考虑的是匹配度,所以只计算简历与岗位中相同词的tfidf值。
每个词都有它在简历经历栏位的tfidf值与岗位要求栏位的tfidf值。
4、对于每一个结构化特征向量的提取
首先是提取结束的表
tf_multi_idf与tf_plus_idf为词权重tfidf值的两种处理模式,
其中tf_multi_idf为将每个词在简历经历栏位的tfidf值与岗位要求栏位的tfidf值相乘,其余内容相加(同词乘,其余加),
tf_plus_idf为将每个词在简历经历栏位的tfidf值与岗位要求栏位的tfidf值相加,其余内容再相加(全加),
进过后续计算分析可能会改变使用方式。
degree字段是将学历转换为7个等级
public static int score(String s) {
if (s == “中专”) {
return 1;
} else if (s == “高中”) {
return 2;
} else if (s == “大专”) {
return 3;
} else if (s == “本科”) {
return 4;
} else if (s == “硕士”) {
return 5;
} else if (s == “博士”) {
return 6;
} else {
return 0;
}
}
degree字段是将简历中提到的学历与岗位要求的学历做减法
salary同样是将不同薪资转换为不同的等级
public static int salary(String s) {
if (s.equals(“0000000000”)) {
return 1;
} else if (s.equals(“0000001000”)) {
return 1;
} else if (s.equals(“0100002000”)) {
return 1;
} else if (s.equals(“0200104000”)) {
return 2;
} else if (s.equals(“0400106000”)) {
return 3;
} else if (s.equals(“0600108000”)) {
return 4;
} else if (s.equals(“0800110000”)) {
return 5;
} else if (s.equals(“1000115000”)) {
return 6;
} else if (s.equals(“1500125000”)) {
return 7;
} else {
return 8;
}
}
public static int salary(int n) {
if (n<4000) {
return 1;
}else if (n<8000) {
return 2;
} else if (n<12000) {
return 3;
} else if (n<16000) {
return 4;
} else if (n<20000) {
return 5;
} else if (n<30000) {
return 6;
} else if (n<50000) {
return 7;
} else{
return 8;
}
}
由于在jd表中薪资是给出的具体的数字,而简历却是薪资期望范围,所以处理方式不同,但划分的等级是等价的,同样也是将简历等级与岗位等级的差作为值。
city字段是公司岗位所在的城市是否与简历中求职者希望工作的城市匹配
匹配为1,否则为0
satisfied字段为输出,hr是否对这个简历满意
1为满意,否则为0