Spacy使用Entity Ruler为NER添加多匹配模式的问题排查
SpaCy Entity Ruler 自定义匹配失效问题解答
现有配置的错误点
- 你编写的匹配规则逻辑和需求不匹配:当前传入的
pattern是连续顺序匹配规则,要求文本中必须按顺序、无间隔连续出现wan→fibre→flex→premium/standard/service这一串token才会触发匹配。你的测试文本中这些目标词之间被标点、地址类词汇隔开,不存在连续排列的情况,因此规则完全没有命中。 - 初始化
entity_ruler时未开启实体覆盖参数:默认配置下规则匹配结果不会覆盖统计模型输出的实体重叠结果,就算写对了单字匹配规则,默认模型识别出的PERSON、ORG标签也会优先保留,不会被替换为你定义的PRODUCT标签。
同标签多独立匹配规则支持说明
完全支持。同一个实体标签下可以添加任意多条独立的匹配规则,每条规则单独判断命中,不需要把所有目标词塞进同一个匹配数组里。
可直接运行的正确配置代码
import spacy nlp3 = spacy.load("en_core_web_sm") # 初始化规则匹配器时放在ner组件前,同时开启实体覆盖权限 ruler = nlp3.add_pipe( "entity_ruler", before="ner", config={"overwrite_ents": True} ) # 同一个PRODUCT标签下配置多条独立规则,分别匹配每个目标词 patterns = [ {"label": "PRODUCT", "pattern": [{"LOWER": "wan"}]}, {"label": "PRODUCT", "pattern": [{"LOWER": "fibre"}]}, {"label": "PRODUCT", "pattern": [{"LOWER": "flex"}]}, {"label": "PRODUCT", "pattern": [{"LOWER": "premium"}]}, {"label": "PRODUCT", "pattern": [{"LOWER": "standard"}]}, {"label": "PRODUCT", "pattern": [{"LOWER": "service"}]} ] ruler.add_patterns(patterns) # 修正原测试文本未闭合的引号问题 text = 'Wan, Flex, Havelock St, WAN, premium, Fibre, 15a, UK, Fletcher inc, Fletcher, Princeton Street, Fendalton road, Bealey avenue' doc = nlp3(text) for ent in doc.ents: print(ent, '|', ent.label_)
运行后所有大小写形态的wan/Wan/WAN、Fibre/fibre都会被正确标注为PRODUCT实体,不会再被默认模型识别为PERSON或ORG类型。
内容的提问来源于stack exchange,提问作者Michael Bewin
相关产品推荐
相关产品推荐

