去除文本停用词时出错:单个'd'被误删的解决求助
解决停用词误删单词中'd'的问题
问题根源
你碰到的问题是nltk英文停用词里的'd'是用来匹配单独出现的缩写(比如指代would/had的情况),但你的文本处理逻辑没按完整单词来过滤,反而把单个字符拿去匹配停用词,才导致正常单词里的'd'被误删。
正确处理方案
1. 按完整单词过滤(推荐)
停用词过滤本来就该针对完整单词,先分词再过滤就不会有问题:
from nltk.corpus import stopwords from nltk.tokenize import word_tokenize stop = set(stopwords.words('english')) text = "I don't think this d is a problem" # 先把文本拆成完整单词 tokens = word_tokenize(text) # 只移除完全匹配停用词的项 filtered_tokens = [token for token in tokens if token.lower() not in stop] print(filtered_tokens) # 输出: ["n't", 'think', 'problem']
这样只会删掉单独出现的'd',像"don't"里的'd'属于单词的一部分,根本不会被匹配到停用词,自然不会被误删。
2. 手动移除停用词里的'd'(可选)
要是你完全不需要处理单独的'd'这种缩写,也可以直接从停用词集合里删掉它:
stop = set(stopwords.words('english')) stop.discard("d") # 移除单个'd'
但不建议这么做——毕竟单独出现的'd'确实是需要过滤的停用词,还是按完整单词过滤的方案更合理。
别踩这个坑!
要是你之前的处理逻辑是像下面这样逐个字符处理,那肯定会出问题:
# 错误示例!别这么写! text = "don't" filtered_text = ''.join([c for c in text if c not in stop]) # 结果会变成"ont"——'d'被误删了
这种把字符和单词混为一谈的逻辑,就是问题的导火索。
内容的提问来源于stack exchange,提问作者Farheen Fatima
相关产品推荐
相关产品推荐

