简介:哈工大停用词表是自然语言处理中文分词任务中常用的基础资源,适合从事文本挖掘、信息检索、情感分析等工作的开发者与研究人员使用。该表整理了一批在中文文本中出现频繁但语义贡献较低的词汇,如语气词、助词、标点符号及常见虚词等,在分词前进行停用词过滤,可减少噪声干扰、提升后续处理效率。资源包内含1个doc文档,约39KB,文档内以词条列表形式呈现,可直接打开查阅或复制到项目中应用。目前已有3261人学习下载,是中文NLP入门和工程实践中的实用工具。配合哈工大LTP等分词工具使用时,能更充分发挥其在词法分析、句法分析等任务中的基础支撑作用。
1. 停用词表是什么:先把它想成淘米时的筛子
煮饭之前,很少有人直接抓一把带糠带壳的米下锅,总要先淘一淘、筛一筛,把沙粒和瘪谷挑出去。停用词表干的就是这个活儿:在让计算机读懂中文之前,先把那些出现频率极高、却不携带多少实际含义的词和符号筛掉。“的、了、是、在”、逗号句号、圆圈数字,都属于这类“沙粒”。它本质上就是一份名单,每行一个词或符号,分词之后对照名单删一遍,剩下的才是值得分析的关键内容。搞懂它,你就明白了为什么搜索引擎可以跳过“的”去匹配关键词,为什么文本分类之前要清洗语料,也就能看懂别人代码里那一行load_stopwords()到底在干什么。
2. 为什么分词要先“扔词”:噪声如何拖垮统计和模型
2.1 分词是中文NLP的第一道闸门,但闸门后全是沙
中文不像英文,单词之间有天然空格。写“今天天气不错”,人和机器都明白这是一串字,但机器需要先把这串字切成“今天 / 天气 / 不错”这样的词汇单元,这一步就是分词。某个高校团队研发的语言技术平台(圈子里常简称为 LTP)把中文分词、词性标注、命名实体识别这些能力打包成一套工具链,而分词排在所有任务最前面,原因很简单:后面的句法分析、语义角色标注,全都得踩着分词的结果往前走。
可分词切出来的东西并不都是有用的。拿一句再普通不过的话举例:“今天的天气真的很不错啊。”分词后大概是“今天 / 的 / 天气 / 真的 / 不错 / 啊”。“的”和“啊”是什么?它们语法功能很强,但单独看几乎没有语义。更麻烦的是,这类词在文本里密度极高——一篇几百字的短文,“的”出现几十次毫不稀奇。如果不管它们,直接做词频统计,排在最前面的永远是“的、了、是、在”这一串语气词和助词,真正的关键词反而被淹没。这就是为什么分词之后通常还跟着一道工序:对照停用词表,把这类词删掉。
2.2 停用词的三重干扰:检索、统计、模型都会遭殃
停用词造成的麻烦不止“看着乱”,它是实打实拖累效率的。第一重干扰体现在信息检索上。搜索引擎建索引时,如果每个文档都混进大量“的、了、是”,那么搜“今天的天气”和搜“天气”得到的匹配结果几乎没区别,用户想找的关键词被稀释了。第二重干扰体现在词频统计和词云上:一篇讲“苹果”的文章,词云里最大的字却是“的”,这画像画出来谁都不认识。第三重干扰最隐蔽,发生在机器学习的文本向量化环节。把文本转成向量时,每个词是一个特征维度,停用词对应的维度在所有样本里几乎没什么差异,模型很难从“的”身上学到任何分类信息,白白增加了参数和计算量。
打个比方,两个人描述同一个场景:A说“我今天吃了苹果”,B说“他昨天吃了香蕉”。完整的句子各有各的主语和时间词,但如果把注意力放在“苹果”和“香蕉”上,把“我、他、今天、昨天”这些低频信息或者“了”这种功能词放一边,两个句子的差异就立刻清晰了。停用词过滤要做的正是这件事:让“苹果”和“香蕉”浮出水面。
2.3 停用词表是“停止信号”,不是“黑名单”
“停用词”这个译名容易让人误会,好像这些词被判定为“坏词”,从此不许出现。英文原词 stop words 的意思更准确:处理到这个单词时,“停下,别继续分析它”。它不是一个价值观判断,而是一个效率决定——这个词太低频、太大路货,参与分析只会制造噪声。
所以翻开任何一份中文停用词表,你都会发现里面不只收“的、了、是”,标点符号、数字序号、单位甚至乱码字符都可能在名单上。这些条目唯一的共同点就是:在文本里频繁出现,但对“这段话到底在讲什么”几乎没有贡献。某高校团队在研发语言技术平台时,把多年积累的语料里这类高频无义项收拢成一张表,于是就有了那份几乎成了中文NLP默认配置的停用词表。它不是法律,而是一份经验清单,告诉你“这些位置可以刹车”。
3. 某高校停用词表里到底装了什么:一份乱码级词表的分类学
3.1 符号区:一眼看去像乱码的“硬噪声”
如果你把那份停用词表从头打开,第一眼大概会懵——开头一大串不是汉字,而是“———》)、)÷(1-”,)、=(:→℃ &”这种看起来像乱码的东西。别急着关,这正是词表最有意思的地方。它说明停用词不只是“的、了、是”这类词,还包括所有在文本清洗中应该被扔掉但经常被分词器当成独立单元切出来的符号。
全角半角混用的括号、百分号、摄氏度符号、人民币符号、箭头,这些字符在网页抓取、OCR识别、PDF转文本的过程中到处残留。分词器面对它们时,往往会当作一个“词”切出来,比如左括号单独成一个词。如果不过滤,后续的词频统计里就会混入一堆“)”“(”“——”这种条目。某高校词表把它们全部收编,等于事先告诉下游:这些符号出现就跳过。这也是很多初学者自己动手写到一半发现分词结果里一堆符号、不得不回去补一份符号过滤清单的原因。
3.2 高频虚词与代词:中文语法的“胶水”
再往下翻,就是真正像停用词的部分了:的、地、得、了、着、过、呢、吗;你、我、他、它、这、那、哪;按、按照、从、当、除了;虽然、但是、如果、因为;还有“是、有、说、来、去”这种高频动词。这些词在中文里承担着语法功能:助词连接修饰关系,介词引出时间地点,连词连接分句,代词指代前面出现过的东西。单拿出来,每一句都离不开它们,可放到整个语料里看,它们的信息量低得惊人。
英文停用词表里有 the、a、of,中文对应的就是“的、一、是”。某高校停用词表把这些词收进去,背后是一条通用规则:一个词如果出现频率极高,但在不同主题的文档里分布几乎一样,那它对区分文档主题就没什么用。这类词在文本分类、关键词抽取、主题建模里都是“胶水”一样的存在,黏合句子结构,却撑不起语义骨架。
3.3 让人意外的条目:数字序号、单位、甚至日文假名
真正让初学者看懵的,是词表里夹杂着“①②③④⑤⑥⑦⑧⑨⑩”这样的带圈数字,还有“元/吨”“%”“±”这类单位符号,甚至个别日文假名。这些是怎么混进来的?其实它们是词表在真实语料上“长”出来的结果。合同文本、论文文本、新闻报道里,带圈数字多用于列举条款,“元/吨”在物价报道中反复出现,日文假名则常出现在排版装饰里。这些条目对语义分析都没有贡献,反而会让模型去学“①”和“②”的区别——这显然没意义。
很多人误以为停用词表是人工逐条写的,其实它更像一个经验沉淀物:先把高频词筛一遍,再把跑任务时反复惹麻烦的符号和格式收进来。所以词表里出现“一.”、“数”、“元/吨”这种碎片,恰恰说明它不是纸面理论,而是在真实文本的泥里滚过一遍的工具。理解了这一点,你就知道以后自己整理停用词表时,也该从自己的语料里挖,而不是只抄别人的名单。
| 类别 | 典型条目 | 为什么收入停用词表 |
|---|---|---|
| 标点符号 | ,。!?、()—— | 分词时被切为独立单元,不携带语义 |
| 数字序号 | ①②③⑩㈧ | 多用于列举,对主题判断无贡献 |
| 单位与百分号 | 元/吨、%、℃ | 高频出现且与领域语义无关 |
| 虚词与助词 | 的、了、着、吗、吧 | 语法功能强,语义载荷低 |
| 高频动词代词 | 是、有、说、你、我、他 | 在不同文档中分布均匀,无区分度 |
| 格式残留 | 全角括号、乱码字符、日文假名 | 文本清洗不彻底时的常见垃圾 |
4. 停用词表怎么配合分词用:从加载到过滤的最短路径
4.1 一次标准的分词预处理流程
在真实项目里,停用词表很少单独工作,它总是紧紧跟在分词后面。标准流程是四步:拿到原始文本,先做基本清洗,再用分词工具切分,最后对照停用词表过滤。某高校语言技术平台这类工具通常把分词作为第一步输出,你拿到的是一个一个切好的词,然后自己决定哪些词要扔。也有人图省事,让分词环节直接忽略停用词,但更多时候大家选择先切完再过滤,因为有些词只有在完整句子里才能判断它该不该留。
这里有个很容易忽略的细节:停用词表是按“词形”匹配的。“的了”在表里,分词器把“了”切出来,一查表,命中,丢掉。但如果分词器把“吃了”切成一个整体,而词表里只有“了”,那这个“了”就漏网了。所以分词粒度会直接影响停用词过滤的效果。这也是为什么专业的NLP流程里,分词和停用词过滤的配置是放在一起调的,而不是随便哪个词表都能配哪套分词器。
4.2 一个最小可用的过滤代码
下面是用 Python 加载一份停用词表并对分词结果做过滤的最小示例,逻辑在真实项目里几乎原样可用:
# 读取停用词表:假设每行一个词或符号 stop_words = set() with open("stopwords.txt", encoding="utf-8") as f: for line in f: word = line.strip() # 去掉换行符和首尾空格 if word: # 跳过空行 stop_words.add(word) # 模拟某分词工具返回的切分结果 tokens = ["今天", "的", "天气", "真", "不错", "啊", "!"] # 过滤:只保留不在停用词表里的词 filtered = [t for t in tokens if t not in stop_words] print(filtered) # 输出:['今天', '天气', '真', '不错']代码的逻辑很直白:先把停用词表里的每个词装进一个 set 集合,因为集合的查找速度是 O(1),只需要一次遍历就能过滤整个词列表。注意strip()这一步不能省,词表文件每行末尾都有换行符,不去掉的话,“的\n”和分词结果里的“的”永远匹配不上,过滤会静默失效。if word这个判断则是为了跳过文件里可能出现的空行。
如果你用的是某高校语言技术平台这类带词性标注的工具,过滤还能更进一步:不只按词形删,还可以按词性删。比如拿到每个词的词性标注后,把语气词、叹词、拟声词整体丢弃,比一个一个往词表里填要省事得多。
4.3 改词表的血泪经验:不是往里加,而是往里“试”
直接把某高校停用词表原封不动搬进自己的项目,通常已经能解决八成问题。但剩下两成,恰恰是区分“会用”和“用得好”的地方。不同领域的最佳停用词表差别极大:做新闻分类的人可能想过滤掉“记者、报道、本报讯”;做电商评论分析的人则无论如何不能删“不、没、太”;做古文研究的人甚至根本不该用现代汉语的停用词表。
我一向的做法是:先拿完整词表跑一遍,把过滤后的结果打印出来,肉眼扫一遍,看有没有重要的词被误删了,有没有垃圾还赖着没走。有人觉得词表越大越好,往里拼命塞词,结果把“不错”这种关键情感词也塞了进去,模型直接瞎掉。词表建设更像修剪盆栽:每次只加一个词,跑一遍数据,确认删掉它真的让结果更干净,再决定留不留。这个过程很琐碎,但踩过一次坑之后,你就会老老实实做这一步。
5. 常见误区与易混概念:停用、黑名单和常用词表不是一回事
5.1 误区一:停用词表等于“我不想要的词”
易混点:有人把停用词表当成个人黑名单,凡是自己不喜欢的词、被平台屏蔽过的词,一股脑塞进去。为什么混:名字里有个“停用”,又是用来删词的,自然容易当成过滤器。怎么区分:停用词表的标准是“出现频率高 + 语义贡献低”,它删的是对大多数任务都没用的词,而不是“对某个任务有害”的词。敏感词、辱骂词、广告词该用专门的敏感词表或黑名单机制来管,混进停用词表里只会让词表越来越臃肿,还容易误删正常内容。
5.2 误区二:一份通用停用词表能走遍天下
易混点:下载一份某高校停用词表,所有语料、所有任务都套用。为什么混:很多教程为了省事,直接拿通用词表示范,看起来效果还不错。怎么区分:通用词表处理新闻、百科这类中规中矩的文本还行,一旦切到某个垂直领域就开始露馅。医疗文本里“患者、医生”出现频率极高,但它们恰恰是分类的重要依据;法律文本里“原告、被告”同理。通用词表只该是起点,正确做法是在自己的语料上统计词频,把那些频率高但跟主题八竿子打不着的词加进去。
5.3 误区三:情感分析里也照删否定词
易混点:某高校停用词表里有“不、没、无”,于是做情感分析时也一刀切。为什么混:词表白纸黑字写着这些词,大家默认它们是噪声。怎么区分:在大部分任务里否定词确实可以算噪声,但情感分析的核心就是判断褒贬,“不怎么样”“不太好”的情感极性全靠这个“不”字撑住。把“不”删了,模型看到的就是“怎么样”“太好”,情感极性直接反转,这是最常见的翻车现场。专门做情感分析时,要么保留否定词,要么把否定词和后续词打包成“不_好”这种复合特征。
5.4 误区四:停用词表等于高频词表
易混点:以为把词频统计里排前面的词抄下来就是停用词表。为什么混:两者都涉及词频,外形也像。怎么区分:高频词表是统计结果,停用词表是经过判断后的“不参与分析清单”。一个词频率高但信息量大,比如在某领域语料里反复出现的核心术语,它再高也不该进停用词表;反之,“啊、吧、呀”这类频率不低但毫无区分度的词才该进。制作停用词表要做的不是抄高频词,而是看哪些词“高频且无用”。
5.5 误区五:词表越长,过滤越彻底
易混点:默认词表越长,删掉的东西越多,结果越干净。为什么混:过滤的目的确实是把有用信息摘出来,容易让人觉得“删得多=摘得净”。怎么区分:每多塞一个词,就多一分误删风险。比如把“一”加进去,句子里“一个苹果”就变成了“个苹果”,语义信息残缺;“元/吨”这种单位在某高校词表里收着,换了财经语料它反而可能是关键特征。好词表的特征是“克制”,而不是“庞大”。每次往词表里加词之前先问一句:删掉它,对当前任务一定有益吗?
6. 什么时候该用、什么时候别硬用:一份停用词表的边界
停用词表最该登场的地方,是需要从一大片文本里提炼主题的场景。做信息检索的倒排索引时,过滤掉“的、了、是”这类词,索引体积变小,检索匹配更准;做文本分类时,去掉均匀分布的高频虚词,模型的特征空间更干净;做关键词提取和主题建模时,过滤后浮现出来的词才真正跟话题相关。此外,在大规模语料预处理阶段,提前删掉停用词能省下不少存储和计算成本。这些场景的共同特点是:任务关心的是“文本在讲什么”,而不是“这句话怎么讲”。
反过来,有些场景硬用停用词表会坏事。情感分析是头号禁区,否定词和程度副词不能乱删;古诗词和文学风格分析也不该用现代汉语的停用词表,因为“之乎者也”这类虚词恰恰承载着文风差异;处理代码、日志、商品标题这种没有完整句子结构的文本时,词表里那些“的、了”根本不会出现,用了等于白用;做新词发现或短语挖掘时,停用词往往和其他词组合成新表达,提前删掉反而会切断上下文线索。
我吃过一次大亏:做某图像处理Demo 的情感分析模块时,图省事直接套了通用停用词表,“不”和“没”全被过滤掉,结果“效果不是很好”被模型读成了正面评价,整个评测分直接崩掉。那以后我每次跑文本预处理,都会先打开词表问一句:这一轮任务里,哪些词删了会误伤?否定词保留吗?标点换成别的格式了吗?然后把答案写进实验记录。停用词表是一把很好用的筛子,但筛眼多大、哪些豆子不能筛掉,永远由你手里的具体任务说了算。希望这份梳理能帮你少踩一次坑。
本文还有配套的精品资源,点击获取