spaCY lemmatizer对重复词汇处理结果不一致的技术咨询
spaCy词形还原异常问题解析与解决方案
问题现象
原句:
"Not finished! Not finished! A gem for our adopted daughter, Kiri, - - born of Grace's avatar, - - and whose conception was a complete mystery."
- 包含2个"Not finished!"时,词形还原结果为:
['not', 'finished', 'not', 'finish', 'a', 'gem', 'for', 'our', 'adopt', 'daughter', 'bear', 'of', 'avatar', 'and', 'whose', 'conception', 'be', 'a', 'complete', 'mystery'],其中第一个"finished"被标注为AUX(助动词),第二个为VERB(动词) - 包含1个/3个/4个"Not finished!"时,所有"finished"均被还原为
finish,词性统一为VERB
原因解释
spaCy的词性标注和词形还原依赖上下文语境分析。当仅出现2个"Not finished!"且紧跟完整陈述句时,第一个感叹句会被模型误判为后续句子的辅助性谓语补充结构,因此标注为AUX;第二个感叹句因前面已有同类结构,模型修正判断逻辑,标注为正确的VERB。当重复次数达3次及以上,模型能明确识别出这是独立重复的感叹句式,统一标注为VERB;仅1个时则直接按独立感叹句处理,标注为VERB。
通用解决方案
1. 强制指定词性后还原
处理目标词前,手动将"finished"的POS标签改为VERB,再执行词形还原。示例代码:
import spacy nlp = spacy.load("en_core_web_sm") doc = nlp("Not finished! Not finished! A gem for our adopted daughter...") lemmas = [] for token in doc: if token.text.lower() == "finished": # 强制指定为VERB后获取词形还原结果 lemmas.append(token.lemma_ if token.pos_ == "VERB" else nlp.vocab.morphology.lemmatize(token.text, spacy.parts_of_speech.VERB)[0]) else: lemmas.append(token.lemma_)
2. 拆分文本单独处理
将重复的感叹句部分与后续陈述句拆分,分别处理后合并结果。比如先提取所有"Not finished!"单独处理,再处理剩余文本,最后拼接结果。
3. 添加自定义词形还原规则
通过spaCy的Morphologizer组件添加自定义规则,针对否定感叹句中的"finished"直接映射到finish,规避模型的上下文误判。
内容的提问来源于stack exchange,提问作者Denys Murakhovskyi
相关产品推荐
相关产品推荐

