如何将列内相似职位名称替换为同组出现频次最高的对应名称
职位名称相似变体统一替换解决方案
实现思路
整体核心逻辑分4步,你已经完成相似度计算和频次统计,可以直接跳过第二步:
- 预处理职位名称:先统一标准化所有职位文本,全转小写/大写、去除前后空格、无意义的特殊字符、纯数字后缀,消除格式类无意义差异。如果需要保留junior/senior、职级编号这类区分属性,可以单独拆成独立字段后续再拼接,避免聚类时把不同职级的同类职位误归为一组。
- 相似度计算:你已经完成该步骤可直接跳过。未计算的场景下,短文本优先选编辑距离(Levenshtein)、Jaccard词集相似度,需要语义匹配的场景可以用Sentence-BERT生成职位向量再算余弦相似度。
- 相似职位聚类:有两种可选方案,按需调整:
- 阈值匹配法:直接设定相似度阈值(建议先试0.8-0.9区间的数值),两个职位相似度超过阈值就归为同一组,注意处理链式匹配的问题(A和B匹配、B和C匹配,要把A/B/C都归为同一组)。
- 密度聚类法:用DBSCAN算法,基于你已经算好的相似度矩阵做聚类,不需要提前指定类别数,自动把相似度符合要求的职位聚为同一个簇,孤立的低相似度职位单独成簇即可。
- 统一替换为高频名称:每个聚类簇内,取该组中出现频次最高的职位名称作为统一标准名,把簇内所有其他变体都替换为该标准名即可。
Python 代码实现示例
import pandas as pd import numpy as np from sklearn.cluster import DBSCAN # 1. 加载数据,你已经有三个核心字段:原始职位名job_title、出现频次count、相似度矩阵 df = pd.read_csv("你的职位数据文件路径.csv") # 预处理文本 df['clean_title'] = df['job_title'].str.lower().str.replace(r'[^a-zA-Z\u4e00-\u9fa5\s]', '', regex=True).str.strip() # 2. 加载你已经计算好的相似度矩阵,注意转成距离矩阵(DBSCAN输入为距离值,值越小越相似) # 示例:假设你的相似度矩阵是n*n的二维数组,值范围0-1,越高越相似 sim_matrix = np.load("你提前算好的相似度矩阵文件路径.npy") distance_matrix = 1 - sim_matrix # 3. DBSCAN聚类,eps为距离阈值,对应相似度=1-eps,min_samples是簇内最少样本数,按需调整 clustering = DBSCAN(eps=0.15, min_samples=2, metric='precomputed').fit(distance_matrix) df['cluster_id'] = clustering.labels_ # 4. 生成每个簇的标准名:取簇内频次最高的职位名 def get_standard_title(group): return group.loc[group['count'].idxmax(), 'job_title'] cluster_std_map = df.groupby('cluster_id').apply(get_standard_title).to_dict() # 离群点(cluster_id=-1)保留原始名称 df['standard_job_title'] = df['cluster_id'].map( lambda x: cluster_std_map[x] if x != -1 else df.loc[df['cluster_id'] == x, 'job_title'].values[0] ) # 导出结果 df.to_csv("标准化后的职位数据.csv", index=False)
调优建议
- 阈值可以多轮测试调整:比如把eps从0.1到0.2逐次调整,每次输出聚类结果校验是否符合业务预期,找到最优阈值。
- 可提前配置同义映射词典:比如把
developer和engineer、专员和助理这类业务上认可的同义表述提前做映射,能大幅提升聚类准确率。 - 如果需要保留职级、级别区分:预处理时把
senior、junior、一级、二级这类属性单独拆成字段,聚类仅用职位核心名称,生成标准名时再把职级属性拼接回去即可。
内容的提问来源于stack exchange,提问作者skwolvie
相关产品推荐
相关产品推荐

