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

如何在spaCy中创建含点和连字符的Entity Ruler模式识别CPF

解决spaCy识别巴西CPF实体的问题

你的代码无法识别CPF的核心原因是EntityRuler管道的顺序错误:默认情况下add_pipe会把新管道添加到现有管道的末尾,而pt_core_news_sm自带的ner管道会先于entity_ruler运行,导致后者识别的实体无法被纳入最终结果。此外,正则表达式的锚点使用也存在冗余。

修改后的代码(两种有效方式)

方式1:使用SHAPE模式

import spacy
from spacy.pipeline import EntityRuler

nlp = spacy.load("pt_core_news_sm")
# 将entity_ruler放在ner管道之前运行
ruler = nlp.add_pipe("entity_ruler", before="ner")

text = "João mora na Bahia, 22/11/1985, seu cpf é 111.222.333-11"
patterns = [
    {"label": "CPF", "pattern": [{"SHAPE": "ddd.ddd.ddd-dd"}]},
]

ruler.add_patterns(patterns)
doc = nlp(text)

# 提取实体
for ent in doc.ents:
    print(ent.text, ent.label_)

方式2:使用正则表达式模式

import spacy
from spacy.pipeline import EntityRuler

nlp = spacy.load("pt_core_news_sm")
ruler = nlp.add_pipe("entity_ruler", before="ner")

text = "João mora na Bahia, 22/11/1985, seu cpf é 111.222.333-11"
patterns = [
    {"label": "CPF", "pattern": [{"TEXT": {"REGEX": r"\d{3}\.\d{3}\.\d{3}-\d{2}"}}]},
]

ruler.add_patterns(patterns)
doc = nlp(text)

# 提取实体
for ent in doc.ents:
    print(ent.text, ent.label_)

运行结果

修改后两种方式都会输出:

João PER
Bahia LOC
111.222.333-11 CPF

关键说明

  1. 管道顺序:必须将entity_ruler放在ner之前,确保自定义实体规则先被应用,避免被内置NER的结果覆盖。
  2. 正则表达式优化:移除^和$锚点,因为spaCy的TEXT正则匹配默认是针对整个token的文本,不需要额外锚定字符串首尾。

内容的提问来源于stack exchange,提问作者celsowm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:52:55