使用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
相关产品推荐
相关产品推荐

