Spacy无法识别带撇号的人名,NER模型返回错误标签求助
问题分析与解决
原代码与问题
import spacy nlp = spacy.load("en_core_web_sm", disable=["tok2vec", "tagger", "parser", "attribute_ruler", "lemmatizer"]) doc = nlp("That had been Megan's plan when she got him dressed earlier.") labels = [ent.label_ for ent in doc.ents] entity_text = [ent.text for ent in doc.ents] print(labels) print(entity_text)
运行上述代码后,Megan被识别为[ORG]而非预期的[PERSON]。请问我哪里操作有误?没想到一个简单的撇号会导致NER模型识别出错。
问题根源
你禁用了tok2vec、tagger、parser这些NER模型必须依赖的上游核心组件,导致NER失去了关键的句法、词性特征支持,只能靠孤立的词汇片段做判断,才会把带所有格的Megan's误判为ORG。
spaCy的NER模型(尤其是en_core_web_sm这类轻量模型)严重依赖上游管道的输出:
tok2vec提供基础词向量,是所有模型的特征基础tagger输出的词性标签(比如所有格名词的标签)能帮模型区分人名所有格和组织名称的差异parser生成的句法结构(比如依存关系)能让模型理解Megan's是修饰plan的主语所有格,进一步确认其指代的是人名
修正方案
只禁用对NER无影响的组件,保留核心依赖管道:
import spacy # 仅禁用attribute_ruler和lemmatizer,这两个组件不影响NER的正常工作 nlp = spacy.load("en_core_web_sm", disable=["attribute_ruler", "lemmatizer"]) doc = nlp("That had been Megan's plan when she got him dressed earlier.") labels = [ent.label_ for ent in doc.ents] entity_text = [ent.text for ent in doc.ents] print(labels) # 输出: ['PERSON'] print(entity_text) # 输出: ["Megan's"]
如果需要进一步精简管道,最少要保留tok2vec、tagger和parser,这三个是NER准确识别的必要条件。
内容的提问来源于stack exchange,提问作者postnubilaphoebus
相关产品推荐
相关产品推荐

