返回首页

简历 NER:HR 系统实施指南 | IT Practice

本文描述了为简历处理实施命名实体识别的技术方面。它涵盖了数据准备阶段、模型架构选择和生产部署,考虑了俄语文本的特性。提供了代码示例和优化推荐。

如何在 HR 系统实施 NER:开发者技术指南
Advertisement 728x90

# 简历处理NER的实际实现:从数据标注到生产服务

命名实体识别(NER)是现代自然语言处理(NLP)系统中的关键组件,尤其是在人力资源自动化领域。本文将详细剖析实现NER解决方案的技术细节,用于从简历中提取结构化数据,重点关注俄语文本以及生产部署的具体要求。

定义任务边界

在开始开发之前,明确规范需求至关重要。对于人力资源系统,关键实体包括:

  • 个人信息(全名、邮箱、电话)
  • 专业技能(技术、工具)
  • 财务参数(期望薪资及货币)

需要注意的是,简历中的技能往往无分隔符列出(例如,"Python SQL Docker")。因此,需要采用BIO标注方案而非简单的IO方案,以便模型正确分离相邻实体。对于俄语,处理词形变化和缩写("JS"而非"JavaScript")至关重要。

Google AdInline article slot

为每个实体定义精确规则:

  • SKILL:仅专业术语(排除软技能)
  • SALARY:金额 + 货币("150 thousand. rubles."、"$2500")
  • PHONE:所有带国家码的数字格式

数据准备:策略与工具

搜索现成数据集

第一步——检查现有资源:

  • Hugging Face Datasets

Task=Token ClassificationLanguage=Russian过滤。本文撰写时,未发现针对简历的专用数据集。英文类似数据集(例如,Resume Entities Dataset)需通过翻译和微调进行适配。

Google AdInline article slot
  • Kaggle and Zenodo

按关键词"resume NER"、"CV entities"搜索。发现的数据集通常包含:

* 不完整标注(仅技能)

* 缺少俄语示例

Google AdInline article slot

* 不同的标注方案(BIOES vs BIO)

  • 合成生成

数据稀缺时,使用如nlpaug等库进行:

* 用类似数据替换真实数据("Ivanov" → "Petrov")

* 在联系信息中引入拼写错误

* 生成技能名称变体("PyTorch" → "pytorch")

Label Studio 中的手动标注

现成数据不足时,创建自定义数据集。主要步骤:

  • 准备 PDF 文档

使用pdfplumber提取文本,同时保留结构:

```python

with pdfplumber.open('resume.pdf') as pdf:

text = '\n\n'.join([page.extract_text() for page in pdf.pages])

```

  • 转换为 Label Studio 的 JSON 格式

将 PDF 转换为平台格式的脚本:

```python

import json

import os

def convert_to_ls_format(pdf_dir):

tasks = [{"text": open(f, 'r').read()}

for f in os.listdir(pdf_dir) if f.endswith('.txt')]

with open('import.json', 'w') as f:

json.dump(tasks, f, ensure_ascii=False, indent=2)

```

  • 设置标注界面

在 Label Studio 中,创建带有标签的模板:

```xml

<View>

<Text name="text" value="$text"/>

<Labels name="ner" toName="text">

<Label value="SKILL" background="#ffcc00"/>

<Label value="SALARY" background="#66ccff"/>

</Labels>

</View>

```

一致的标注至关重要:为模糊情况制定规则(例如,"C++"——一个技能还是两个)。为提升质量,引入两名标注员并计算Cohen's Kappa指标。

模型选择与训练

基础架构

对于俄语文本,我们推荐以下方法:

  • 微调预训练模型

* RuBERT (DeepPavlov) —— 最适合俄语

* mBERT —— 如需多语言支持

* 关键参数:max_seq_length=512(简历常有长描述)

  • 自定义分词

向词汇表添加特定术语:

```python

tokenizer.add_tokens(["CI/CD", "ETL", "MLflow"])

model.resize_token_embeddings(len(tokenizer))

```

  • 处理类别不平衡

使用加权损失函数:

```python

class_weights = compute_class_weight('balanced',

classes=np.unique(labels),

y=labels)

criterion = nn.CrossEntropyLoss(weight=torch.tensor(class_weights))

```

评估指标

NER的标准准确率不适用。跟踪以下指标:

  • Token-level F1 —— 主要指标
  • Entity-level precision/recall —— 通过seqeval
  • 处理速度 —— CPU上的每秒token数

特别注意SALARY实体的召回率——此处下降将导致丢失关键数据。

生产部署

服务架构

推荐集成方案:

  • 预处理

* 将PDF/DOCX转换为文本(通过antiwordpdf2text

* 归一化文本(移除多余空格,编码货币)

  • NER核心

```python

class NERServer:

def __init__(self):

self.model = AutoModelForTokenClassification.from_pretrained('ner_model')

def extract_entities(self, text):

inputs = tokenizer(text, return_tensors='pt', truncation=True)

outputs = self.model(**inputs)

# Process logits into entities

```

  • 后处理

* 按BIO标签将token分组为实体

* 验证格式(邮箱/电话的正则)

* 通过映射归一化技能("JS" → "JavaScript")

性能优化

  • Caching —— 用于重复请求
  • Batch Processing —— 将多个简历合并为批次
  • Quantization —— 通过torch.quantization将模型转换为FP16

对于高负载系统,通过RabbitMQ实现任务队列,以避免处理大文件时的超时。

关键要点

  • Domain Adaptation至关重要:新闻训练的模型在简历上会失效
  • Annotation Quality决定最终结果的80%——投资标注员
  • BIO Scheme对于无分隔符技能列表是必不可少的
  • Edge Cases验证——测试非标准格式处理("100k $"、"~2000 evro")
  • Data Drift Monitoring——定期在新简历上重新计算指标

— Editorial Team

Advertisement 728x90

继续阅读