Spacy词形还原与lemma_lookup表结果不一致问题咨询
为什么Spacy文档遍历的词形还原结果和lemma_lookup表查询不一致?
这事儿我之前踩过坑,其实不是你操作错了,是Spacy的词形还原逻辑和lemma_lookup表的定位本来就不一样~
核心原因:Spacy 2.x的词形还原是「模型优先」的组合逻辑
你用的en_core_web_lg是预训练模型,它的词形还原组件(lemmatizer)是基于模型预测+规则补充的,而不是直接依赖lemma_lookup这个静态映射表:
- 对于预训练模型来说,模型会根据单词的上下文、词性标记等信息预测词形还原结果,这个优先级远高于
lemma_lookup表; lemma_lookup本质是一个简单的规则映射表,更多是给无预训练模型的语言、或者规则型lemmatizer用的,属于「兜底」补充,不是预训练模型的首选逻辑。
为什么"faster"的结果不一样?
在en_core_web_lg(Spacy 2.2.4版本)的模型训练逻辑里,"faster"作为形容词的比较级,模型预测的词形还原结果就是"faster"(它认为比较级形式本身是一个合理的 lemma 形式);而lemma_lookup表是基于简单规则的映射——直接把比较级形容词映射到原级,所以查出来是"fast"。两者的逻辑出发点不同,自然结果不一致。
验证:切换到规则型lemmatizer试试
如果想让词形还原用lemma_lookup表的规则,可以手动换成规则型lemmatizer,代码如下:
from spacy.lang.en import English from spacy.lang.en.lemmatizer import LOOKUP nlp = English() lemmatizer = nlp.add_pipe("lemmatizer") lemmatizer.add_lookup("lemma_lookup", LOOKUP) doc = nlp("I'm running faster") for tok in doc: print(tok.lemma_)
运行后你会看到"faster"的词形还原结果变成了"fast",这就是因为现在用的是纯规则lookup的逻辑。
总结
你的操作完全没问题,只是对Spacy词形还原的机制理解有偏差:预训练模型的lemmatizer优先用模型预测结果,而lemma_lookup是独立的规则表,两者不属于同一套逻辑,所以会出现结果不一致的情况。
内容的提问来源于stack exchange,提问作者ddvlamin
相关产品推荐
相关产品推荐

