You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NLP任务中自定义停用词列表无法移除的问题排查

文本清洗函数停用词失效问题排查与修复

嘿,我帮你找出停用词无法移除的原因啦!你的代码里有两个核心问题,咱们一步步拆解:

问题根源

  1. 语法小疏漏:第一行的生成器表达式(re.sub(r'\d+','£', s) for s in sentences少了个闭合的),不过看起来你运行时没触发语法错误,可能是输入时漏写了,但这不是主要问题。

  2. 过滤对象完全错了!
    你替换数字后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:22:31