R语言从多语种招聘描述提取薪资失败的技术求助
解决招聘描述中薪资数值提取问题
问题分析
原函数失效大概率是因为正则表达式没覆盖这些常见场景:
- 英文"salary"的大小写变体(Salary/SALARY/salary)
- 阿拉伯语"الراتب"前后的空格、符号分隔
- 薪资的多种格式:带千分位逗号、货币符号、范围(如
1,000-2,000)、阿拉伯语数字(如١٠٠٠) - 关键词与薪资间的任意分隔符(冒号、空格、换行等)
解决方案
1. 编写多场景兼容的正则规则
针对中英文关键词+多格式薪资,组合正则逻辑:
- 英文关键词:
(?i)salary[:\s]*(忽略大小写,匹配salary后接冒号/任意空格) - 阿拉伯语关键词:
الراتب[:\s]*(匹配الراتب后接冒号/任意空格) - 薪资数值:覆盖阿拉伯数字、阿拉伯语数字、千分位逗号、范围符号
-
2. 完整代码实现
假设你的数据集是Pandas DataFrame,以下是可直接复用的代码:
import pandas as pd import re # 阿拉伯语数字转阿拉伯数字的映射表 arabic_num_map = {'٠':'0', '١':'1', '٢':'2', '٣':'3', '٤':'4', '٥':'5', '٦':'6', '٧':'7', '٨':'8', '٩':'9'} def convert_arabic_nums(text): if not isinstance(text, str): return text return ''.join([arabic_num_map.get(c, c) for c in text]) def extract_salary(description): if pd.isna(description): return None # 匹配英文/阿拉伯语关键词后的薪资内容 pattern = r'(?i)(salary|الراتب)[:\s]*([\d٠-٩,.]+(?:\s*-\s*[\d٠-٩,.]+)?)' match = re.search(pattern, description) if match: salary_str = match.group(2) # 转换阿拉伯语数字为标准数字 salary_str = convert_arabic_nums(salary_str) # 清理千分位逗号 salary_str = salary_str.replace(',', '') # 处理薪资范围:可选取平均值或保留原始范围 if '-' in salary_str: low, high = salary_str.split('-') try: return (float(low.strip()) + float(high.strip())) / 2 except ValueError: return salary_str.strip() else: try: return float(salary_str.strip()) except ValueError: return salary_str.strip() return None # 应用到数据集生成salary列 df['salary'] = df['description'].apply(extract_salary)
3. 关键优化点
(?i)标记忽略英文关键词的大小写,兼容Salary/SALARY等变体- 内置阿拉伯语数字转换逻辑,解决多语言数字识别问题
- 支持薪资范围处理:可选择取平均值或保留原始范围字符串
- 兼容千分位逗号、任意空格分隔的场景
- 增加异常处理,避免格式不规范导致的报错
测试示例
若description列包含以下内容:
Salary: 1,500-2,000 USD
الراتب ٣٥٠٠ درهم
SALARY 4000
运行代码后,salary列会得到:1750.0、3500.0、4000.0
内容的提问来源于stack exchange,提问作者nesta1990
相关产品推荐
相关产品推荐

