机器学习 - 词袋模型(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. 使用模型预测新句子

示例输入"特效很棒但演员差"

步骤

  1. 预处理:分词 → ["特效", "很棒", "演员", "差"]

  2. 向量化:根据词汇表生成向量:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
(词汇表中"特效"=位置11,"演员"=位置6,"差"=位置12,其他词未出现)

    3.预测

五、通俗解释

  1. 词袋模型:像把句子里的单词倒进一个袋子,只数每个单词出现的次数,不管顺序。

  2. 训练过程:模型通过统计哪些词常出现在“积极”句,哪些词常出现在“消极”句,学习判断规律。

  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. 文本1:"我 喜欢 读书" —— 正面情感
  2. 文本2:"我 讨厌 读书" —— 负面情感

1. 构建词汇表

首先,从训练数据中提取所有出现的词语。对于这两个文本,提取到的词汇有:

  • "我"
  • "喜欢"
  • "讨厌"
  • "读书"

因此,我们可以构建词汇表(Vocabulary)为:

Vocabulary={"我","喜欢","讨厌","读书"}

2. 文本向量化

接下来,将每个文本转换为向量,每个向量的维度对应词汇表中的一个词,值为该词出现的次数。

  • 文本1:"我 喜欢 读书"

    • “我”出现1次
    • “喜欢”出现1次
    • “讨厌”出现0次
    • “读书”出现1次
      得到向量:
    v1=[1, 1, 0, 1]
  • 文本2:"我 讨厌 读书"

    • “我”出现1次
    • “喜欢”出现0次
    • “讨厌”出现1次
    • “读书”出现1次
      得到向量:
    v2=[1, 0, 1, 1]

这些向量就是文本的数值化表示,它们捕获了文本中各单词的出现情况。

3. 训练分类模型

利用上述向量作为输入特征,并结合相应的情感标签(例如正面情感标记为1,负面情感标记为0),我们可以训练一个简单的分类模型。这里以逻辑回归为例:

训练步骤:
  1. 准备数据:
    将训练样本构建成特征矩阵 X 和标签向量 y:

    其中第一行对应“我 喜欢 读书”(正面),第二行对应“我 讨厌 读书”(负面)。

  2. 模型建立:
    逻辑回归模型假设预测概率为:

    其中,w 是权重向量,b 是偏置项。

  3. 训练过程:
    采用梯度下降等优化方法,调整 w 和 b 使得模型在训练数据上损失函数(例如交叉熵损失)最小。

  4. 模型评估:
    利用训练数据或独立的验证集,计算模型的预测准确率,调整超参数以获得更好的效果。

4. 模型使用

假设训练完成后,我们得到了最优参数 w^* 和 b^*。

如何使用训练好的模型:

  • 新文本的向量化:
    对于一个新文本,如“我 喜欢 电影”,首先根据之前的词汇表进行向量化:

    • 假设词汇表仍为 {"我","喜欢","讨厌","读书"}
    • “我”出现1次,“喜欢”出现1次,“讨厌”出现0次,“读书”出现0次,因此向量为:

    注意:新文本中的“电影”不在词汇表中,因此在简单词袋模型中会被忽略(这也是词袋模型的一个局限)。

  • 预测:
    将新文本的向量 vnew 代入逻辑回归模型,计算:

    然后通过 sigmoid 函数转换为概率:

    如果该概率大于某个阈值(例如0.5),则模型预测文本为正面情感;否则预测为负面情感。

总结

  1. 原理
    词袋模型将文本转换为不考虑词序的词频向量,通过这些向量来捕捉文本的内容信息。

  2. 过程

    • 构建词汇表
    • 将文本向量化
    • 利用标注数据训练分类模型(例如逻辑回归)
    • 评估和调整模型
  3. 使用
    训练好的模型可用于对新文本进行向量化和情感预测,进而进行分类任务。

这种方法虽然简单,但能有效展示如何从原始文本到数值表示,再到利用机器学习模型进行情感分类的全过程。

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

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

相关文章

【CS61A 2024秋】Python入门课,全过程记录P7(Week13 Macros至完结)【完结撒花!】

文章目录 关于新的问题更好的解决方案Week13Mon Macros阅读材料Lab 11: Programs as Data, MacrosQ1: WWSD: QuasiquoteQ2: If ProgramQ3: Exponential PowersQ4: Repeat Wed SQL阅读材料Disc 11: MacrosQ1: Mystery MacroQ2: Multiple AssignmentQ3: Switch Optional Contest:…

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中,可以通过Tomcat安装目录中“\bin\service.bat”来完成,如果目录中没有service.bat,则需要使用其它方法。 打到CMD命令行窗口,通过cd命令跳转到Tomcat安装目录的“\bin\”目录,然后执…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 (最好是安装最新的wps) 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时,前面板的外观和布局至关重要。良好的设计不仅提升用户体验,还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点: 1. 前面板设计原则 交互性:组合相关的输入控件和显示控件&#x…

使用开源项目xxl-cache构建多级缓存

xxl-cache简介 官网地址:https://www.xuxueli.com/xxl-cache/ 概述 XXL-CACHE 是一个 多级缓存框架,高效组合本地缓存和分布式缓存(RedisCaffeine),支持“多级缓存、一致性保障、TTL、Category隔离、防穿透”等能力;拥有“高性…

tenda路由器WriteFacMac存在远程命令执行漏洞(CVE-2024-10697)

一、漏洞简介 tenda路由器WriteFacMac存在远程命令执行漏洞 二、漏洞影响 tenda路由器三、网络测绘: fofa: title"Tenda | LOGIN"四、复现过程 POC 1 GET /goform/WriteFacMac?macls%20%3E/webroot/1.txt HTTP/1.1 Accept: text/html,application/…

mapbox进阶,添加绘图扩展插件,裁剪线

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…

react redux用法学习

参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 第一天 安装相关依赖: 使用redux的中间件: npm i react-redu…

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…

SpringBoot速成(九)获取用户信息 P9-P10

1.代码展示 P9 07&#xff1a;09&#xff1a;如何让Authorization直接保存 UserController: //获取用户信息GetMapping("/userInfo")public Result<User> userInfo(RequestHeader(name"Authorization") String token){//根据token得到usernameMap…

纪念日倒数日项目的实现-【纪念时刻-时光集】

纪念日/倒数日项目的实现## 一个练手的小项目&#xff0c;uniappnodemysql七牛云。 在如今快节奏的生活里&#xff0c;大家都忙忙碌碌&#xff0c;那些具有特殊意义的日子一不小心就容易被遗忘。今天&#xff0c;想给各位分享一个“纪念日”项目。 【纪念时刻-时光集】 一…

deepseek的CoT优势、两阶段训练的有效性学习笔记

文章目录 1 DeepSeek的CoT思维链的优势1.2 open-r1的CoT训练数据1.3 ReAct任务与CoT任务适用场景 2 AI推理方向&#xff1a;deepseek与deepmind的两条路线的差异2.1 PRM与ORM的两大学派分支的差异2.2 DeepSeek-R1的两阶段训练概述 1 DeepSeek的CoT思维链的优势 DeepSeek跟之前…

大语言模型实践——基于现有API的二次开发

基于现有的API平台做一些实用的AI小应用。 API服务商&#xff1a;阿里云百炼 云服务器&#xff1a;阿里云&#xff08;2核2GB&#xff09; 部署框架&#xff1a;gradio 调用框架&#xff1a;openai 语言&#xff1a;Python &#xff08;注&#xff1a;若搭建网站或API接口…

STM32 RTC 实时时钟说明

目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…

Node.js 中实现多任务下载的并发控制策略

1、背景与需求 在实际开发中&#xff0c;我们常常需要从多个源下载文件&#xff0c;例如从多个服务器下载图片、视频或音频文件。如果不加以控制&#xff0c;同时发起过多的下载任务可能会导致服务器过载&#xff0c;甚至引发网络拥堵。因此&#xff0c;合理控制并发数量是实现…

【2024 CSDN博客之星】技术洞察类:从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)

目录 一、引言 1.1 本篇文章侧重点 1.2 技术洞察—MoE&#xff08;Mixture-of-Experts&#xff0c;混合专家网络&#xff09; 二、MoE&#xff08;Mixture-of-Experts&#xff0c;混合专家网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场…

防火墙是什么?详解网络安全的关键守护者

当今信息化时代&#xff0c;企业和个人在享受数字生活带来的便利时&#xff0c;也不可避免地面对各种潜在的风险。防火墙作为网络安全体系中的核心组件&#xff0c;就像一道牢不可破的防线&#xff0c;保护着我们的数据和隐私不受外界威胁的侵害。那么防火墙是什么&#xff1f;…

DeepSeek模型架构及优化内容

DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计&#xff1a; 采⽤Pre-Norm结构&#xff0c;并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network&#xff08;FFN&#xff09;的激活函数&#xff0c;中间层维度为8/3. 去除绝对位置编码&#xff0c;采⽤了…

蓝桥杯---N字形变换(leetcode第6题)题解

文章目录 1.问题重述2.例子分析3.思路讲解4.代码分析 1.问题重述 这个题目可以是Z字形变换&#xff0c;也可以叫做N字形变换&#xff1a; 给定我们一串字符&#xff0c;我们需要把这串字符按照先往下写&#xff0c;再往右上方去写&#xff0c;再往下去写&#xff0c;再往右上…

LogicFlow自定义节点:矩形、HTML(vue3)

效果&#xff1a; LogicFlow 内部是基于MVVM模式进行开发的&#xff0c;分别使用preact和mobx来处理 view 和 model&#xff0c;所以当我们自定义节点的时候&#xff0c;需要为这个节点定义view和model。 参考官方文档&#xff1a;节点 | LogicFlow 1、自定义矩形节点 custo…