Ubuntu环境下spaCy 2.0西班牙语简历NER模型自定义特征使用问询
利用段落板块信息增强spaCy NER的实现方法
嘿,这个思路真的很棒——简历这种结构化极强的文本,段落所属板块本身就是超强的上下文线索,用来辅助NER绝对能大幅提升实体识别的准确率!针对你的问题,先给个明确结论:spaCy 2.0的默认NER组件不会自动使用你添加的自定义属性作为特征,必须通过手动实现来整合这些信息,下面给你两种适配你技术栈的实用方案:
方案1:把板块信息融入模型训练(从特征层面优化)
这种方法是让NER模型在训练时直接学习到板块和实体类型的关联,属于从根源上增强模型能力,步骤如下:
1.1 给Token添加自定义板块属性
首先,给每个Token标记它所属的段落板块(比如work_experience、education):
from spacy.tokens import Token # 注册自定义Token属性,存储段落板块信息 Token.set_extension("section", default=None) # 假设你已经有段落分段和板块判断的逻辑,处理文本时给每个Token赋值 doc = nlp(your_resume_text) for section in your_segmented_sections: # section包含:段落文本的起始/结束token索引、板块类型 for token in doc[section.start_idx:section.end_idx]: token._.section = section.type
1.2 修改NER的特征模板,加入板块特征
spaCy 2.0的NER是基于特征模板提取特征的,你需要扩展默认模板,让模型把板块属性作为特征之一:
from spacy.lang.es import Spanish from spacy.pipeline import EntityRecognizer # 初始化空白西语模型 nlp = Spanish() ner = EntityRecognizer(nlp.vocab) # 获取默认的NER特征模板 existing_templates = ner.model.templates # 添加自定义特征模板:使用token的_.section属性作为分类特征 # 模板格式:(特征名称, 属性路径, 默认值, 是否为分类特征) custom_templates = [ ("token.section", "section", [""], True) ] # 更新NER模型的特征模板 ner.model.templates = existing_templates + custom_templates # 将NER加入管道 nlp.add_pipe(ner)
1.3 确保训练数据包含板块属性
在训练时,你需要确保传入nlp.update()的每个Doc对象都已经设置好_.section属性,这样模型就能在训练过程中学习到板块和实体类型的关联。
方案2:后处理阶段修正实体结果(简单易上手)
如果不想修改模型的特征模板,你可以在NER预测完成后,根据段落板块信息对实体结果进行修正,这种方法实现成本低,适合快速验证效果:
def enhance_ner_with_section(doc): # 遍历所有识别出的实体 for ent in doc.ents: # 获取实体所在段落的板块类型(这里假设实体所在段落的第一个token的section属性代表整个段落) section_type = doc[ent.start]._.section if not section_type: continue # 根据板块类型调整实体标签 if section_type == "work_experience": # 工作经历板块中,更可能是机构而非教育院校,修正标签 if ent.label_ == doc.vocab.strings["EDUCATION"]: ent.label_ = doc.vocab.strings["ORG"] elif section_type == "education": # 教育板块中,更可能是院校而非普通机构 if ent.label_ == doc.vocab.strings["ORG"]: ent.label_ = doc.vocab.strings["EDUCATION"] return doc # 将这个后处理函数加入spaCy管道,放在NER组件之后 nlp.add_pipe(enhance_ner_with_section, after="ner")
总结
- 如果你希望模型从根本上学习到板块和实体的关联,优先选方案1,但需要调整特征模板和训练数据;
- 如果你想快速验证效果,或者不想改动模型核心逻辑,方案2是更简单的选择;
- 两种方法可以结合使用,先通过方案1训练模型,再用方案2做最终修正,效果会更好。
内容的提问来源于stack exchange,提问作者Kevin Rosenberg
相关产品推荐
相关产品推荐

