机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例

news2025/2/13 1:15:30

 为了简单直观的理解模型训练,我这里搜集了两个简单的实现文本情感分类的例子,第一个例子基于朴素贝叶斯分类器,第二个例子基于逻辑回归,通过这两个例子,掌握词袋模型(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.coloradmin.cn/o/2297092.html

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

相关文章

【Android开发】Android Studio汉化

前言 该插件是官方支持插件,未对任何软件进行修改和破解 Android Studio 是基于 IntelliJ IDEA 社区版开发的集成开发环境(IDE),专门用于Android应用程序的开发。以下是为什么 Android Studio 能使用 IntelliJ IDEA 插件的原因&am…

后端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&…

基于DeepSeek API和VSCode的自动化网页生成流程

1.创建API key 访问官网DeepSeek ,点击API开放平台。 在开放平台界面左侧点击API keys,进入API keys管理界面,点击创建API key按钮创建API key,名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…

信创领域的PostgreSQL管理员认证

信创产业,全称为信息技术应用创新产业,是中国为应对国际技术竞争、保障信息安全、实现科技自立而重点发展的战略性新兴产业。其核心目标是通过自主研发和生态构建,逐步替代国外信息技术产品,形成自主可控的国产化信息技术体系。 发…

使用 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. 操作流程 ① 另…

如何在 Elasticsearch 中设置向量搜索 - 第二部分

作者:来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇,深入探讨了向量搜索(也称为语义搜索)的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…

DeepSeek的出现会对百度有多大影响?

当DeepSeek与ChatGPT等大模型接管搜索入口,我们正见证百年一遇的信息革命。 01 传统搜索已死?AI助手正在重写游戏规则! 当DeepSeek与ChatGPT等大模型接管搜索入口,我们正见证百年一遇的信息革命。 就像汽车淘汰马车、触屏终结按键…

PyQt学习记录01——加法计算器

目录 PyQt学习记录01——加法计算器 PyQt学习记录02——串口助手 0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序,然后新建一个目录用于学习,其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力,请改为国内源 pip …

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意:有时可能因为网络或者版本问题下载不了,好像是默认下载最新版本,可选择手动安装! 方式二 手动安装插件 点击查看手…

02.11 数据库

1.思维导图 2.题目 将 epoll 服务器、客户端拿来用客户端:写一个界面,里面有注册登录服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正…

Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)

本篇文章会分基于DeepSeek开放平台上的API,以及本地私有化部署DeepSeek R1模型两种方式来整合使用。 本地化私有部署可以参考这篇博文 全面认识了解DeepSeek利用ollama在本地部署、使用和体验deepseek-r1大模型 Spring版本选择 根据Spring官网的描述 Spring AI是一…

苹果转型独立AR眼镜:一场技术与创新的深度探索

在科技日新月异的今天,增强现实(AR)技术正逐渐从科幻电影走进我们的日常生活。作为科技界的领头羊,苹果公司的每一步动向都备受关注。近期,苹果宣布暂停原定的Mac连接式AR眼镜计划,转而全力研发一款独立的AR眼镜。这一战略调整不仅反映了苹果对AR市场的深度洞察,也预示着…

Java小白入门基础知识(一)

1.初识Java java源程序通过javac 编译生成字节码文件,通过java命令运行java程序 总结: 1)在一个Java文件中,只能有一个public class 2)public class一定要和文件名一致 3)类里面包含方法 4&#xff09…

通过 Docker 安装和部署 KeyDB v6.3.4 的详细步骤

KeyDB 是一种高性能的开源内存数据库,最初是基于 Redis 项目开发的,但在性能、特性和功能上进行了许多增强和改进。它兼容 Redis 的大部分命令和数据结构,因此可以作为 Redis 的替代品使用,尤其是在需要更高性能和多线程支持的场景…

【JavaEE进阶】依赖注入 DI详解

目录 🌴什么是依赖注入 🎄依赖注入的三种方法 🚩属性注⼊(Field Injection) 🚩Setter注入 🚩构造方法注入 🚩三种注⼊的优缺点 🌳Autowired存在的问题 🌲解决Autowired存在的…

Avnet RFSoC基于maltab得5G 毫米波 开发工具箱

使用 MATLAB 连接到 AMD Zynq™ RFSoC 评估板。使用 RF 附加卡执行 OTA 测试。使用 HDL Coder 部署算法 版本要求: 大于 2023b 需要以下支持包之一: 适用于 Xilinx 基于 Zynq 的无线电(R2023b 及更早版本)的通信工具箱支持包适…

neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.

目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j,参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后,重新登录网页版neo4j,发现对应的数据库状态变…

Mac(m1)本地部署deepseek-R1模型

1. 下载安装ollama 直接下载软件,下载完成之后,安装即可,安装完成之后,命令行中可出现ollama命令 2. 在ollama官网查看需要下载的模型下载命令 1. 在官网查看deepseek对应的模型 2. 选择使用电脑配置的模型 3. copy 对应模型的安…