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

使用Spacy提取词元时相同词汇出现不同结果的原因咨询

问题

提取文本词元时,发现同一个词汇在不同位置得到的结果不同,参考代码如下:

from nltk.stem import PorterStemmer
import spacy
import pandas as pd

ps = PorterStemmer()

# spacy.cli.download("en")
nlp = spacy.load("en_core_web_sm")

words = [  "meeting","eating", "adjustable",  "meeting", "eats", "eating", "eat", "ate", "rafting", "better", "good", "best", 'coming', "ability", "steal", "stolen", 'children']
word_joined = " ".join(words)
# print(word_joined)
doc = nlp(word_joined)

words_lemma = []
words_stemm = []


words_stemm = [ps.stem(w) for w in words]
words_lemma = [w.lemma_ for w in doc]

pd.DataFrame(list(zip(words, words_stemm, words_lemma))) 

结果截图:
词元提取结果截图

请问这是否与词汇在句子中的语言学位置有关?

回答

这确实和词汇的语言学位置(上下文语境)有关,核心原因在于词干提取(Stemming)和词形还原(Lemmatization)的底层逻辑差异,以及Spacy词形还原对词性标注的依赖:

  • NLTK的PorterStemmer是纯规则驱动的词干提取工具,只看单词本身的字符序列,完全不考虑上下文和词性。比如不管"meeting"是名词(会议)还是动词(meet的现在分词),都会被处理成"meet"。
  • Spacy的词形还原则必须结合词性标注结果,而词性标注会受上下文影响。以你例子里的两个"meeting"为例:
    • 第一个"meeting"在无明确语境的序列开头,Spacy可能将其标注为名词,对应的词形还原结果就是"meeting";
    • 第二个"meeting"出现在其他动词形式之后,被标注为动词(meet的现在分词),词形还原结果就变成了"meet"。
  • 类似的情况也会发生在"eating"这类多词性单词上——它既可以作名词(饮食行为)也可以作动词(eat的现在分词),词性标注不同,词形还原结果就会不一样。

总结来说:词干提取是无上下文的机械规则操作,词形还原则是结合上下文和词性的智能处理,这就是同一个词在不同位置得到不同结果的核心原因。

内容的提问来源于stack exchange,提问作者Amar Pal Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:40:33