如何修改停用词移除代码,同时去除数字、标点与特殊字符
解决方案
直接用string.punctuation替代手动枚举标点,再结合正则/字符串方法过滤数字和纯特殊字符token,改进后的代码如下:
import string import re from nltk.corpus import stopwords # 加载英文停用词 eng_stopwords = stopwords.words('english') # 合并停用词和所有标点,转成集合提升查找效率 complete_stopwords = set(eng_stopwords + list(string.punctuation)) def filter_tokens(words): cleaned_tokens = [] for token in words: # 同时满足三个条件才保留: # 1. 不在停用词/标点集合内 # 2. 不是纯数字(包括长数字token) # 3. 不是纯特殊字符(比如!!!、???、😀这类) if (token not in complete_stopwords and not token.isdigit() and not re.match(r'^[\W_]+$', token)): cleaned_tokens.append(token) return cleaned_tokens # 应用到DataFrame列 df['removed'] = df['tokenized_text'].apply(filter_tokens)
关键改进点:
- 用
string.punctuation直接获取所有标准标点,不用手动罗列,覆盖更全面 - 把停用词转成集合,比列表查找速度快很多,数据量大的时候效果明显
- 新增两个过滤规则:
not token.isdigit():直接排除所有纯数字的token,不管是短数字还是长数字re.match(r'^[\W_]+$', token):用正则匹配整个token都是非字母数字的情况,彻底过滤纯特殊字符、emoji这类无效token
如果不需要过滤emoji,只处理标点和数字,也可以把正则判断换成not all(char in string.punctuation for char in token),更轻量。
内容的提问来源于stack exchange,提问作者Nip
相关产品推荐
相关产品推荐

