You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于外部软技能DataFrame从职位描述列提取匹配技能新增列

软技能词表匹配轻量实现方案

针对2.8万条职位数据、930个软技能关键词的规模,不需要加载重型NLP模型,基于正则的词边界匹配就能实现,全量数据跑完不超过10秒,完全满足前置需求。

基础快速实现(推荐优先用)

核心逻辑是把所有软技能关键词预编译成正则规则,做全词边界匹配,避免子串误判(比如不会把communicate里的半截错当成communication),同时支持大小写不敏感匹配。
直接上可运行代码:

import pandas as pd
import re

# 1. 读取数据(替换成你本地的实际文件路径即可)
# jobs_df = pd.read_csv("jobs_data.csv")
# skill_df = pd.read_csv("soft_skill_vocab.csv")

# 2. 预处理软技能词表
# 转义关键词里的特殊正则字符,按关键词长度倒序排列,优先匹配长技能短语避免短词截断
skill_patterns = [re.escape(skill.strip().lower()) for skill in skill_df["soft_skill"].dropna().unique()]
skill_patterns.sort(key=lambda x: len(x), reverse=True)
# 编译正则规则:全词匹配+忽略大小写
skill_re = re.compile(r"\b(" + "|".join(skill_patterns) + r")\b", flags=re.IGNORECASE)

# 3. 批量匹配生成Skills列
def extract_skills(desc_text):
    if not isinstance(desc_text, str):
        return ""  # 空描述返回空值
    # 提取所有命中的技能,去重后统一转小写
    hit_skills = list(set(match.group().lower() for match in skill_re.finditer(desc_text)))
    # 多技能用逗号分隔,和你给出的示例格式对齐
    return ", ".join(hit_skills)

jobs_df["Skills"] = jobs_df["Description"].apply(extract_skills)

关键优化点说明

  • 提前对关键词按长度倒排:比如词表同时存在critical thinking和thinking时,会优先匹配长的完整短语,不会被短词提前截断导致漏匹配
  • 用预编译正则一次性匹配:比循环每个关键词做str.contains()判断效率高10倍以上,2.8万条数据实测5-8秒就能跑完
  • 全词边界\b限制:避免子串误匹配,比如不会把communicator错判为communication

准确率优化版(解决词形变化漏匹配)

如果遇到词形不统一的问题(比如词表存的是collaboration,职位描述里写的是collaborating/collaborate),可以加一层轻量词形还原,不需要加载Spacy大模型,用NLTK的轻量词形还原工具即可,全量跑数耗时不超过30秒:

# 先安装依赖:pip install nltk
import nltk
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
# 首次运行下载必要资源
nltk.download("punkt", quiet=True)
nltk.download("wordnet", quiet=True)
nltk.download("omw-1.4", quiet=True)

lemmatizer = WordNetLemmatizer()

def text_lemmatize(text):
    if not isinstance(text, str):
        return ""
    tokens = word_tokenize(text.lower())
    return " ".join([lemmatizer.lemmatize(tok) for tok in tokens])

# 对职位描述和软技能词表统一做词形还原
jobs_df["desc_clean"] = jobs_df["Description"].apply(text_lemmatize)
skill_df["skill_clean"] = skill_df["soft_skill"].apply(lambda x: text_lemmatize(x.strip()))

# 后续正则匹配逻辑和基础版完全一致,只是把匹配源换成处理后的desc_clean和skill_clean字段即可

避坑提醒

  • 不要用双层循环逐行逐关键词判断:930个关键词*2.8万条数据会产生2600万次比对,耗时是预编译正则方案的10倍以上
  • 如果你的职位描述包含多语言内容(比如示例里出现的法语、荷兰语词汇),只需要把词形还原工具替换成对应语言的轻量词干提取器即可,不需要上多语言大模型
  • 如果需要Skills列存列表格式方便后续分析,把函数返回值从逗号拼接的字符串改成hit_skills列表即可

内容的提问来源于stack exchange,提问作者Thijs Kalshoven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:48:43