36 Python 时序和文本:中文文本处理入门:为什么要先做分词和停用词过滤?

news2026/3/27 0:09:21
中文文本处理入门为什么要先做分词和停用词过滤刚接触文本分析时很多人都会有一个疑问文本明明已经有内容了为什么不能直接拿去做分类、聚类或者情感分析这个问题其实正好指向了文本挖掘里最基础、也最关键的一步文本预处理。文本挖掘通常包括文本预处理、文本挖掘和模式评估与表示三个主要过程 。如果预处理没有做好后面的分析效果往往会受到明显影响。这篇文章主要回答两个问题为什么中文文本通常要先分词为什么分词之后还要做停用词过滤下面就从这两个问题开始。一、为什么文本不能直接分析从人的角度看一段文本的意思通常很容易理解。比如下面几条评论这个电影真的很好看我很喜欢剧情太拖沓了不推荐演员表现不错但是节奏一般画面很棒音乐也很好听人很容易看出它们在表达什么但计算机并不能直接做到这一点。因为对计算机来说原始文本最开始只是一串字符它并不知道哪些字应该组合成一个词哪些词更重要哪些词只是语气词或结构词哪些词真正能帮助区分文本内容而文本挖掘的目标是从大量文本数据中抽取未知但有用的知识。由于文本数据具有模糊性、非结构化等特点所以文本挖掘本身就是一项相对复杂的工作 。这也是为什么文本不能直接“原样进入模型”而需要先经过预处理。二、文本预处理在做什么文本预处理的作用可以简单理解为先把原始文本整理成计算机更容易处理的形式。在文本挖掘流程中文本预处理的任务是选取与任务相关的文本并将其转化成文本挖掘工具可以处理的中间形式 。对于中文文本来说这里面最基础的两步通常就是分词停用词过滤这两步看起来简单但后面的很多工作都建立在它们之上。三、为什么中文文本通常要先分词这个问题和中文本身的表达方式有关。英文文本通常有空格例如This movie is very good至少可以先按空格切开。但中文通常是连续书写的例如这个电影真的很好看我很喜欢对计算机来说它并不知道应该切成这个 / 电影 / 真的 / 很 / 好看 / 我 / 很 / 喜欢还是别的形式。在中文文本处理中一般认为词语是最小的语义单元。一句话可以由多个词语组成而词语又可以由一个或多个汉字组成。因此在进行文本分类等任务之前首先要把文本切分成计算机可以处理的语义单元 。也正因为如此和英文相比中文文本预处理更重要也更复杂。四、什么是分词分词就是把连续的中文文本切分成一个个词语。比如下面这句话这个电影真的很好看我很喜欢分词之后可能会得到这样的结果这个 / 电影 / 真的 / 很 / 好看 / 我 / 很 / 喜欢分词的意义在于把整句文本拆成更小的语义单元为后续的统计分析提供基础为特征提取和建模做准备如果不先分词后续很多文本分析工作很难展开。五、分词之后为什么还不够分词做完之后文本确实从“句子”变成了“词语集合”但这还不等于已经可以直接做分析。原因在于词出现得多并不等于它就更有价值。在你提供的课件中也提到文本中的词并不是出现频率越高代表性就越强 。例如下面这些词的了啊唉它们可能在很多文本里都频繁出现但对于表达主题帮助很小。这些词既不能很好地区分不同文本也很难帮助模型判断文本内容。所以分词之后还需要继续做一步处理停用词过滤。六、什么是停用词如果一个词在文档中出现得很频繁但并不能帮助表达主题比如“的”“啊”“唉”这类词那么这些词对区分文档是没有意义的这类词就叫做停用词Stop Word。停用词通常有几个特点出现频率高信息量低对文本分类、聚类、关键词提取等任务帮助不大因此通常需要把这些词从原始文本中去掉这个过程就叫做停用词过滤。七、为什么要做停用词过滤停用词过滤的目的核心上是为了减少噪声让文本中更有价值的信息更容易保留下来。可以从几个角度来理解。1. 停用词会干扰统计结果如果不做过滤词频统计里排在前面的往往会是“的”“了”“我”“也”这一类词。这些词虽然常见但通常不能代表文本主题。2. 停用词会降低区分度如果我们要判断一段文本是正面评价还是负面评价那么像“的”“了”这种词在两类文本里都可能大量出现它们并不能帮助分类。3. 停用词会影响后续特征提取后面做词袋模型、TF-IDF 或文本分类时如果保留了太多停用词就会引入很多低价值特征影响分析效果 。所以停用词过滤并不是“可有可无的小优化”而是文本预处理中很常见、也很必要的一步 。八、停用词一般怎么过滤常见有两种方式。方法 1按词频比例过滤统计每个词在整个文档集中的出现情况如果某个词出现得过于频繁比如超过文档总量的一定比例例如 80%就把它视为停用词 。这种方法的特点是可以结合当前语料自动判断高频词但阈值设置有一定经验性也可能误删一些高频但其实有用的词方法 2使用停用词表另一种更常见的方法是提前准备一个停用词表凡是出现在表里的词都过滤掉 。常见停用词表包括哈工大停用词表四川大学机器学习智能实验室停用词库百度停用词表对于入门练习和一般课程实验来说通常直接使用停用词表会更方便。九、代码演示中文分词与停用词过滤下面用一个简单示例把“分词 停用词过滤”的流程完整跑一遍。十、准备示例文本先准备几条电影评论文本texts[这个电影真的很好看我很喜欢演员演技也不错。,剧情太拖沓了看得我想睡觉不推荐。,画面非常漂亮但是故事比较一般。,音乐很好听节奏也不错整体体验很好。,这部电影太无聊了浪费时间。]十一、安装并导入依赖库如果本地还没有安装jieba先执行pipinstalljieba然后导入importjiebafromcollectionsimportCounter十二、第一步对文本进行分词texts[这个电影真的很好看我很喜欢演员演技也不错。,剧情太拖沓了看得我想睡觉不推荐。,画面非常漂亮但是故事比较一般。,音乐很好听节奏也不错整体体验很好。,这部电影太无聊了浪费时间。]segmented_texts[]fortextintexts:wordsjieba.lcut(text)segmented_texts.append(words)fori,wordsinenumerate(segmented_texts,1):print(f文本{i}分词结果{words})运行后不同环境下分词结果可能略有差异但大体上会得到一组词语序列。十三、第二步准备停用词表为了方便演示这里手工定义一个小型停用词表。实际项目中也可以换成外部停用词文件。stopwords{的,了,我,也,很,太,这部,这个,,。,,,是,在,不,得,看得}这里要提醒一点停用词表不是绝对固定的。比如做情感分析时“不”有时就很重要不一定适合直接删除。十四、第三步进行停用词过滤filtered_texts[]forwordsinsegmented_texts:filtered_words[wordforwordinwordsifwordnotinstopwordsandword.strip()]filtered_texts.append(filtered_words)fori,wordsinenumerate(filtered_texts,1):print(f文本{i}过滤后结果{words})过滤之后保留下来的词通常会更接近文本真正想表达的内容。十五、过滤前后做一个对比把原文本、分词结果和过滤后结果放在一起看会更直观。foriinrange(len(texts)):print(f\n 文本{i1})print(原文本,texts[i])print(分词结果,segmented_texts[i])print(过滤后,filtered_texts[i])你会看到过滤后留下来的词往往更有分析价值比如电影好看喜欢演员演技剧情拖沓睡觉推荐音乐无聊浪费时间相比之下“的、了、我、很”这类词就没有那么重要。十六、统计高频词看看过滤效果为了更直观地看到停用词过滤的作用可以分别统计过滤前和过滤后的高频词。1. 统计过滤前高频词all_words_before[]forwordsinsegmented_texts:all_words_before.extend([wforwinwordsifw.strip()])counter_beforeCounter(all_words_before)print( 过滤前高频词 )forword,countincounter_before.most_common(15):print(f{word}:{count})2. 统计过滤后高频词all_words_after[]forwordsinfiltered_texts:all_words_after.extend(words)counter_afterCounter(all_words_after)print(\n 过滤后高频词 )forword,countincounter_after.most_common(15):print(f{word}:{count})一般情况下过滤前高频词里会出现很多标点和功能词过滤之后留下来的词会更接近文本主题。这也正好说明了一个很重要的结论词频高不代表词就更有代表性。十七、完整可运行代码下面是一份可以直接复制运行的完整代码。importjiebafromcollectionsimportCounter# 1. 原始文本texts[这个电影真的很好看我很喜欢演员演技也不错。,剧情太拖沓了看得我想睡觉不推荐。,画面非常漂亮但是故事比较一般。,音乐很好听节奏也不错整体体验很好。,这部电影太无聊了浪费时间。]# 2. 停用词表演示版stopwords{的,了,我,也,很,太,这部,这个,,。,,,是,在,不,得,看得}# 3. 分词segmented_texts[]fortextintexts:wordsjieba.lcut(text)segmented_texts.append(words)# 4. 停用词过滤filtered_texts[]forwordsinsegmented_texts:filtered_words[wordforwordinwordsifwordnotinstopwordsandword.strip()]filtered_texts.append(filtered_words)# 5. 输出对比结果foriinrange(len(texts)):print(f\n 文本{i1})print(原文本,texts[i])print(分词结果,segmented_texts[i])print(过滤后,filtered_texts[i])# 6. 统计过滤前高频词all_words_before[]forwordsinsegmented_texts:all_words_before.extend([wforwinwordsifw.strip()])counter_beforeCounter(all_words_before)print(\n 过滤前高频词 )forword,countincounter_before.most_common(15):print(f{word}:{count})# 7. 统计过滤后高频词all_words_after[]forwordsinfiltered_texts:all_words_after.extend(words)counter_afterCounter(all_words_after)print(\n 过滤后高频词 )forword,countincounter_after.most_common(15):print(f{word}:{count})输出Building prefix dict from the default dictionary ... Loading model from cache C:\Users\35979\AppData\Local\Temp\jieba.cache Loading model cost 0.603 seconds. Prefix dict has been built successfully. 文本1 原文本 这个电影真的很好看我很喜欢演员演技也不错。 分词结果 [这个, 电影, 真的, 很, 好看, , 我, 很, 喜欢, , 演员, 演技, 也, 不错, 。] 过滤后 [电影, 真的, 好看, 喜欢, 演员, 演技, 不错] 文本2 原文本 剧情太拖沓了看得我想睡觉不推荐。 分词结果 [剧情, 太, 拖沓, 了, , 看得, 我, 想, 睡觉, , 不, 推荐, 。] 过滤后 [剧情, 拖沓, 想, 睡觉, 推荐] 文本3 原文本 画面非常漂亮但是故事比较一般。 分词结果 [画面, 非常, 漂亮, , 但是, 故事, 比较, 一般, 。] 过滤后 [画面, 非常, 漂亮, 但是, 故事, 比较, 一般] 文本4 原文本 音乐很好听节奏也不错整体体验很好。 分词结果 [音乐, 很, 好听, , 节奏, 也, 不错, , 整体, 体验, 很, 好, 。] 过滤后 [音乐, 好听, 节奏, 不错, 整体, 体验, 好] 文本5 原文本 这部电影太无聊了浪费时间。 分词结果 [这部, 电影, 太, 无聊, 了, , 浪费时间, 。] 过滤后 [电影, 无聊, 浪费时间] 过滤前高频词 : 8 。: 5 很: 4 电影: 2 我: 2 也: 2 不错: 2 太: 2 了: 2 这个: 1 真的: 1 好看: 1 喜欢: 1 演员: 1 演技: 1 过滤后高频词 电影: 2 不错: 2 真的: 1 好看: 1 喜欢: 1 演员: 1 演技: 1 剧情: 1 拖沓: 1 想: 1 睡觉: 1 推荐: 1 画面: 1 非常: 1 漂亮: 1十八、如果要读取外部停用词表如果你已经准备好了stopwords.txt文件也可以这样写importjieba# 读取停用词表withopen(stopwords.txt,r,encodingutf-8)asf:stopwordsset(line.strip()forlineinf)text这个电影真的很好看我很喜欢演员演技也不错。wordsjieba.lcut(text)filtered_words[wordforwordinwordsifwordnotinstopwordsandword.strip()]print(分词结果,words)print(过滤结果,filtered_words)这种方式更适合后续扩展到更大的文本集。十九、几个容易忽略的问题1. 词频高不一定就重要这是文本处理中很常见的误区。出现得多只能说明它常见不代表它真的有区分能力 。2. 停用词表不是固定不变的不同任务中停用词可能不同。某些词在一个任务里没用在另一个任务里可能很重要。3. 分词不是文本预处理的全部分词和停用词过滤只是开始。后面通常还会继续做文本表征比如词袋模型或 TF-IDF把词变成算法可以处理的数值形式 。二十、课后思考可以试着想一想下面几个问题如果我要做“好评 / 差评”分类停用词表能不能直接照搬“不”这个词在情感分析中到底该不该删如果文本换成新闻标题而不是电影评论停用词会不会发生变化如果完全不做停用词过滤后面的特征提取会受到什么影响二十一、小结这篇文章主要讲了两件事。第一为什么中文文本通常要先分词。因为中文没有天然空格而词语通常被看作最小语义单元所以分词是文本处理的基础 。第二为什么分词之后还要做停用词过滤。因为文本中的词并不是出现频率越高就越重要那些高频但对表达主题帮助不大的词需要在预处理阶段先过滤掉 。可以把这一步简单理解成分词把文本拆开停用词过滤把噪声去掉这两步处理之后文本才更适合进入后续的特征提取和建模流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…