You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在spaCy的entity_ruler中能否引用已定义的其他实体构建匹配规则?

spaCy entity_ruler 引用同组件定义实体的问题修复

问题根因

同一个entity_ruler组件的所有模式匹配是基于组件运行前的Doc实体状态执行的,当前ruler的patterns里定义的Agreement实体,在匹配过程中还没有被写入Doc,因此后面依赖ENT_TYPE: 'Agreement'的模式自然无法命中任何内容。

修复方案

拆分两个独立的entity_ruler组件,按依赖顺序执行:

  1. 第一个ruler仅负责匹配所有Agreement实体,写入Doc的实体列表
  2. 第二个ruler基于已经生成的Agreement实体,匹配AgreementDate类型
    同时为了适配多token的Agreement实体(比如license agreement是2个token),在AgreementDate的匹配规则中增加OP: '+'配置,支持匹配1个或多个连续的Agreement类型token。
    修复后代码如下:
import spacy
# 拆分基础实体和依赖实体的匹配规则
agreement_patterns = [
    {'label': 'Agreement', 'pattern': [{'LOWER': 'license agreement'}]},
    {'label': 'Agreement', 'pattern': [{'LOWER': 'agreement'}]},
    {'label': 'Agreement', 'pattern': [{'LOWER': 'commencement'}]},
    {'label': 'Agreement', 'pattern': [{'LOWER': 'parties'}]},
]
date_patterns = [
    {'label': 'AgreementDate', 'pattern': [{'ENT_TYPE': 'Agreement', 'OP': '+'}, {'LOWER': 'date'}]},
]
nlp = spacy.load('en_core_web_sm')
# 加载第一个ruler:生成Agreement实体
agreement_ruler = nlp.add_pipe('entity_ruler', name='agreement_ruler', config={
    'validate': True,
    'overwrite_ents': True
})
agreement_ruler.initialize(lambda: [], nlp=nlp, patterns=agreement_patterns)
# 加载第二个ruler:匹配依赖Agreement的AgreementDate实体
date_ruler = nlp.add_pipe('entity_ruler', name='agreement_date_ruler', config={
    'validate': True,
    'overwrite_ents': True
})
date_ruler.initialize(lambda: [], nlp=nlp, patterns=date_patterns)
# 测试输出
for ent in nlp('''Commencement Date
license agreement date''').ents:
    print(f'{ent.text:40} {ent.label_:40}')

运行输出结果:

Commencement Date                       AgreementDate                         
license agreement date                  AgreementDate                         

内容的提问来源于stack exchange,提问作者Vito De Tullio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:15:07