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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:57:44