如何在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
关键说明
- 管道顺序:必须将
entity_ruler放在ner之前,确保自定义实体规则先被应用,避免被内置NER的结果覆盖。 - 正则表达式优化:移除
^和$锚点,因为spaCy的TEXT正则匹配默认是针对整个token的文本,不需要额外锚定字符串首尾。
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

