SpaCy规则匹配多格式人名实体(含逗号分隔)不生效问题咨询
解决方法
你遇到的问题是EntityRuler默认配置不允许覆盖已有的NER标注结果,加上现有规则没有适配多token人名的情况,仅需两步调整即可仅通过规则实现需求,无需训练自定义模型:
- 初始化EntityRuler时开启
overwrite_ents配置,允许规则匹配结果覆盖原有NER实体,解决冲突:
# 修改add_pipe行,新增config参数 ruler = nlp.add_pipe("entity_ruler", after='ner', config={"overwrite_ents": True})
- 调整匹配规则,适配多token人名(比如
Jean Joseph是两个连续PER类型的token),用OP:+表示匹配1个及以上连续的PER类型token:
specific_forms_patterns_persons = [ {"label": "PER", "pattern": [ {"ENT_TYPE": "PER"}, {"ORTH": ","}, {"ENT_TYPE": "PER", "OP": "+"} ]} ]
修改后运行你的代码即可得到期望输出:
[('Jules, Michelet', 'PER'), ('Laborde, Jean Joseph', 'PER'), ('Jacques Mei', 'PER'), ('Paris', 'LOC')]
补充说明
- 你提到的三种人名格式都可以通过规则覆盖:无标点的
FIRSTNAME LASTNAME本身会被预训练NER直接识别,两种带逗号的格式会被上述规则合并识别,无需额外调整。 - 如果有部分冷门人名预训练NER识别不到,可以继续在
patterns列表中添加对应的全匹配规则即可。
内容的提问来源于stack exchange,提问作者Lter
相关产品推荐
相关产品推荐

