简介这份中英文停用词资源面向从事文本分析、自然语言处理与信息检索的开发者及学习者用于解决分词后噪声词干扰关键词提取、情感分析与文本分类的问题。包内共11个文件以9个txt停用词表和2个py脚本为主压缩包约45KB体积轻便却覆盖中文助词、介词、连词及英文冠词、介词等常见停用词并附合并、去重等处理脚本便于按语言或场景灵活取用。目前已有1220人学习下载说明其在文本预处理环节具有较高参考价值。读者可借助这些词表配合jieba、nltk等工具快速完成中英文分词后的停用词过滤也能参考脚本思路定制专属词库减少重复整理成本提升后续主题挖掘与关键词抽取的准确度适合作为文本预处理阶段的基础资料长期留存。1. 做文本清洗的都知道停用词表选错后面全白搭上周帮一个做舆情分析的朋友排查问题他抱怨关键词提取结果里全是“的、了、是、在、我们、他们”真正有价值的实体词反而被淹没。我让他把预处理脚本发过来一看好家伙用的是一份只有 30 来个词的中文停用词表英文部分干脆没处理。这不是个例很多做 NLP 入门项目、文本分类、词云生成的同学往往在分词之后随手挂一个网上复制的小表结果模型效果怎么调都上不去最后怀疑是算法不行——其实问题出在停用词过滤这一步。这份“史上最全中英文停用词”资源就是冲着这个痛点来的。它把中文和英文的停用词做了系统化整理覆盖了常见虚词、代词、介词、连词、语气助词以及英文里的冠词、助动词、高频无意义副词等。适合谁用做文本挖掘、情感分析、关键词抽取、搜索引擎预处理、RAG 检索增强的从业者以及正在写毕业论文、需要做文本清洗实验的学生。你不需要自己从零去爬、去合并、去去重这份表拿过来就能直接挂到分词流程后面。但“最全”不等于“无脑用”。停用词表不是越长越好不同任务对停用词的容忍度完全不同。比如做情感分析时“不”和“没”这类否定词如果被过滤掉情感极性直接反转做关键词提取时“我们”这种词在某些语境下反而是核心实体。所以这篇文章不会只告诉你“下载就完事了”而是把选型逻辑、加载方式、参数调优、踩坑记录都拆开讲让你拿到表之后知道怎么改、怎么验证、怎么避坑。2. 停用词表的构成与选型中英文到底该收哪些词2.1 中文停用词的核心类别与边界中文停用词没有像英文那样有公认的标准列表不同来源的表差异很大。这份资源里的中文部分我拆开看了下主要覆盖以下几类结构助词的、地、得、之、所动态助词了、着、过语气词啊、吧、呢、吗、嘛、呀代词我、你、他、她、它、我们、你们、他们、这、那、这些、那些介词在、从、对、把、被、向、往、于连词和、与、及、或、但、而、因为、所以、如果数量词一些、一个、一种、每个、各种高频副词很、非常、十分、已经、正在、将要但这里有个关键边界“不、没、无、非”这类否定词在通用停用词表里通常不收。原因很简单它们承载语义极性一旦过滤情感分析、观点挖掘直接翻车。这份资源的中文表里我特意检查了没有把否定词收进去这一点做得比较克制。另一个边界是领域词。比如做医疗文本“患者”算不算停用词做电商评论“商品”算不算通用表不会收这些因为它们在通用语料里是实词。但如果你做的是垂直领域需要自己往表里追加领域停用词。我一般会先跑一遍词频统计把 Top 200 里明显无区分度的词手动加进去。2.2 英文停用词的分层逻辑英文停用词相对成熟经典的有 Fox 的通用表、NLTK 内置表、spaCy 默认表、scikit-learn 的 ENGLISH_STOP_WORDS。这份资源里的英文部分我对比了一下基本是 NLTK 表 spaCy 表的并集再补充了一些网络文本里常见的高频无意义词比如 “ok”、“yeah”、“lol” 这类口语词。英文停用词可以按强度分三层层级典型词适用场景强停用词the, a, an, is, are, was, were几乎所有 NLP 任务中停用词will, would, can, could, should信息检索、关键词提取弱停用词not, no, nor, never情感分析、否定检测慎用这份资源把强停用词和中停用词合并成了一个主表弱停用词单独标注了“否定词表”用的时候可以按需加载。这个设计比那种一锅端的表要合理得多。2.3 选型理由为什么不用 NLTK 默认表就完事很多人会问NLTK 不是自带停用词吗为什么还要单独搞一份我实际用下来的感受是NLTK 的英文表只有 179 个词中文表更是只有几十个而且更新缓慢。做社交媒体文本、短文本分类时NLTK 表明显不够用像 “im”、“ur”、“dont” 这种非规范拼写根本不在表里。这份资源的中英文表加起来覆盖了 1200 词条并且对网络文本做了补充这是它比标准库更实用的地方。但也不是说表越大越好。我见过有人把一份 3000 词的中文停用词表直接挂上去结果把“发展”、“经济”、“社会”这些在新闻语料里高频但有实际意义的词也过滤了最后关键词提取出来全是残渣。所以选型的核心原则是先看任务再看语料最后定表。通用表拿来当基线然后根据你的语料词频分布做增删。3. 加载与集成把停用词表挂进 Python 分词流程3.1 文件格式与读取方式这份资源提供的是纯文本格式一行一个词UTF-8 编码。中文表和英文表分开存放文件名分别是stopwords_zh.txt和stopwords_en.txt。读取方式很简单def load_stopwords(filepath): 读取停用词文件返回 set 集合。 参数 filepath: 停用词文件路径UTF-8 编码一行一个词。 返回: set去重后的停用词集合查询复杂度 O(1)。 with open(filepath, r, encodingutf-8) as f: # strip() 去掉行尾换行符和首尾空格 # 跳过空行和以 # 开头的注释行 words {line.strip() for line in f if line.strip() and not line.startswith(#)} return words zh_stopwords load_stopwords(stopwords_zh.txt) en_stopwords load_stopwords(stopwords_en.txt) print(f中文停用词数量: {len(zh_stopwords)}) print(f英文停用词数量: {len(en_stopwords)})用set而不是list的原因很直接过滤时每个词都要做一次成员判断set的查询是 O(1)list是 O(n)。当你的文本量到百万级时这个差异会被放大到不可忽略。另外注意跳过注释行这份表里有些词条带了分类标注用#开头读取时要排除。3.2 与 jieba 分词集成中文场景下最常用的分词工具是 jieba集成方式如下import jieba def cut_and_filter(text, stopwords): 对中文文本分词并过滤停用词。 参数 text: 原始中文文本字符串。 参数 stopwords: 停用词 set。 返回: 过滤后的词列表。 # jieba.lcut 返回列表精确模式 words jieba.lcut(text) # 过滤条件不在停用词表中且长度大于 1过滤单字噪声 # 注意长度大于 1 这个条件要按任务调整有些任务需要保留单字 filtered [w for w in words if w not in stopwords and len(w.strip()) 1] return filtered text 我们在进行文本分析的时候需要把一些没有意义的词过滤掉这样才能提高关键词提取的准确率。 result cut_and_filter(text, zh_stopwords) print(result) # 输出示例: [进行, 文本分析, 时候, 需要, 没有意义, 过滤, 这样, 提高, 关键词, 提取, 准确率]这里有个参数需要特别注意len(w.strip()) 1这个条件。很多教程会直接过滤掉所有单字但中文里单字不一定无意义比如“爱”、“恨”、“美”在情感分析里是核心词。我一般会先不加这个条件跑一遍看单字里有没有有价值的词再决定是否过滤。另外jieba.lcut是精确模式如果你做搜索引擎分词可以换成jieba.lcut_for_search粒度更细。3.3 与 NLTK 集成处理英文英文场景下NLTK 的word_tokenize配合停用词过滤是标准做法import nltk from nltk.tokenize import word_tokenize # 首次使用需要下载 punkt 分词模型 # nltk.download(punkt) def process_english(text, stopwords): 英文文本分词、小写化、过滤停用词。 参数 text: 原始英文文本。 参数 stopwords: 英文停用词 set。 返回: 过滤后的词列表。 # 统一转小写避免 The 和 the 被当成两个词 tokens word_tokenize(text.lower()) # 过滤停用词和非字母字符标点、数字 filtered [w for w in tokens if w not in stopwords and w.isalpha()] return filtered text The quick brown fox jumps over the lazy dog, but it doesnt care about the result. result process_english(text, en_stopwords) print(result) # 输出示例: [quick, brown, fox, jumps, lazy, dog, care, result]w.isalpha()用来过滤标点和数字但如果你做的是商品评论分析数字可能代表评分或型号这时候就要去掉这个条件。lower()是必须的英文停用词表里都是小写形式不转小写会导致 “The” 漏过滤。另外注意doesnt这种缩写NLTK 会切成does和ntdoes在停用词表里nt不在所以过滤后可能残留nt需要额外处理。3.4 自定义停用词追加与动态调整通用表不可能覆盖所有场景我一般会维护一个custom_stopwords.txt在加载时做并集def load_with_custom(base_path, custom_path): 加载基础停用词表并合并自定义停用词。 参数 base_path: 基础停用词文件路径。 参数 custom_path: 自定义停用词文件路径可为 None。 返回: 合并后的停用词 set。 stopwords load_stopwords(base_path) if custom_path: custom load_stopwords(custom_path) stopwords stopwords | custom # 集合并集 return stopwords # 示例在舆情分析场景中追加领域停用词 # custom_stopwords.txt 内容示例 # 转发 # 点赞 # 回复 # 楼主自定义表的维护策略是每次跑完关键词提取人工扫一眼 Top 50 结果把明显无意义的词追加进去。迭代两三轮之后你的停用词表就会非常贴合你的语料。这个过程听起来笨但比任何自动方法都可靠。4. 避坑与排查停用词过滤翻车的五个典型场景4.1 否定词被误过滤情感极性反转现象做情感分析时模型把“我不喜欢这个产品”判成了正面情感。原因停用词表里包含了“不”和“喜欢”中的某个词或者分词后“不”被单独切出来并被过滤导致“喜欢”单独出现极性反转。解决检查停用词表里是否包含否定词。这份资源的中文表没有收否定词但如果你自己追加了要立刻移除。另外在分词阶段可以把“不”、“没”、“无”加入 jieba 的用户词典让它们和后面的词合并成“不喜欢”、“没效果”这样的整体避免被拆开过滤。4.2 英文缩写和网络用语漏过滤现象处理社交媒体文本时结果里全是 “im”、“ur”、“dont”、“cant”。原因标准停用词表只收规范拼写不覆盖非规范拼写和网络缩写。解决在自定义停用词表里追加常见网络缩写。我一般会加这么一批im, ur, dont, cant, wont, didnt, doesnt, isnt, arent, wasnt, werent, hes, shes, theyre, youre, ive, youre, lets, thats, whats。另外可以在分词前做一次规范化替换把 “cant” 统一成 “cant” 再过滤。4.3 中文分词粒度导致停用词漏网现象停用词表里有“我们”但过滤后结果里还是出现“我们”。原因jieba 把“我们”切成了“我”和“们”而停用词表里只有“我们”没有“我”和“们”导致漏过滤。解决在停用词表里同时收录“我”、“你”、“他”、“她”、“它”、“们”以及它们的组合形式。或者用 jieba 的add_word把“我们”强制合并成一个词。我一般两种方法都用双保险。4.4 大小写和全半角不一致现象英文停用词表里有 “the”但文本里的 “The” 没被过滤中文停用词表里有“的”但全角空格包围的“的”没被过滤。原因没有做大小写归一化和全半角归一化。解决英文处理前统一lower()。中文处理前用unicodedata.normalize(NFKC, text)做全半角归一化把全角字母、数字、空格转成半角。这个步骤在爬虫抓下来的网页文本里尤其重要因为 HTML 里经常混着全角字符。4.5 停用词表过大导致有效信息丢失现象关键词提取结果里全是生僻词高频实词全不见了。原因停用词表里混入了领域实词比如“发展”、“经济”、“市场”在新闻语料里被当成停用词过滤了。解决用词频统计做一次审计。把过滤前后的 Top 100 词都打印出来对比一下看看有没有明显不该过滤的词。我一般会跑一个脚本统计每个停用词在语料中的出现频次如果某个词频次很高但你觉得它有意义就把它从停用词表里移除。停用词表的维护是一个持续迭代的过程没有一劳永逸的版本。5. 进阶技巧用词频-逆文档频率验证停用词表质量停用词表到底合不合适不能靠感觉判断得有一个量化指标。我常用的方法是用 TF-IDF 跑一遍关键词提取看 Top 20 结果里还有没有明显的停用词残留以及有没有把重要实体词误杀。具体操作分三步。第一步准备一个至少 100 篇文档的语料集每篇文档做分词和停用词过滤。第二步用 scikit-learn 的TfidfVectorizer计算 TF-IDF 矩阵注意stop_words参数直接传你的停用词列表。第三步对每篇文档取 TF-IDF 值最高的 10 个词人工检查。from sklearn.feature_extraction.text import TfidfVectorizer # 假设 corpus 是已经分好词并用空格拼接的文档列表 # 例如: [文本 分析 关键词 提取, 情感 分析 模型 训练, ...] corpus [ 文本 分析 关键词 提取 准确率, 情感 分析 模型 训练 数据, 关键词 提取 停用词 过滤 效果, 模型 训练 数据 清洗 预处理, ] # 注意这里 stop_words 传英文用 english传中文需要传列表 # 如果你的停用词表是中文的先转成列表 vectorizer TfidfVectorizer( stop_wordslist(zh_stopwords), # 传入停用词列表 max_features1000, # 限制特征数量防止矩阵过大 ngram_range(1, 2), # 考虑一元和二元词组 min_df1, # 至少出现在 1 篇文档中 max_df0.95 # 忽略出现在 95% 以上文档中的词 ) tfidf_matrix vectorizer.fit_transform(corpus) feature_names vectorizer.get_feature_names_out() # 打印每篇文档的 Top 5 关键词 for i, doc in enumerate(corpus): scores tfidf_matrix[i].toarray().flatten() top_indices scores.argsort()[-5:][::-1] top_words [(feature_names[j], round(scores[j], 3)) for j in top_indices if scores[j] 0] print(f文档 {i1}: {top_words})参数说明max_df0.95这个参数很关键它会自动忽略出现在 95% 以上文档中的词相当于一个动态停用词过滤器。如果你的停用词表漏掉了某个高频词max_df可以兜底。ngram_range(1, 2)会把二元词组也纳入统计有时候“文本分析”作为一个整体比“文本”和“分析”分开更有意义。min_df1在文档量少的时候用文档量大的时候可以调到 2 或 3过滤掉只出现一次的低频噪声。跑完这个流程后重点看两个指标一是 Top 关键词里还有没有“的”、“了”、“我们”这种词如果有说明停用词表有漏网之鱼二是看有没有“发展”、“经济”这种词被误杀如果有说明停用词表收得太宽。根据结果做一轮增删再跑一遍通常两三轮就能把表调到比较贴合语料的状态。从那以后我每次拿到新的语料集都会先跑一遍 TF-IDF 审计把停用词表过一遍再进入正式任务。这个习惯帮我省下了大量调模型的时间——很多时候模型效果不好根因就在预处理这一步。希望这份停用词表和这套验证方法能帮到你。本文还有配套的精品资源点击获取