如何使用spaCy为职位名称类短语生成word embeddings用于聚类?
多词职位名称的嵌入生成方案(适配spaCy
de_core_news_lg 模型) 方案1:直接使用spaCy内置Doc向量(首选)
你选用的de_core_news_lg属于带预训练词向量的大模型,spaCy本身已经内置了短文本向量生成逻辑,不需要额外写复杂规则:直接把完整的多词职位名称传入nlp对象得到Doc实例,实例的.vector属性默认就是所有带有效向量的token的平均值,会自动跳过停用词、标点等无意义内容,输出的向量维度和单词语义完全对齐,完全适配职位名称这类短文本的聚类需求。
代码示例:
import spacy nlp = spacy.load("de_core_news_lg") # 直接传入多词职位名即可 job_title = "Python Developer" doc = nlp(job_title) # 直接获取短语嵌入向量 phrase_embedding = doc.vector
这个方案实现成本最低,针对5万条规模的职位数据集,聚类效果完全够用。
方案2:自定义加权平均向量(可优化效果)
如果默认平均的向量达不到聚类精度要求,可以根据词性自定义权重计算向量,比如给职位核心词更高权重,降低修饰词的权重:
- 先通过spaCy的词性标注能力,给专有名词(技术栈、专属职位名)、普通名词设置更高权重,助词、介词等非核心内容设置低权重或者直接排除
- 加权求和后除以总权重得到自定义短语向量
代码示例:
def get_custom_phrase_vector(doc): total_vector = 0 total_weight = 0 # 词性权重规则可根据德语职位的特性灵活调整 pos_weight = { "PROPN": 2, # 专有名词权重翻倍 "NOUN": 1.5, # 普通名词权重1.5倍 "VERB": 1, "ADJ": 0.8 } for token in doc: # 跳过无向量、停用词、标点符号 if not token.has_vector or token.is_stop or token.is_punct: continue weight = pos_weight.get(token.pos_, 0.5) total_vector += token.vector * weight total_weight += weight return total_vector / total_weight if total_weight > 0 else doc.vector
方案3:先抽核心短语再生成向量(适配长职位名)
如果你的职位名称里有大量冗余的职级、福利修饰内容,可以先通过doc.noun_chunks提取职位的核心名词短语,再对核心短语生成向量,能有效降低冗余内容带来的噪音,这个方案更适合长度超过5个词的职位名称。
注意:
de_core_news_lg的词向量是通用语料训练的,如果聚类后发现部分垂直领域的专业职位相似度不符合预期,可以用你手里的5万条职位语料微调词向量,不过绝大多数场景下前两个方案已经能满足需求。
内容的提问来源于stack exchange,提问作者Daniil Yefimov
相关产品推荐
相关产品推荐

