如何用gensim/spacy/nltk过滤DataFrame单列中的英文停用词
问题原因与解决方法
首先你的代码报错和逻辑错配的核心原因:
- 你当前
words列每行存储的是单个独立英文词汇,你在lambda中对单个字符串执行" ".join(x),如果数据存在NaN空值,空值不属于可迭代对象,就会触发对应TypeError - 逻辑不符合需求:你要实现的是过滤掉属于停用词的行,而
remove_stopwords是用来处理长句/段落,删除句子内部停用词的工具,完全不匹配你的使用场景。
10万+行数据的最优方案是将停用词转为集合后用isin做向量化判断,速度远高于逐行apply,以下是三个常用库的实现方式:
方法1:NLTK实现
import pandas as pd import nltk from nltk.corpus import stopwords # 首次使用需要下载停用词表 nltk.download('stopwords') # 转集合后查询速度为O(1),适配大数据量 en_stop = set(stopwords.words('english')) # 先删除空值避免异常 df = df.dropna(subset=['words']) # 过滤非停用词的行 df = df[~df['words'].isin(en_stop)].reset_index(drop=True)
方法2:Gensim实现
不需要额外下载停用词表,开箱即用:
import pandas as pd from gensim.parsing.preprocessing import STOPWORDS df = df.dropna(subset=['words']) # Gensim的STOPWORDS本身就是集合类型,直接用即可 df = df[~df['words'].isin(STOPWORDS)].reset_index(drop=True)
方法3:spaCy实现
停用词覆盖更全面,适合对分词精度要求高的场景:
import pandas as pd import spacy # 加载英文基础模型,未安装的话先执行:pip install spacy && python -m spacy download en_core_web_sm nlp = spacy.load('en_core_web_sm') en_stop = nlp.Defaults.stop_words df = df.dropna(subset=['words']) df = df[~df['words'].isin(en_stop)].reset_index(drop=True)
补充:如果后续你需要处理句子格式的words列
如果words列每行存储的是完整句子,要删除句子内部的停用词,可以用以下写法:
from gensim.parsing.preprocessing import remove_stopwords # 先统一转字符串类型避免空值报错 df['words'] = df['words'].astype(str).apply(remove_stopwords) # 过滤处理后为空的行 df = df[df['words'].str.strip() != ''].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者AJ.
相关产品推荐
相关产品推荐

