机器学习 - 词袋模型(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)实现文本情感…...
自制游戏——斗罗大陆
很简陋,没有图,请见谅 // mine[0] 级数 // mine[1] 战力 //mine[2] 1 白虎 //mine[2] 2 昊天锤 //mine[2] 3 蓝银草 #include <bits/stdc.h> using namespace std; int mine[100],live3, dou 1, luo 1, da 1, bag[1000], huan 0, lia…...
【Android开发】Android Studio汉化
前言 该插件是官方支持插件,未对任何软件进行修改和破解 Android Studio 是基于 IntelliJ IDEA 社区版开发的集成开发环境(IDE),专门用于Android应用程序的开发。以下是为什么 Android Studio 能使用 IntelliJ IDEA 插件的原因&am…...
PRC框架-Dubbo
RPC框架 RPC(Remote Procedure Call,远程过程调用)框架是一种允许客户端通过网络调用服务器端程序的技术。以下是常见的RPC框架及其特点: 1. 基于HTTP/REST的RPC框架 特点:简单易用,与Web开发无缝集成&am…...
冒泡排序
目录 冒泡排序: 代码实现: 思路分析: 冒泡排序优化: 冒泡排序(稳定): 想要数据从小到大排序。 代码实现: public static void bubbleSort(int[] arr) {//趟数for (int i 0; i < arr.length - 1; i) {…...
单例模式几种实现
静态内部类holder实现(推荐) public class UniqueIdGenerator {public static final UniqueIdGenerator INSTANCE Holder.INSTANCE;// Private holder class for lazy initializationprivate static class Holder {static final UniqueIdGenerator INS…...
XZ_Mac电脑上本地化部署DeepSeek的详细步骤
根据您的需求,以下是Mac电脑上本地化部署DeepSeek的详细步骤: 一、下载并安装Ollama 访问Ollama官网: 打开浏览器,访问 Ollama官网。 下载Ollama: 在官网中找到并点击“Download”按钮,选择适合Mac系统的…...
如果依赖项是一个对象,useMemo 如何处理?
在使用 useMemo 时,如果依赖项是一个对象,需要特别注意,因为对象的引用在每次渲染时都会发生变化(即使对象的内容没有变化)。这可能导致 useMemo 的缓存失效,因为它会认为依赖项已改变。 处理对象依赖项的策略 使用 useMemo 创建对象: 如果你需要将对象作为依赖项,可以…...
后端java工程师经验之谈,工作7年,mysql使用心得
mysql 工作7年,mysql使用心得 mysql1.创建变量2.创建存储过程2.1:WHILE循环2.2:repeat循环2.3:loop循环2.4:存储过程,游标2.5:存储过程,有输入参数和输出参数 3.三种注释写法4.case …...
ArcGIS Pro批量创建离线服务sd包
背景: 主要针对一个工程内有多个地图框项: 处理方法:通过Python脚本处理打包。 运行环境 在Pro的Python环境中去运行编写的Python脚本。 Python 脚本参考 import arcpy import os# Set output file names outdir r"d:\data\out&…...
Spring中都应用了哪些设计模式?
好的!以下是您提到的八种设计模式在 Spring 中的简单示例: 1. 简单工厂模式 简单工厂模式通过传入参数来决定实例化哪个类。Spring 中的 BeanFactory 就是简单工厂模式的应用。 示例代码: // 1. 创建接口和具体实现类 public interface A…...
qt 事件的传递顺序
在 Qt 中,事件的传递顺序遵循以下基本规则: 事件的产生:当用户与界面交互时,操作(如鼠标点击、键盘输入等)会生成相应的事件(如 QMouseEvent、QKeyEvent 等)。 事件的传递顺序&…...
深度学习-医学影像诊断
以下以使用深度学习进行医学影像(如 X 光片)的肺炎诊断为例,为你展示基于 PyTorch 框架的代码实现。我们将构建一个简单的卷积神经网络(CNN)模型,使用公开的肺炎 X 光影像数据集进行训练和评估。 1. 安装必…...
Flutter PIP 插件 ---- Android
在 Flutter Android 应用中实现画中画功能 画中画(Picture-in-Picture, PiP)模式允许您的应用在一个固定在屏幕角落的小窗口中运行,同时用户可以与其他应用进行交互。本指南将介绍如何在 Flutter Android 应用中实现画中画功能,包括其局限性和解决方案。 项目地址 flutter_p…...
基于DeepSeek API和VSCode的自动化网页生成流程
1.创建API key 访问官网DeepSeek ,点击API开放平台。 在开放平台界面左侧点击API keys,进入API keys管理界面,点击创建API key按钮创建API key,名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…...
结合实际讲NR系列2—— SIB1
这是在基站抓取的sib1的一条信令 L3MessageContent BCCH-DL-SCH-Messagemessagec1systemInformationBlockType1cellSelectionInfoq-RxLevMin: -64q-QualMin: -19cellAccessRelatedInfoplmn-IdentityListPLMN-IdentityInfoplmn-IdentityListPLMN-IdentitymccMCC-MNC-Digit: 4MC…...
信创领域的PostgreSQL管理员认证
信创产业,全称为信息技术应用创新产业,是中国为应对国际技术竞争、保障信息安全、实现科技自立而重点发展的战略性新兴产业。其核心目标是通过自主研发和生态构建,逐步替代国外信息技术产品,形成自主可控的国产化信息技术体系。 发…...
AI基础 -- AI学习路径图
人工智能从数学到大语言模型构建教程 第一部分:AI 基础与数学准备 1. 绪论:人工智能的过去、现在与未来 人工智能的定义与发展简史从符号主义到统计学习、再到深度学习与大模型的变迁本书内容概览与学习路径指引 2. 线性代数与矩阵运算 向量与矩阵的…...
使用 Visual Studio Code (VS Code) 开发 Python 图形界面程序
安装Python、VS Code Documentation for Visual Studio Code Python Releases for Windows | Python.org 更新pip >python.exe -m pip install --upgrade pip Requirement already satisfied: pip in c:\users\xxx\appdata\local\programs\python\python312\lib\site-pa…...
IEEE期刊Word导出PDF注意事项
在系统上提交论文时候一般要求PDF文档,但是word直接转PDF可能存在一些问题: 部分图片不清晰。字体未嵌入PDF。间距发生了变化。字体发生了变化。一张图片显示不完全。 下面介绍word转PDF最稳妥的技巧以及如何实现全部字体的嵌入。 1. 操作流程 ① 另…...
针对Prompt优化的深入分析
一、针对Prompt优化的深入分析 1. 结构化设计 技术原理: 大语言模型(LLMs)本质是基于概率的序列生成器,结构化模板通过显式定义输出框架(如角色、段落数、连接词),利用模型的模式匹配能力&…...
flutter ListView 局部刷新
在 Flutter 中,要仅刷新 ListView 中的某一列(即特定列表项),可以通过以下步骤实现: 核心思路 为每个列表项分配唯一标识(如 Key),帮助 Flutter 识别需要更新的项。 局部状态管理&a…...
如何在 Elasticsearch 中设置向量搜索 - 第二部分
作者:来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇,深入探讨了向量搜索(也称为语义搜索)的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…...
DeepSeek的出现会对百度有多大影响?
当DeepSeek与ChatGPT等大模型接管搜索入口,我们正见证百年一遇的信息革命。 01 传统搜索已死?AI助手正在重写游戏规则! 当DeepSeek与ChatGPT等大模型接管搜索入口,我们正见证百年一遇的信息革命。 就像汽车淘汰马车、触屏终结按键…...
【C#】条件运算符
1.逻辑与(&&) Console.WriteLine(true && true);//true Console.WriteLine(true && false);//false Console.WriteLine(false && false);//false2.逻辑或(||) Console.WriteLine(true || true);//true Console.WriteLine(true || false);//t…...
单例模式详解(Java)
单例模式详解(Java) 一、引言 1.1 概述单例模式的基本概念和重要性 单例模式是一种常用的软件设计模式,它确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在资源管理、配置设置和日志记录等方面非常有用,因为它们通常只需要…...
PyQt学习记录01——加法计算器
目录 PyQt学习记录01——加法计算器 PyQt学习记录02——串口助手 0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序,然后新建一个目录用于学习,其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力,请改为国内源 pip …...
笔记:蓝桥杯python搜索(3-2)——DFS剪支和记忆化搜索
目录 一、DFS剪支 二、例题 P2942 数字王国之军训军队 P3075 特殊的多边形 三、记忆化搜索 四、例题 例题 P3820 混境之地 P216 地宫取宝 一、DFS剪支 在搜索过程中,如果需要完全遍历所有情况可能需要很多时间在搜索到某种状态时,根据当前状态判断…...
k8s启空容器用于排查问题
如果 Pod 一会儿就销毁了,可能是由于 Pod 配置、节点状态或容器运行时问题导致的。 此时想进容器排查,但是pod一会儿就销毁了,不利于排查。 为了排查问题,可以启动一个空容器来临时保留 Pod,进而进入 Pod 内部进行调…...
jenkins备份还原配置文件
下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意:有时可能因为网络或者版本问题下载不了,好像是默认下载最新版本,可选择手动安装! 方式二 手动安装插件 点击查看手…...
