如何在R语言中从招聘广告文本提取所需工作经验年限?
解决R中提取招聘广告工作经验年限的问题
问题分析
你遇到的全NA结果,大概率是因为原有正则表达式匹配范围太窄,没覆盖到招聘描述中“工作经验”的多种表述(比如3年以上、5+年、1-3年、至少4年等)。
解决方案
以下是基于stringr和dplyr的通用提取方案,能覆盖多数常见经验表述,并生成数值型的yrs_experience列:
1. 示例数据构造
先模拟你的招聘数据结构:
# 示例招聘数据框 job_df <- data.frame( job_description = c( "要求3年以上Java开发经验,熟悉Spring框架", "需要5+年大数据相关工作经验,会Hadoop优先", "应届生亦可,或有1-2年前端开发经验", "至少4年项目管理经验,PMP证书优先", "无经验要求,欢迎应届毕业生" ), stringsAsFactors = FALSE )
2. 提取并处理经验年限
library(stringr) library(dplyr) job_df <- job_df %>% mutate( # 匹配包含数字、-/+符号的经验片段 experience_raw = str_extract(job_description, "\\d+\\s*[-+]?\\s*\\d*"), # 提取片段中的所有数字 experience_nums = str_extract_all(experience_raw, "\\d+"), # 转换为数值:范围取平均值,单个数字直接转,无匹配则为NA yrs_experience = case_when( lengths(experience_nums) == 2 ~ (as.numeric(experience_nums[[1]][1]) + as.numeric(experience_nums[[1]][2]))/2, lengths(experience_nums) == 1 ~ as.numeric(experience_nums[[1]][1]), TRUE ~ NA_real_ ) )
3. 自定义调整
如果不需要范围平均值,可按需修改:
- 取范围最小值:
lengths(experience_nums) == 2 ~ as.numeric(experience_nums[[1]][1]) - 取范围最大值:
lengths(experience_nums) == 2 ~ as.numeric(experience_nums[[1]][2])
4. 输出结果
运行后得到的job_df会包含正确的数值型经验列:
job_description experience_raw experience_nums yrs_experience 1 要求3年以上Java开发经验,熟悉Spring框架 3 3 3.0 2 需要5+年大数据相关工作经验,会Hadoop优先 5+ 5 5.0 3 应届生亦可,或有1-2年前端开发经验 1-2 1, 2 1.5 4 至少4年项目管理经验,PMP证书优先 4 4 4.0 5 无经验要求,欢迎应届毕业生 <NA> <NA> NA
关键说明
- 正则表达式
\\d+\\s*[-+]?\\s*\\d*能匹配3、5+、1-2等多种数字组合; str_extract_all用于提取片段中的所有数字,处理范围类经验表述;case_when实现多场景的数值转换逻辑,保证结果为数值型。
内容的提问来源于stack exchange,提问作者nesta1990
相关产品推荐
相关产品推荐

