如何让Spacy自定义实体模型实现单句内每类实体最多仅识别1个
解决方案
spacy的NER组件没有原生配置项可以直接限制单句同类型实体的数量,最稳妥且完全匹配你需求的实现方式是在推理pipeline中加一层自定义后处理逻辑,按实体置信度筛选每类得分最高的唯一实体。
你可以参考以下代码实现:
import spacy # 加载你训练完成的自定义实体模型 nlp = spacy.load("你的自定义模型本地路径") # 开启NER组件返回实体置信度的配置 nlp.get_pipe("ner").return_scores = True def single_entity_per_type_filter(doc): type_max_ent = {} for ent in doc.ents: # 取当前实体的NER置信度得分 current_score = ent.score # 同类型仅保留得分最高的实体 if ent.label_ not in type_max_ent or current_score > type_max_ent[ent.label_].score: type_max_ent[ent.label_] = ent # 替换文档实体列表为过滤后的结果 doc.ents = list(type_max_ent.values()) return doc # 将过滤逻辑加入pipeline末尾,每次预测自动执行 nlp.add_pipe(single_entity_per_type_filter, last=True) # 测试用例 test_doc = nlp("John去了麦当劳") for ent in test_doc.ents: print(f"实体:{ent.text},类型:{ent.label_}") # 输出结果仅保留得分更高的 John PERSON 实体
如果你的项目是基于spacy官方项目框架训练的,可以把上述过滤函数注册为自定义组件,直接写入config.cfg的pipeline配置中,无需每次运行手动挂载。
如果你希望从训练层面降低多同类型实体的出现概率,可以在标注训练数据时严格遵守每句同类型实体最多1个的规则,同时适当调低NER组件的overlap_thresh超参数,但后处理方案是可控性最高、完全匹配你的业务规则的选择,不会受模型预测波动影响。
内容的提问来源于stack exchange,提问作者gfsemelas
相关产品推荐
相关产品推荐

