在spaCy的entity_ruler中能否引用已定义的其他实体构建匹配规则?
spaCy entity_ruler 引用同组件定义实体的问题修复
问题根因
同一个entity_ruler组件的所有模式匹配是基于组件运行前的Doc实体状态执行的,当前ruler的patterns里定义的Agreement实体,在匹配过程中还没有被写入Doc,因此后面依赖ENT_TYPE: 'Agreement'的模式自然无法命中任何内容。
修复方案
拆分两个独立的entity_ruler组件,按依赖顺序执行:
- 第一个ruler仅负责匹配所有
Agreement实体,写入Doc的实体列表 - 第二个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
相关产品推荐
相关产品推荐

