机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例
为了简单直观的理解模型训练,我这里搜集了两个简单的实现文本情感分类的例子,第一个例子基于朴素贝叶斯分类器,第二个例子基于逻辑回归,通过这两个例子,掌握词袋模型(Bag of Words)实现文本情感分类的基本原理,加深对机器学习的理解。
示例一
一、任务目标
使用词袋模型(BoW),将文本转化为数值向量,训练一个情感分类模型,判断句子是“积极”还是“消极”。
二、示例数据集
假设我们有以下4条标注好的训练数据:
1. "这个电影太棒了!" → 积极
2. "剧情糟糕,浪费时间。" → 消极
3. "演员演技非常好,推荐!" → 积极
4. "特效差,不建议观看。" → 消极
三、实现原理
词袋模型的核心思想:
将文本看作一个“装满单词的袋子”,忽略词序和语法,只统计每个单词出现的次数。
四、实现步骤
1. 文本预处理
-
分词:将句子拆分为单词(中文需分词工具,英文按空格拆分)。
-
去除停用词:过滤无意义的词(如“的”、“了”、“,”)。
-
统一小写:英文需统一为小写,中文无需此步骤。
1. ["电影", "太棒"]
2. ["剧情", "糟糕", "浪费", "时间"]
3. ["演员", "演技", "非常", "好", "推荐"]
4. ["特效", "差", "建议", "观看"]
2. 构建词袋(词汇表)
收集所有训练数据中的唯一单词,构建词汇表:
词汇表 = ["电影", "太棒", "剧情", "糟糕", "浪费", "时间",
"演员", "演技", "非常", "好", "推荐", "特效", "差", "建议", "观看"]
3. 文本向量化
将每个句子转换为一个向量,表示词汇表中每个单词的出现次数。
示例向量化结果:
1. "电影太棒" → [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2. "剧情糟糕浪费时间" → [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
3. "演员演技非常好推荐" → [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0]
4. "特效差建议观看" → [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
4. 训练分类模型
使用朴素贝叶斯分类器(适合文本分类)进行训练:

5. 使用模型预测新句子
示例输入:"特效很棒但演员差"
步骤:
-
预处理:分词 → ["特效", "很棒", "演员", "差"]
-
向量化:根据词汇表生成向量:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
(词汇表中"特效"=位置11,"演员"=位置6,"差"=位置12,其他词未出现)
3.预测:

五、通俗解释
-
词袋模型:像把句子里的单词倒进一个袋子,只数每个单词出现的次数,不管顺序。
-
训练过程:模型通过统计哪些词常出现在“积极”句,哪些词常出现在“消极”句,学习判断规律。
-
预测过程:新句子被拆解为单词后,模型根据学到的规律,计算属于“积极”或“消极”的概率。
六、完整代码示例(Python)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# 训练数据
sentences = [
"这个电影太棒了!",
"剧情糟糕,浪费时间。",
"演员演技非常好,推荐!",
"特效差,不建议观看。"
]
labels = [1, 0, 1, 0] # 1=积极,0=消极
# 1. 文本向量化(自动处理分词和停用词需中文分词工具,此处简化手动处理)
# 手动定义词袋向量(实际应使用CountVectorizer)
X_train = [
[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], # 电影太棒
[0,0,1,1,1,1,0,0,0,0,0,0,0,0,0], # 剧情糟糕浪费时间
[0,0,0,0,0,0,1,1,1,1,1,0,0,0,0], # 演员演技非常好推荐
[0,0,0,0,0,0,0,0,0,0,0,1,1,1,1] # 特效差建议观看
]
# 2. 训练模型
model = MultinomialNB()
model.fit(X_train, labels)
# 3. 预测新句子
new_sentence = "特效很棒但演员差"
# 手动向量化(实际需自动分词和映射)
new_vector = [0,0,0,0,0,0,0,0,0,0,0,1,1,0,0] # 特效、演员、差
prediction = model.predict([new_vector])
print("预测结果:", "积极" if prediction[0] == 1 else "消极") # 输出:消极
七、总结
-
词袋模型优点:简单易实现,适合小规模数据。
-
缺点:忽略词序和语义(如“好不”和“不好”会被视为相同)。
-
进阶方向:TF-IDF、N-gram、词嵌入(Word2Vec)等更复杂的文本表示方法。
示例二
词袋模型(BoW)是一种将文本转化为数值表示的常见方法,用于文本分类任务。首先,我们从一组文本中提取词汇,例如,句子“我喜欢读书”和“我讨厌读书”,得到词汇表:“我”、“喜欢”、“读书”、“讨厌”。接着,将每个句子转化为向量,每个维度对应一个词,表示该词在句子中是否出现或出现的频率。接下来,我们可以使用逻辑回归等分类器训练模型,最后用训练好的模型来预测新文本的情感。
一、基本原理
词袋模型的思想:
词袋模型将文本看作一个“词袋”,忽略单词之间的顺序,只关注每个单词出现的频率。这样,每篇文本就可以表示为一个向量,向量的每个维度对应一个词汇表中的词,其值为该词在文本中出现的次数(或经过其他处理后的权重,如TF-IDF)。
情感分类任务:
在情感分类任务中,我们希望根据文本的内容判断其情感倾向(例如正面或负面)。利用词袋模型,将文本转化为数值特征后,可以用常见的监督学习算法(如逻辑回归、朴素贝叶斯、支持向量机等)进行分类。
二、具体例子
假设我们有下面两个简单的训练文本,每个文本都有标注的情感标签:
- 文本1:"我 喜欢 读书" —— 正面情感
- 文本2:"我 讨厌 读书" —— 负面情感
1. 构建词汇表
首先,从训练数据中提取所有出现的词语。对于这两个文本,提取到的词汇有:
- "我"
- "喜欢"
- "讨厌"
- "读书"
因此,我们可以构建词汇表(Vocabulary)为:
Vocabulary={"我","喜欢","讨厌","读书"}
2. 文本向量化
接下来,将每个文本转换为向量,每个向量的维度对应词汇表中的一个词,值为该词出现的次数。
-
文本1:"我 喜欢 读书"
- “我”出现1次
- “喜欢”出现1次
- “讨厌”出现0次
- “读书”出现1次
得到向量:
-
文本2:"我 讨厌 读书"
- “我”出现1次
- “喜欢”出现0次
- “讨厌”出现1次
- “读书”出现1次
得到向量:
这些向量就是文本的数值化表示,它们捕获了文本中各单词的出现情况。
3. 训练分类模型
利用上述向量作为输入特征,并结合相应的情感标签(例如正面情感标记为1,负面情感标记为0),我们可以训练一个简单的分类模型。这里以逻辑回归为例:
训练步骤:
-
准备数据:
将训练样本构建成特征矩阵 X 和标签向量 y:
其中第一行对应“我 喜欢 读书”(正面),第二行对应“我 讨厌 读书”(负面)。
-
模型建立:
逻辑回归模型假设预测概率为:
其中,w 是权重向量,b 是偏置项。
-
训练过程:
采用梯度下降等优化方法,调整 w 和 b 使得模型在训练数据上损失函数(例如交叉熵损失)最小。 -
模型评估:
利用训练数据或独立的验证集,计算模型的预测准确率,调整超参数以获得更好的效果。
4. 模型使用
假设训练完成后,我们得到了最优参数 w^* 和 b^*。
如何使用训练好的模型:
-
新文本的向量化:
对于一个新文本,如“我 喜欢 电影”,首先根据之前的词汇表进行向量化:- 假设词汇表仍为 {"我","喜欢","讨厌","读书"}
- “我”出现1次,“喜欢”出现1次,“讨厌”出现0次,“读书”出现0次,因此向量为:

注意:新文本中的“电影”不在词汇表中,因此在简单词袋模型中会被忽略(这也是词袋模型的一个局限)。
-
预测:
将新文本的向量 vnew 代入逻辑回归模型,计算:
然后通过 sigmoid 函数转换为概率:

如果该概率大于某个阈值(例如0.5),则模型预测文本为正面情感;否则预测为负面情感。
总结
-
原理:
词袋模型将文本转换为不考虑词序的词频向量,通过这些向量来捕捉文本的内容信息。 -
过程:
- 构建词汇表
- 将文本向量化
- 利用标注数据训练分类模型(例如逻辑回归)
- 评估和调整模型
-
使用:
训练好的模型可用于对新文本进行向量化和情感预测,进而进行分类任务。
这种方法虽然简单,但能有效展示如何从原始文本到数值表示,再到利用机器学习模型进行情感分类的全过程。
相关文章:
机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例
为了简单直观的理解模型训练,我这里搜集了两个简单的实现文本情感分类的例子,第一个例子基于朴素贝叶斯分类器,第二个例子基于逻辑回归,通过这两个例子,掌握词袋模型(Bag of Words)实现文本情感…...
Kimi k1.5: Scaling Reinforcement Learning with LLMs
TL;DR 2025 年 kimi 发表的 k1.5 模型技术报告,和 DeepSeek R1 同一天发布,虽然精度上和 R1 有微小差距,但是文章提出的 RL 路线也有很强的参考意义 Paper name Kimi k1.5: Scaling Reinforcement Learning with LLMs Paper Reading Note…...
如何评估云原生GenAI应用开发中的安全风险(下)
以上就是如何评估云原生GenAI应用开发中的安全风险系列中的上篇内容,在本篇中我们介绍了在云原生AI应用开发中不同层级的风险,并了解了如何定义AI系统的风险。在本系列下篇中我们会继续探索我们为我们的云原生AI应用评估风险的背景和意义,并且…...
ASP.NET Core程序的部署
发布 不能直接把bin/Debug部署到生产环境的服务器上,性能低。应该创建网站的发布版,用【发布】功能。两种部署模式:“框架依赖”和“独立”。独立模式选择目标操作系统和CPU类型。Windows、Linux、iOS;关于龙芯。 网站的运行 在…...
《深度LSTM vs 普通LSTM:训练与效果的深度剖析》
在深度学习领域,长短期记忆网络(LSTM)以其出色的处理序列数据能力而备受瞩目。而深度LSTM作为LSTM的扩展形式,与普通LSTM在训练和效果上存在着一些显著的不同。 训练方面 参数数量与计算量:普通LSTM通常只有一层或较少…...
Spring依赖注入方式
写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...
Photoshop自定义键盘快捷键
编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…...
解决VsCode的 Vetur 插件has no default export Vetur问题
文章目录 前言1.问题2. 原因3. 解决其他 前言 提示: 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…...
关于浏览器缓存的思考
问题情境 开发中要实现一个非原生pdf预览功能,pdf链接放在一个固定的后台地址,当重新上传pdf后,预览pdf仍然是上一次的pdf内容,没有更新为最新的内容。 查看接口返回状态码为 200 OK(from disk cache), 表示此次pdf返回…...
Vue3+element-plus表单重置resetFields方法失效问题
遇到的其中一种情况: bug:在当前页面直接筛选重置,重置方法生效;但先筛选,再切换别的页面,再切回原页面重置,重置无效(keep-alive的页面无此bug) 原因: 1.Vue…...
解释和对比“application/octet-stream“与“application/x-protobuf“
介绍 在现代 Web 和分布式系统的开发中,数据的传输和交换格式扮演着关键角色。为了确保数据在不同系统之间的传输过程中保持一致性,MIME 类型(Multipurpose Internet Mail Extensions)被广泛应用于描述数据的格式和内容类型。在 …...
1158:求1+2+3+...
【题目描述】 用递归的方法求123……N123……N的值。 【输入】 输入N。 【输出】 输出和。 【输入样例】 5 【输出样例】 15 【解题思路】 递归 递归问题:求12…k的和递归关系:如果想求12…k的和,需要先求12…k-1的和,再加上…...
前端实现在PDF上添加标注(1)
前段时间接到一个需求,用户希望网页上预览PDF,同时能在PDF上添加文字,划线,箭头和用矩形框选的标注,另外还需要对已有的标注进行修改,删除。 期初在互联网上一通搜索,对这个需求来讲发现了两个问…...
螺旋矩阵 II
螺旋矩阵 II 一、题目描述 给定一个正整数 n,请你生成一个包含 1 到 n^2 所有元素的 n x n 正方形矩阵,元素顺序按顺时针的方式进行螺旋排列。 示例 1:输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:…...
【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...
【linux学习指南】模拟线程封装与智能指针shared_ptr
文章目录 📝线程封装🌉 Thread.hpp🌉 Makefile 🌠线程封装第一版🌉 Makefile:🌉Main.cc🌉 Thread.hpp: 🌠线程封装第二版🌉 Thread.hpp:🌉 Main.cc …...
10、Python面试题解析:解释reduce函数的工作原理
reduce 是 Python 中的一个高阶函数,位于 functools 模块中。它的作用是将一个可迭代对象(如列表、元组等)中的元素依次通过一个二元函数(即接受两个参数的函数)进行累积计算,最终返回一个单一的结果。 1.…...
【含开题报告+文档+PPT+源码】学术研究合作与科研项目管理应用的J2EE实施
开题报告 本研究构建了一套集注册登录、信息获取与科研项目管理于一体的综合型学术研究合作平台。系统用户通过注册登录后,能够便捷地接收到最新的系统公告和科研动态新闻,并能进一步点击查看详尽的新闻内容。在科研项目管理方面,系统提供强…...
MySQL主从复制过程,延迟高,解决应对策略
MySQL主从复制延迟高是常见的性能问题,通常由主库写入压力大、从库处理能力不足或配置不当导致。以下从原因定位、优化策略和高级解决方案三个维度提供系统性解决方法: 一、快速定位延迟原因 1. 查看主从同步状态 SHOW SLAVE STATUS\G关键字段…...
Deepseek模拟阿里面试——数据库
在模拟阿里面试时,数据库部分需要涵盖广泛的知识点,包括基础概念、事务管理、索引优化、数据库设计、高并发处理、分布式数据库等。以下是对这些问题的详细分析和解答: 事务的ACID特性是什么,如何保证? ACID特性&…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
在ubuntu等linux系统上申请https证书
使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具,支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上: sudo apt update sudo apt install certbot申请证书 纯手动方式(不自动配置)&…...
本地部署drawDB结合内网穿透技术实现数据库远程管控方案
文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下,数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统,还是初创…...
