如何从Spacy获取英文停用词并避免报错?解决TypeError问题
问题分析与解决
报错原因
你遇到的TypeError: argument of type 'module' is not iterable,核心原因是错误导入了停用词模块而非停用词集合:from spacy.lang.en import stop_words as stop_words导入的是整个stop_words模块,而非模块内存储停用词的STOP_WORDS集合,导致在word not in stop_words时,尝试迭代一个模块对象,触发错误。
此外代码还有两个隐性问题:
- 未初始化spaCy的
nlp文本处理对象 - 未定义
punctuations标点过滤变量
修正后的完整代码
import spacy from spacy.lang.en.stop_words import STOP_WORDS import string # 初始化nlp对象(需先安装英文核心模型:pip install spacy && python -m spacy download en_core_web_sm) nlp = spacy.load("en_core_web_sm") # 定义标点符号集合 punctuations = string.punctuation def tokenize(sentence): # 用nlp处理输入文本 doc = nlp(sentence) # 词形还原+小写标准化处理 tokens = [word.lemma_.lower().strip() if word.lemma_ != "-PRON-" else word.lower_ for word in doc] # 过滤停用词与标点 filtered_tokens = [token for token in tokens if token not in STOP_WORDS and token not in punctuations] return filtered_tokens # 测试调用 print(tokenize("Hello I am Leyla and "))
关键修正点说明
- 停用词导入修正:改用
from spacy.lang.en.stop_words import STOP_WORDS,直接导入存储所有英文停用词的集合 - 初始化nlp对象:必须通过
spacy.load()加载对应语言模型,才能完成分词、词形还原等文本处理操作 - 标点集合定义:借助
string.punctuation获取标准标点符号集合,无需手动编写标点列表 - 变量命名优化:将原代码中复用的
sentence变量拆分为doc(nlp处理后的文档对象)和tokens(处理后的词列表),逻辑更清晰
注:如果你的输入是荷兰语(比如示例中的"Hallo ik ben leyla en "),建议切换为荷兰语spaCy模型(nl_core_news_sm),并对应导入荷兰语停用词from spacy.lang.nl.stop_words import STOP_WORDS,否则英文模型处理非英文文本的效果会很差。
内容的提问来源于stack exchange,提问作者Leyla Elkhamlichi
相关产品推荐
相关产品推荐

