NLTK扩展自定义停用词后过滤结果不符合预期问题咨询
NLTK自定义停用词相关问题解答
NLTK扩展自定义停用词没有数量上限,你遇到的过滤失效问题和容量限制无关,完全是token匹配逻辑的问题。
过滤失效的核心原因
你示例里待过滤的词条是always,——末尾带了逗号,但是你加入停用词表的是不带任何标点的纯单词always,两个字符串内容不一致,自然不会被判定为停用词。
你之前试过的转小写、调整大小写匹配规则,都没有解决「词条带标点」这个核心矛盾,所以匹配不上是必然结果。
修正方法
过滤前先给每个词条做归一化:剥离前后附着的标点、统一转小写,再和停用词表做匹配即可。修正后的参考代码:
import string new_stopwords = ['always','example','session','etc','uh'] import nltk nltk.download('stopwords') from nltk.corpus import stopwords # 停用词转set,去重同时大幅提升成员判断效率 stpwrd = set(stopwords.words('english')) stpwrd.update(new_stopwords) step1 = ['then', 'insightful', 'so', 'as', 'always,', 'we', 'have', 'two', 'topics', 'for', "today's", 'session', 'uh'] # 先剥离词条前后标点、转小写,再判断是否为停用词 filtered_words = [ word for word in step1 if word.strip(string.punctuation).lower() not in stpwrd ] print(filtered_words) # 运行输出:['insightful', 'topics']
实用优化建议
- 停用词存储优先用
set类型而非list:list做成员判断要遍历整个列表,文本量大的时候速度很慢,set的判断效率高很多 - 如果是从原始文本开始处理,推荐先用NLTK自带的
word_tokenize做分词,它会自动把附着在单词前后的标点拆成独立token,能减少很多标点附着导致的匹配问题 - 停用词匹配前的归一化流程要统一:全小写、剥离前后特殊符号,避免因为格式差异导致漏匹配
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

