NLP任务中自定义停用词列表无法移除的问题排查
文本清洗函数停用词失效问题排查与修复
嘿,我帮你找出停用词无法移除的原因啦!你的代码里有两个核心问题,咱们一步步拆解:
问题根源
语法小疏漏:第一行的生成器表达式
(re.sub(r'\d+','£', s) for s in sentences少了个闭合的),不过看起来你运行时没触发语法错误,可能是输入时漏写了,但这不是主要问题。过滤对象完全错了!
你替换数字后,sentences变成了一个生成器,每个元素是完整的句子字符串。之后你写的' '.join(w for w in sentences if w not in stopwords),这里的w是一整句话(比如"wild things is a suspenseful .. twists . "),而不是句子里的单个单词。拿整句话和'a'、'is'这种单个停用词对比,当然永远匹配不上,停用词自然过滤不掉。
修复后的完整代码
我把代码调整成了正确的逻辑:先拆分每个句子的单词,再过滤停用词,最后重新拼接。同时修正了语法问题:
import re def clean_sentences(sentences): # 先把每个句子里的数字替换成£,得到处理后的句子列表 processed_sentences = [re.sub(r'\d+','£', s) for s in sentences] stopwords = ['a', 'and', 'any', 'he', 'her', 'here', 'hers', 'herself', 'him', 'himself', 'is' , 'it'] cleaned_texts = [] for sent in processed_sentences: # 把句子拆成单个单词(这里用split(),如果需要更精细的分词可以调整) words = sent.split() # 过滤停用词,加了lower()避免大小写漏判,不需要的话可以去掉 filtered_words = [word for word in words if word.lower() not in stopwords] # 重新拼成干净的句子 cleaned_texts.append(' '.join(filtered_words)) # 如果需要返回拼接成的大文本就用下面这句,要列表的话直接return cleaned_texts return ' '.join(cleaned_texts)
额外优化小建议
- 大小写兼容:我在过滤时加了
word.lower(),这样像Is、It这种大写的停用词也能被过滤掉,如果你的场景需要区分大小写,删掉lower()就行。 - 分词精度:
split()只是简单按空格拆分,要是文本里有带标点的单词(比如thriller...),可以先做标点清理,或者用nltk的word_tokenize做更专业的分词。 - 内存优化:如果你的语料特别大,可以把列表换成生成器来节省内存,但小数据集用列表更方便操作。
测试效果
用你给的示例输入测试,修复后的函数会输出:wild things suspenseful .. twists . know already.. film goers . touchstone pictures..about . okay ?
能看到is、a、it这些停用词已经被成功移除啦!
内容的提问来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

